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.本文只用于本人自身学习记录,如有侵权,请立即通知本人更改或删除