Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 初級開發 >> Android開發教程之 view刷新

Android開發教程之 view刷新

編輯:初級開發

android中對VIEw的更新有很多種方式,使用時要區分不同的應用場合。我感覺最要緊的是分清:多線程和雙緩沖的使用情況。 

1.不使用多線程和雙緩沖 

     這種情況最簡單了,一般只是希望在View發生改變時對UI進行重繪。你只需在Activity中顯式地調用View對象中的invalidate()方法即可。系統會自動調用 VIEw的onDraw()方法。 

2.使用多線程和不使用雙緩沖 

     這種情況需要開啟新的線程,新開的線程就不好訪問VIEw對象了。強行訪問的話會報:android.view.ViewRoot$CalledFromWrongThreadException:Only the original thread that created a view hierarchy can touch its vIEws. 

     這時候你需要創建一個繼承了android.os.Handler的子類,並重寫handleMessage(Message msg)方法。android.os.Handler是能發送和處理消息的,你需要在Activity中發出更新UI的消息,然後再你的Handler(可以使用匿名內部類)中處理消息(因為匿名內部類可以訪問父類變量, 你可以直接調用VIEw對象中的invalidate()方法 )。也就是說:在新線程創建並發送一個Message,然後再主線程中捕獲、處理該消息。 

3.使用多線程和雙緩沖 

    Android中SurfaceView是VIEw的子類,她同時也實現了雙緩沖。你可以定義一個她的子類並實現SurfaceHolder.Callback接口。由於實現SurfaceHolder.Callback接口,新線程就不需要android.os.Handler幫忙了。SurfaceHolder中lockCanvas()方法可以鎖定畫布,繪制玩新的圖像後調用unlockCanvasAndPost(canvas)解鎖(顯示),還是比較方便得。 

。invalidate()函數重繪

  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. }  
復制代碼

當調用線程處於空閒狀態時,會調用onDraw,刷新界面,也就是說,該函數僅是標記當前界面過期,並不直接負責刷新界面()

  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.     }    
     
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved