textview实现跑马灯效果

今天面试遇到这个问题,回来第一时间写代码实现一下。

首先要确定的肯定是:
1、onDraw方法调用频率尽量低
2、textview的字符串移动的距离要适当

好啦,代码很简单,直接看效果:

textview实现跑马灯效果_第1张图片

代码:

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

你可能感兴趣的:(textview)