首页 > 代码库 > 自定义控件:瀑布流水字母
自定义控件:瀑布流水字母
1 <RelativeLayout 2 xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:tools="http://schemas.android.com/tools" 4 android:layout_width="match_parent" 5 android:layout_height="match_parent" 6 android:background="@android:color/background_light" 7 tools:context=".MainActivity" > 8 9 <TextView10 android:layout_width="wrap_content"11 android:layout_height="wrap_content"12 android:layout_centerHorizontal="true"13 android:text="@string/hello_world"14 android:textColor="@android:color/white" />15 16 <com.example.empire.HkTextGroup17 android:id="@+id/hk_text"18 android:layout_width="fill_parent"19 android:layout_height="fill_parent"20 android:layout_marginTop="20dp"21 android:background="@android:color/background_dark" />22 23 </RelativeLayout>
1 package com.example.empire; 2 3 import android.content.Context; 4 import android.graphics.Canvas; 5 import android.graphics.Color; 6 import android.graphics.Paint; 7 import android.graphics.Paint.Align; 8 import android.graphics.Paint.Style; 9 import android.os.Handler; 10 import android.util.AttributeSet; 11 import android.view.View; 12 13 public class HkTextGroup extends View { 14 15 private char[] counts = new char[] { 16 ‘A‘, ‘B‘, ‘C‘, ‘D‘, ‘E‘, ‘F‘, ‘G‘, 17 ‘H‘, ‘J‘, ‘K‘, ‘L‘, ‘M‘, ‘N‘, ‘O‘ }; 18 19 private Paint paint; 20 private Context ctx; 21 private Cell[][] cells; 22 // 像素值 23 private int textSize = 20; 24 25 public HkTextGroup(Context context, AttributeSet attrs) { 26 super(context, attrs); 27 ctx = context; 28 init(); 29 } 30 31 private void init() { 32 paint = new Paint(); 33 paint.setAntiAlias(true); 34 paint.setColor(Color.WHITE); 35 paint.setTextSize(textSize);// PX值 36 paint.setTextAlign(Align.LEFT); 37 paint.setStyle(Style.FILL); 38 39 cells = new Cell[list][row]; 40 for (int j = 0; j < list; j++) { 41 for (int i = 0; i < row; i++) { 42 cells[j][i] = new Cell(i, j); 43 cells[j][i].alpha = 0; 44 cells[j][i].msg = "" 45 + counts[(int) (Math.random() * counts.length)]; 46 } 47 } 48 } 49 50 @Override 51 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 52 super.onMeasure(widthMeasureSpec, heightMeasureSpec); 53 Utils.logleo("getWidth()::" + getWidth()); 54 Utils.logleo("getHeight()::" + getHeight()); 55 56 textSize = getWidth() / 10; 57 left_bottom = getHeight(); 58 } 59 60 public float left; 61 public float left_bottom; 62 63 private Handler handler = new Handler() { 64 public void handleMessage(android.os.Message msg) { 65 int flag = msg.what;// 0 -- 10 66 67 for (int j = 0; j < list; j++) { 68 69 for (int i = row - 1; i >= 0; i--) { 70 // 1、如果第一行透明度为0,则有一定机率变为255 71 // 2、如果中间行透明度为0,不做处理 72 // 3、中间行不为0,依次减少一个梯度 73 // 4、我上面的一个是255,那么我也是255,而他亮度减1 74 Cell cell = cells[j][i]; 75 76 if (i == 0) { 77 if (cell.alpha == 0) { 78 if (Math.random() * 10 > 9) { 79 cell.alpha = 255; 80 } 81 } else { 82 cell.alpha = cell.alpha - 25 > 0 ? cell.alpha - 25 83 : 0; 84 } 85 } else if (i > 0 && i <= row - 1) { 86 if (cells[j][i - 1].alpha == 255) { 87 cell.alpha = 255; 88 } else { 89 cell.alpha = cell.alpha - 25 > 0 ? cell.alpha - 25 90 : 0; 91 } 92 } 93 } 94 } 95 invalidate(); 96 97 }; 98 }; 99 100 private int seed = 0;101 private int stepCount = 11;102 /** 行 */103 private int row = 20;104 /** 列 */105 private int list = 20;106 107 @Override108 protected void onDraw(Canvas canvas) {109 110 for (int j = 0; j < list; j++) {111 for (int i = 0; i < row; i++) {112 Cell cell = cells[j][i];113 // 小机率事件,改变内容114 if (Math.random() * 100 > 85) {115 cell.msg = ""116 + counts[(int) (Math.random() * counts.length)];117 }118 // 根据透明度确定颜色119 if (cell.alpha == 255) {120 paint.setColor(Color.WHITE);121 } else {122 paint.setColor(Color.GREEN);123 }124 // 设置透明度125 paint.setAlpha(cell.alpha);126 127 // 绘制128 if (cell.alpha != 0) {129 canvas.drawText(cell.msg, cell.j * 15, (float) (cell.i130 * textSize * 0.6 + textSize), paint);131 }132 }133 }134 135 // seed = (seed + 1) % stepCount;136 handler.sendEmptyMessageDelayed(seed, 10);137 }138 139 private class Cell {140 public Cell(int i, int j) {141 super();142 this.i = i;143 this.j = j;144 }145 146 /** 行 */147 public int i;148 /** 列 */149 public int j;150 /** 种子 */151 public int seed;152 /** 透明度 */153 public int alpha;154 public String msg;155 156 }157 158 }
1 package com.example.empire; 2 3 import android.content.Context; 4 import android.graphics.Canvas; 5 import android.graphics.Color; 6 import android.graphics.Paint; 7 import android.graphics.Paint.Align; 8 import android.graphics.Paint.Style; 9 import android.os.Handler; 10 import android.util.AttributeSet; 11 import android.view.View; 12 13 public class HkText extends View { 14 15 private char[] counts = new char[] { 16 ‘A‘, ‘B‘, ‘C‘, ‘D‘, ‘E‘, ‘F‘, ‘G‘, 17 ‘H‘, ‘J‘, ‘K‘, ‘L‘, ‘M‘, ‘N‘, ‘O‘ }; 18 19 private Paint paint; 20 private Context ctx; 21 22 public HkText(Context context, AttributeSet attrs) { 23 super(context, attrs); 24 ctx = context; 25 init(); 26 } 27 28 /** 29 * 像素值 30 */ 31 private int textSize = 20; 32 33 private void init() { 34 paint = new Paint(); 35 paint.setAntiAlias(true); 36 paint.setColor(Color.WHITE); 37 paint.setTextSize(textSize);// PX值 38 paint.setTextAlign(Align.LEFT); 40 paint.setStyle(Style.FILL); 41 } 42 43 // private float sp2px(int sp){ 44 // TypedValue.applyDimension( 45 // TypedValue.COMPLEX_UNIT_SP, sp, ctx.getResources().getDisplayMetrics()); 46 // 47 // float px = sp * ctx.getResources().getDisplayMetrics().scaledDensity; 48 // return px; 49 // } 50 // 51 // private float px2sp(int px){ 52 // float sp = px / ctx.getResources().getDisplayMetrics().scaledDensity; 53 // return sp; 54 // } 55 56 @Override 57 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 58 super.onMeasure(widthMeasureSpec, heightMeasureSpec); 59 Utils.logleo("getWidth()::" + getWidth()); 60 Utils.logleo("getHeight()::" + getHeight()); 61 62 textSize = getWidth() / 10; 63 } 64 65 public float left = 150; 66 public float left_bottom = 200; 67 68 private Handler handler = new Handler() { 69 public void handleMessage(android.os.Message msg) { 70 // int flag = msg.what;// 0 -- 10 72 // paint.setColor(Color.BLUE); 73 invalidate(); 74 }; 75 }; 76 77 private int seed = 0; 79 private int stepCount = 11; 80 81 @Override 82 protected void onDraw(Canvas canvas) { 84 left = 10; 85 left_bottom = 400; 86 for (int i = 0; i < 20; i++) { 87 88 int seed_tem = seed; 89 90 int alpha = 255 - (i + seed_tem) * 25; 91 paint.setAlpha(alpha);// 0是没有 92 93 canvas.drawText(counts, i % counts.length, 1, left,
left_bottom,paint); 96 left_bottom = (float) (left_bottom - textSize * 0.6); 98 } 99 seed = (seed + 1) % stepCount;100 handler.sendEmptyMessageDelayed(seed, 500);101 }102 103 }
1 package com.example.empire; 3 import android.util.Log; 4 5 public class Utils { 7 public static boolean isShow = true; 9 public static void logleo(String msg) {10 if (isShow) {11 Log.i("leo", msg);12 }13 }14 }
DEMO下载地址:http://pan.baidu.com/s/1mgkfQh6
自定义控件:瀑布流水字母
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。