Android开发-自定义View-AndroidStudio(十九)HackView

原创 2017年01月03日 15:31:29
转载请注明出处: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



觉得博文有用,请点赞,请评论,请关注,谢谢!~

版权声明:本文为博主原创文章,如转载,请标明出处。

十九大心得--殷鉴

殷鉴   ————十九大心得学习报告 作为一个工科生的我似乎是不太具有一种对于政治的宏大格局,再说十九大的报告中,大致说了三个方面。一,已经取得的成就。二,现存的弊端。三,未来的任务。已经取得的...
  • renhaofan
  • renhaofan
  • 2017年12月10日 21:31
  • 380

学习十九大的总结

一、两次活动记录      1、化学与材料科学学院邀请廊坊市出席党的十九大代表李金来教授为师生做十九大精神宣讲报告      2、今天上午,中国近代史老师在课上进行十九大内容解读...
  • chenhaiming123
  • chenhaiming123
  • 2017年11月30日 20:21
  • 1066

Zynq-Linux移植学习笔记之19-启动加载与固化

1、  启动加载 启动时候自动执行shell脚本 Mount ramdisk,修改rootfs里面rcs文件   在RCS中添加代码 echo "++ Starting telnet daemo...
  • jj12345jj198999
  • jj12345jj198999
  • 2017年08月08日 22:11
  • 503

青春年华莫虚度

青春年华莫虚度,寄语公司年轻的同事们。 --------------------- 周六我面试了一名RF(射频)工程师。因为是朋友推荐,加之谭工、马工都认为基础不错,故而十分重视,用心去系统考察了...
  • FneDo
  • FneDo
  • 2014年06月17日 16:42
  • 954

白话空间统计十九:热点分析(中)

在前面的话:白话空间统计系列还继续更新,因为这段时间在对《使用R语言进行空间统计》系列进行翻译翻译和编写,所以白话空间统计系列和使用R语言进行空间统计可能会交替出现,给大家的阅读带来的不便,请大家谅解...
  • allenlu2008
  • allenlu2008
  • 2015年11月20日 08:39
  • 3323

Android开发-自定义View-AndroidStudio(四)简介动画

转载请注明出处:http://blog.csdn.net/iwanghang/绝对博文有用,请点赞,请留言,谢谢!~直接看GIF效果和代码:MainActivity.java:package com....
  • iwanghang
  • iwanghang
  • 2016年12月19日 13:55
  • 669

Android开发-自定义View-AndroidStudio(八)自定义View初体验

转载请注明出处:http://blog.csdn.net/iwanghang/article/details/53783417 觉得博文有用,请点赞,请评论,请关注,谢谢!~ 老规矩,先上效果图,看个...
  • iwanghang
  • iwanghang
  • 2016年12月21日 13:41
  • 445

Android开发-自定义View-AndroidStudio(二十)自定义View的基本小概念整理

转载请注明出处:http://blog.csdn.net/iwanghang/觉得博文有用,请点赞,请评论,请关注,谢谢!~本片博文是从网上收集整理得到,很遗憾没有搜索到原作者。本博文可以当作编写自定...
  • iwanghang
  • iwanghang
  • 2017年01月03日 16:48
  • 1001

Android开发-自定义View-AndroidStudio(十七)自定义水波纹(1)

转载请注明出处:http://blog.csdn.net/iwanghang/ 觉得博文有用,请点赞,请评论,请关注,谢谢!~ 老规矩,先上GIF动态图,看个效果,如果符合你的项目或者确定你要了解...
  • iwanghang
  • iwanghang
  • 2017年01月03日 10:16
  • 704

Android开发-自定义View-AndroidStudio(十八)自定义水波纹(2)

转载请注明出处:http://blog.csdn.net/iwanghang/ 觉得博文有用,请点赞,请评论,请关注,谢谢!~ 老规矩,先上GIF动态图,看个效果,如果符合你的项目或者确定你要了解...
  • iwanghang
  • iwanghang
  • 2017年01月03日 11:05
  • 876
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android开发-自定义View-AndroidStudio(十九)HackView
举报原因:
原因补充:

(最多只允许输入30个字)