今天面试遇到这个问题,回来第一时间写代码实现一下。
首先要确定的肯定是:
1、onDraw方法调用频率尽量低
2、textview的字符串移动的距离要适当
好啦,代码很简单,直接看效果:
代码:
package com.example.eventbus.mytextview;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.os.SystemClock;
import android.util.AttributeSet;
import android.view.View;
import java.util.Random;
/**
* Created by LHD on 2016/7/1.
*/
public class MyLogicView extends View {
private Paint paint = new Paint();
private float rx = 0;
private MyThread thread;
public MyLogicView(Context context) {
super(context);
}
public MyLogicView(Context context, AttributeSet attrs) {
super(context, attrs);
}
//为了绘制性能,应当尽量减少onDraw的调用频率
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);//这个方法不要省略,让父类做他想做的事情吧
paint.setTextSize(30);
canvas.drawText("LHDtextview", rx, 30, paint);
if (thread == null) {
thread = new MyThread();
thread.start();
}
}
class MyThread extends Thread {
Random random = new Random();
@Override
public void run() {
while (true) {
SystemClock.sleep(30);//防止循环过快看不到效果,加上一个延时
rx += 3;//为了减少循环次数,适当增加每次循环的坐标增量
if (rx > getWidth()) {//如果滚动到屏幕外面了
//让文字的头部从屏幕慢慢出来
//如果设置rx=0的话,文字会整个都显示出来,然后开始滚动
//paint.measureText用来测量字符串的宽度
rx = 0 - paint.measureText("LHDtextview");
}
int r = random.nextInt(256);//随机取0-255的整数
int g = random.nextInt(256);//随机取0-255的整数
int b = random.nextInt(256);//随机取0-255的整数
paint.setARGB(255, r, g, b);
postInvalidate();//在线程改变x坐标,然后通知调用onDraw方法
}
}
}
}
其实要注意的地方就两点:
1、onDraw方法频率不能过高,所以要适当的延时,如果不延时的话,由于频率过高,我们连文字的移动也看不到了。
2、每次坐标改变的值大一点可以减少重绘的次数。
3、为了性能,onDraw方法里不应当做过于复杂的绘制操作。
关于优化应用性能的问题,请参考我的笔记:
关于性能优化的笔记 - 秦时明月 - 博客频道 - CSDN.NET
http://blog.csdn.net/baidu_31093133/article/details/51794162