Android学习(19)View的重绘机制

Android学习(19)View的重绘机制

View的重绘机制:

  • 在Android中,View的重绘可以通过invalidate和Postinvalidate实现
  • 每次重绘都会调用一次onDraw方法
  • Invalidate:在UI线程自身中使用
  • Postinvalidate:在非UI线程中使用

1.利用View的重绘机制实现绘图从上往下移动

(1)定义一个类MyView.java,继承View类

public class MyView extends View {

    //定义画笔
    private Paint paint = new Paint();
    //左边界距左的位置
    private float x = 0;
    //上边界距上的位置
    private float y = 0;
    //右边界距左的位置
    private float speedx = 200;
    //下边界距右的位置
    private float speedy = 200;
    //timer变化时坐标累加的值
    private float addy = 20;
    //定义一个计时器timer
    private Timer timer;
    //定义一个计时器任务task
    private TimerTask task;


    public MyView(Context context) {
        super(context);
        //设置画笔属性
        paint.setColor(Color.RED);
    }

    //开始绘制图形
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //画矩形
        canvas.drawRect(x,y,speedx + x,speedy + y,paint);
        //上边距y每次增加,下边距speedy也要增加相应的值
        y += addy;
    }

    //启动timer
    public void startTimer(){
        //实现timer
        timer = new Timer();
        task = new TimerTask() {
            @Override
            public void run() {
                //每次timer运行,就发送一次消息
                handler.sendEmptyMessage(0);
            }
        };
        //让timer一直执行,1秒后执行,每0.1秒执行一次
        timer.schedule(task,1000,100);
    }
    //停止timer
    public void stopTimer() {
        timer.cancel();
    }
    //实例化一个线程handler
    private Handler handler = new Handler() {
        @Override
        //handler没接收一次消息就重绘一次
        public void handleMessage(Message msg) {
            //重绘
            invalidate();
        }
    };
}

(2)在ViewActivity.java中实例化MyView类,并显示View

public class ViewActivity extends AppCompatActivity {

    private MyView view;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        view = new MyView(this);
        setContentView(view);
    }
    //进入程序时开启timer
    @Override
    protected void onResume() {
        super.onResume();
        view.startTimer();
    }
    //退出程序时停止timer
    @Override
    protected void onStop() {
        super.onStop();
        view.stopTimer();
    }
}

这里写图片描述

2.实现当图形碰到边界会反弹

(1)在MyView.java中绘图

public class MyView2 extends View implements View.OnClickListener{

    private float x=0;
    private float y=0;
    private float speedx = 50;
    private float speedy = 50;
    private float addx = 20;
    private float addy = 20;
    private Paint paint = new Paint();
    private boolean flag = false;

    public MyView2(Context context) {
        super(context);
        //画笔属性
        paint.setColor(Color.RED);
        //给View设置监听
        setOnClickListener(this);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawRect(x,y,speedx + x,speedy + y,paint);
        //四边边距都增加相应的值
        x += addx;
        y += addy;

        //判断是否碰到边界
        if (x <0) {
            addx = Math.abs(addx);
        }
        if (y<0) {
            addy = Math.abs(addy);
        }
        if (x > getWidth() - speedx) {
            addx = -Math.abs(addx);
        }
        if (y > getHeight() - speedy) {
            addy = -Math.abs(addy);
        }
    }
    //用handler发送消息
    private Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            //重绘
            invalidate();
            //每隔0.02秒发送一次消息,执行一次重绘
            handler.sendEmptyMessageDelayed(0,20);
        }
    };

    public  void start(){
        if (!flag) {
            handler.sendEmptyMessage(0);
            flag = true;
        }
    }

    public  void stop(){
        if (flag) {
            handler.removeMessages(0);
            flag = false;
        }
    }
    //给View做监听,点击屏幕停止或者开始
    @Override
    public void onClick(View v) {
        if (flag){
            stop();
        }else {
            start();
        }
    }

    public boolean isFlag() {
        return flag;
    }

    public void setFlag(boolean flag) {
        this.flag = flag;
    }
}

(2)在Activity中配置View

public class View2Activity extends AppCompatActivity {

    private MyView2 view;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        view = new MyView2(this);
        setContentView(view);
    }

    @Override
    protected void onResume() {
        super.onResume();
        view.start();
    }

    @Override
    protected void onStop() {
        super.onStop();
        view.stop();
    }
}

这里写图片描述


声明:
1.知识点来源于《网易云课堂》——《Android基础视频教程》
2.本文只用于本人自身学习记录,如有侵权,请立即通知本人更改或删除

猜你喜欢

转载自blog.csdn.net/qq_40740256/article/details/82588021
今日推荐