转载请注明出处:
http://blog.csdn.net/iwanghang/article/details/53994833
觉得博文有用,请点赞,请评论,请关注,谢谢!~
老规矩,先上GIF动态图,看个效果,如果符合你的项目或者确定你要了解的内容,再往下看吧:
在list为20以内看出来BUG,实际上计算算法有问题,先备注一下,以后改善吧。BUG就是第二张GIF可以看出来右边距比较大。
MainActivity.java:
转载请注明出处: http://blog.csdn.net/iwanghang/article/details/53994833
觉得博文有用,请点赞,请评论,请关注,谢谢!~
觉得博文有用,请点赞,请评论,请关注,谢谢!~
老规矩,先上GIF动态图,看个效果,如果符合你的项目或者确定你要了解的内容,再往下看吧:
在list为20以内看出来BUG,实际上计算算法有问题,先备注一下,以后改善吧。BUG就是第二张GIF可以看出来右边距比较大。
private int list = 20; // 列
private int list = 100; // 列
MainActivity.java:
package com.iwanghang.hackview;
import android.app.Activity;
import android.os.Bundle;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
HkTextGroup.java:
package com.iwanghang.hackview;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Align;
import android.graphics.Paint.Style;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.view.View;
public class HkTextGroup extends View {
// private char[] counts = new char[] { 'A', 'B', 'C', 'D', 'E', 'F', 'G',
// 'H', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U'
// , 'V', 'W', 'X', 'Y', 'Z'};
private char[] counts = new char[] { '0', '1'};
private int row; // 行
private int list = 100; // 列
private Paint paint;
private Word[][] words;
private int textSize;
public HkTextGroup(Context context, AttributeSet attrs) {
super(context, attrs);
}
private void init() {
paint = new Paint();
paint.setAntiAlias(true); // 抗锯齿
paint.setTextSize(textSize);// PX值
System.out.println("init textSize = " + textSize);
words = new Word[list][row];
for (int j = 0; j < list; j++) {
for (int i = 0; i < row; i++) {
words[j][i] = new Word(i, j);
words[j][i].alpha = 0;
words[j][i].msg = ""
+ counts[(int) (Math.random() * counts.length)];
}
}
}
// 1、先测量控件的宽高
// 从而计算字体大小
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
System.out.println("onMeasure in" );
System.out.println("onMeasure getWidth() = " + getWidth());
System.out.println("onMeasure getHeight() = " + getHeight());
textSize = getWidth() / list; // 控件宽度 / 列数 = 字体大小
System.out.println("onMeasure textSize = " + textSize);
if (textSize != 0){
row = getHeight()/ textSize;
System.out.println("onMeasure row = " + row);
}
System.out.println("onMeasure out" );
init();
}
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
for (int j = 0; j < list; j++) {
for (int i = row - 1; i >= 0; i--) {
// 1、如果第一行透明度为0,则有一定机率变为255
// 2、如果中间行透明度为0,不做处理
// 3、中间行不为0,依次减少一个梯度
// 4、我上面的一个是255,那么我也是255,而他亮度减1
Word word = words[j][i];
if (i == 0) {
if (word.alpha == 0) {
if (Math.random() * 10 > 9) {
word.alpha = 255;
}
} else {
word.alpha = word.alpha - 25 > 0 ? word.alpha - 25
: 0;
}
} else if (i > 0 && i <= row - 1) {
if (words[j][i - 1].alpha == 255) {
word.alpha = 255;
} else {
word.alpha = word.alpha - 25 > 0 ? word.alpha - 25
: 0;
}
}
}
}
invalidate(); // onDraw();
}
};
@Override
protected void onDraw(Canvas canvas) {
for (int j = 0; j < list; j++) {
for (int i = 0; i < row; i++) {
Word word = words[j][i];
// 小机率事件,改变内容
if (Math.random() * 100 > 85) {
word.msg = ""
+ counts[(int) (Math.random() * counts.length)];
}
// 根据透明度确定颜色
if (word.alpha == 255) {
paint.setColor(Color.WHITE);
} else {
paint.setColor(Color.GREEN);
}
// 设置透明度
paint.setAlpha(word.alpha);
// 绘制
if (word.alpha != 0) {
/**
* text:要绘制的文字
* x:绘制原点x坐标
* y:绘制原点y坐标
* paint:用来做画的画笔
* public void drawText(String text, float x, float y, Paint paint)
*/
canvas.drawText(word.msg, (float)(word.j * textSize + textSize * 0.25), (float) (word.i
* textSize + textSize), paint);
}
}
}
handler.sendEmptyMessageDelayed(0, 200); // 每次重绘后,等待200毫秒,给handler发消息
}
private class Word {
public Word(int i, int j) {
super();
this.i = i;
this.j = j;
}
/** 行 */
public int i;
/** 列 */
public int j;
/** 透明度 */
public int alpha;
public String msg;
}
}
activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.iwanghang.hackview.MainActivity">
<com.iwanghang.hackview.HkTextGroup
android:id="@+id/hk_text"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/background_dark" />
</RelativeLayout>
转载请注明出处: http://blog.csdn.net/iwanghang/article/details/53994833
欢迎移动开发爱好者交流
沈阳或周边城市公司有意开发Android,请与我联系
联系方式
微信:iwanghang
QQ:413711276
邮箱:iwanghang@qq.com
沈阳或周边城市公司有意开发Android,请与我联系
联系方式
微信:iwanghang
QQ:413711276
邮箱:iwanghang@qq.com
觉得博文有用,请点赞,请评论,请关注,谢谢!~