2011-06-08 23 views
1

我學習在Android示例代碼LunarLander例如:http://developer.android.com/resources/samples/LunarLander/index.html的Android LunarLander例子似乎並沒有使用「無效」

我百思不得其解,因爲評論中,代碼使用「無效」,以觸發幾個地方說重繪。但是我在代碼中找不到它。

更重要的是,我認爲繪圖應該總是在View的onDraw中發生,而不是在線程的其他地方內聯。

有沒有人研究過這個例子,並且爲什麼invalidate()沒有被調用呢?

感謝您分享您的見解!

- 皮託

回答

3

它不是在一個線程內聯,而是從一個線程調用。

@Override 
public void run() { 
    while (mRun) { 
     Canvas c = null; 
     try { 
      c = mSurfaceHolder.lockCanvas(null); 
      synchronized (mSurfaceHolder) { 
       if (mMode == STATE_RUNNING) updatePhysics(); 
       doDraw(c); 
      } 
     } finally { 
      // do this in a finally so that if an exception is thrown 
      // during the above, we don't leave the Surface in an 
      // inconsistent state 
      if (c != null) { 
       mSurfaceHolder.unlockCanvasAndPost(c); 
      } 
     } 
    } 
} 

圖紙本身應始終從當你做2D圖形一個線程調用......

+0

,從而繞過內置的窗口和視圖失效和Android控制重繪事件? – pitosalas 2011-06-09 18:07:59

+0

它應該被忽略,因爲即使是一個不太複雜的佈局的無效可能會很慢。它使您可以控制什麼以及何時重繪。如果您需要一些入門點,請從我的教程系列開始,瞭解2D繪圖:http://www.droidnova.com/2d-tutorial-series – WarrenFaith 2011-06-09 18:51:15