2011-06-08 11 views
1

私はAndroidのサンプルコードでLunarLander例を勉強していますを使用していないようです:http://developer.android.com/resources/samples/LunarLander/index.htmlアンドロイド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); 
      } 
     } 
    } 
} 

自体を描画するには、常に

+0

...あなたは、2Dグラフィックスを行うスレッドから呼び出され、これにより、ウィンドウやイベントを再描画制御ビューの無効化とAndroidに建てられたバイパスすべきか? – pitosalas

+0

それほど複雑ではないレイアウトの無効化が本当に遅くなるので、バイパスする必要があります。これは、いつ、何を再描画するかを制御する可能性を与えます。いくつかのエントリーポイントが必要な場合は、私のチュートリアルの第2d図のシリーズから始めてください:http://www.droidnova.com/2d-tutorial-series – WarrenFaith