您的位置:首页 > 其它

自定义view 实现跑马灯效果

2016-01-24 14:45 288 查看
自定位View的广泛使用,使得我们程序更多的充满了可变性,灵活性。这个跑马灯效果是通过线程,给予自定义View一些简单的动态效果。中间我会简单的提及到一些小的知识点,比如ARGB的运用,获取字符串长度等。先创建一个class  文件使他继承View,然后定义一些变量,MyViewThread 是待会定义的一个类继承与Thread

float rx是跑马灯文字的X坐标,他的移动距离增加也代表跑马灯的移速。

Random rand 是等会会使用的颜色变化值,稍后会详细介绍

Paint paint 是创建的画笔

 public class MyView extends View{

    private MyViewThread thread;

    private float rx=0;

    Random rand=new Random();

    Paint paint=new Paint();

右键source 点击 General constructor from superclass,选择select all,让他自动生成。

前面2和是自定义属性使用,这个简单的马炮等效果没做那么复杂,所以没有去设置,如果想自定义速度、颜色之类的可以自己去宽展。

后面的才是必须的,这个可以让自己在xml文件中把这个View当做控件进行添加。这3兄弟我一般是一起添加。

    public MyView(Context context, AttributeSet attrs, int defStyleAttr) {

        super(context, attrs, defStyleAttr);

    }

    public MyView(Context context, AttributeSet attrs) {

        super(context, attrs);

    }

    public MyView(Context context) {

        super(context);

    }

重写onDraw方法,先判断是否有线程,没有的话创建线程,当线程开始后设置画笔大小,创建Text,参数分别,String,X坐标,Y坐标,画笔。  

    @Override

    protected void onDraw(Canvas canvas) {

        if (thread==null) {

            thread=new MyViewThread();

            thread.start();

        }else {

            paint.setTextSize(50);

            canvas.drawText("跑马灯效果", rx, 300, paint);

        }

    } 

  然后创建一个线程,我们将在线程里面的更新进行跑马灯的判断,移动和UI的更新。在while循环中,rx代表文字的X坐标,他的+=与Thread.sleep(30)相承接,线程睡眠代表着X轴移动的触发平率,当前是0.3秒
X周移动3的距离(在xml生成以后系统会直接把dp转化为px单位,根据个每个160dpi的屏幕,1dp=1pxdip,320dps,1dp=2pxdip)

if (rx>getWidth()) {rx=0 - paint.measureText("Myview");} 是当rx大于当前View的布局,我们将获取“跑马灯效果”这段字体

的长度作为偏移量加到rx=0的时候,使他像是从来从头开始的效果。我们又给画笔设置不断变化的颜色使他显示出跑马灯的效果。

paint.setARGB(255, r, g, b);ARGB中a代表alpha 透明度,R代表Red 红色,G代表Green绿色,B代表Bule蓝色。遵循16进制原则

    0-256。

    postInvalidate();是主线程更新UI的方法。

class MyViewThread extends Thread{

        @Override

        public void run() {

            // TODO Auto-generated method stub

            while (true) {

                rx+=3;

                if (rx>getWidth()) {

                    rx=0 - paint.measureText("跑马灯效果");

                }

                int r=rand.nextInt(200)+56;

                int g=rand.nextInt(200)+56;

                int b=rand.nextInt(200)+56;

                paint.setARGB(255, r, g, b);

                postInvalidate();

                try {

                    Thread.sleep(30);

                } catch (InterruptedException e) {

                    // TODO Auto-generated catch block

                    e.printStackTrace();

                }

            }

        }

    }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  自定义view