android自定义view的刷新

http://blog.csdn.net/ganlijianstyle/article/details/7490700



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);

               
           }}
   
}

}



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值