postInvalidate() ,Invalidate() 区别
postInvalidate() 用在子线程向UI线程发送界面刷新消息请求,
invalidate()调用直接在UI线程刷新界面。
第1种情况 postInvalidate();
package com.ganstyle.activity;import android.R;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.util.Log;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Switch;
public class GameView extends View{
private Paint paint=null;
private int x;
public GameView(Context context) {
super(context);
paint = new Paint();
paint.setColor(Color.GREEN);
paint.setStyle(Style.STROKE);
Log.i("GameView", String.valueOf(Thread.currentThread().getId()));
this.setFocusable(true);
// TODO Auto-generated constructor stub
// Bitmap bitmap= BitmapFactory.decodeResource(getResources(), R.drawable.ic_lock_silent_mode);
}
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
canvas.drawLine(0,0,400, 0, paint);
canvas.drawLine(x,0,x, 400, paint);
Log.i("onDraw", String.valueOf(Thread.currentThread().getId()));
}
MyThread t=null;
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// while (x<300)
// {
// x++;
// GameView.this.postInvalidate();
// } 执行这个方法不会在主线程重绘,因为onKeyDown 在主线执行,
// 由于循环时间过长,主线不会进重绘,所以要另一个线程 MyThread T 线程执行循环,
switch (keyCode){
case KeyEvent.KEYCODE_DPAD_CENTER:
if(t==null||x<300)
{
t= new MyThread();
t.start();
}System.out.println("GameView "+ keyCode );
//设置返回键生效
case KeyEvent.KEYCODE_BACK:
return super.onKeyDown(keyCode, event);
default :
break;
}
// return super.onKeyDown(keyCode, event);
return true; //设置为true,表示不向下面的组件或View传递
}
@Override
public boolean onTouchEvent(MotionEvent event) {
//event.getAction 得到三种事件 0 代表获得焦点、1代表离开屏幕、2代表按着屏幕
System.out.println("GameView "+ event.getX()+" "+event.getY()+" event type "+event.getAction());
x =(int) event.getX();
//return super.onTouchEvent(event);
return true; //设置为true,表示不向下面的组件或View传递
}
private class MyThread extends Thread{
@Override
public void run() {
// TODO Auto-generated method stub
while (x<300)
{
x++;
try {
Thread.sleep(200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Log.i("MyThread", String.valueOf(Thread.currentThread().getId()));
GameView.this.postInvalidate();
}}
}
}
第2种情况 invalidate(); 根据handler 收到的消息,对界面进行重绘
package com.ganstyle.activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
public class HandleGameView extends View{
private Paint paint=null;
private int x;
private Handler handler = new Handler()
{
};@Override
public void handleMessage(Message msg) {
if(msg.what == 1)
{
invalidate();
}
Log.i("Handler", String.valueOf(Thread.currentThread().getId()));
}
public HandleGameView(Context context) {
super(context);
paint = new Paint();
paint.setColor(Color.GREEN);
paint.setStyle(Style.STROKE);
this.setFocusable(true);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawLine(0,0,400, 0, paint);
canvas.drawLine(x,0,x, 400, paint);
Log.i("onDraw", String.valueOf(Thread.currentThread().getId()));
}
MyThread t=null;
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// while (x<300)
// {
// x++;
// GameView.this.postInvalidate();
// } 执行这个不会在主线程重绘
switch (keyCode){
case KeyEvent.KEYCODE_DPAD_CENTER:
if(t==null||x<300)
{
t= new MyThread();
t.start();
}System.out.println("GameView "+ keyCode );
//设置 返回键 生效
case KeyEvent.KEYCODE_BACK:
return super.onKeyDown(keyCode, event);
default :
break;
}
// return super.onKeyDown(keyCode, event);
return true; //设置为true,表示不向下面的组件或View传递
}
@Override
public boolean onTouchEvent(MotionEvent event) {
//event.getAction 得到三种事件 0 代表获得焦点、1代表离开屏幕、2代表按着屏幕
System.out.println("GameView "+ event.getX()+" "+event.getY()+" event type "+event.getAction());
Log.i("onTouchEvent", String.valueOf(Thread.currentThread().getId()));
x =(int) event.getX();
//return super.onTouchEvent(event);
return true; //设置为true,表示不向下面的组件或View传递
}
private class MyThread extends Thread{
@Override
public void run() {
// TODO Auto-generated method stub
while (x<300)
{
x++;
try {
Thread.sleep(200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Log.i("MyThread", String.valueOf(Thread.currentThread().getId()));
Message message = new Message();
message.what = 1;
handler.sendMessage(message);
}}
}
}