android中View的实时刷新

来源:互联网 发布:打击网络大v 编辑:程序博客网 时间:2024/06/01 11:08

昨天在做一个界面时,想在用户touch屏幕之后先绘图一下,待逻辑处理完毕,再绘制最后的图,查看View的重绘方法,得知是invalidate()函数,于是在代码中这么写道:

 

view plaincopy to clipboardprint?
  1. public class PuzzleView extends View {  
  2.     @Override  
  3.     protected void onDraw(Canvas canvas) {  
  4.      ...  
  5.     }  
  6.   
  7.     @Override  
  8.     public boolean onTouchEvent(MotionEvent event) {  
  9.       invalidate();  
  10.       //处理逻辑  
  11.       invalidate();  
  12.    }  
  13. }  

 

  写完,运行,oh,my god,只有第二次invalidate做了,第一次打酱油去了,翻资料,翻啊翻,看到Invalidate()的描述是这样的:当调用线程处于空闲状态时,会调用onDraw,刷新界面,也就是说,该函数仅是标记当前界面过期,并不直接负责刷新界面,奶奶的,不刷。。。继续翻啊翻,看到SurfaceView 能实现实时刷新,代码结构如下:

 

view plaincopy to clipboardprint?
  1. public class PuzzleView extends SurfaceView implements SurfaceHolder.Callback{  
  2.     private SurfaceHolder surfaceHolder;  
  3.   
  4.     public PuzzleView(Context context){  
  5.       //....  
  6.       surfaceHolder = this.getHolder();//获取holder     
  7.       surfaceHolder.addCallback(this);  
  8.     }  
  9.   
  10.     protected void paint(Canvas canvas) {  
  11.       //这里的代码跟继承View时OnDraw中一样  
  12.     }  
  13.   
  14.     public void repaint() {   
  15.        Canvas c = null;   
  16.        try {   
  17.          c = surfaceHolder.lockCanvas();   
  18.          paint(c);   
  19.        } finally {   
  20.          if (c != null) {   
  21.            surfaceHolder.unlockCanvasAndPost(c);   
  22.          }   
  23.        }   
  24.     }   
  25. }  

 

好了,这样写好后,只要在以前调用invalidate()的地方调用repaint()就OK了~