10

Androidinvalidate (Rect dirty)は、キャンバスの一部のみを無効にするために使用されるを本当に嫌っているようです。キャンバスの一部(下に緑色で表示)を無効にし、同時にキャンバスのToggleButton 外側を再描画する必要がある場合、赤色で表示されている領域全体が消去されます。リージョンの1つが、無効にしているキャンバスのビューの外側にある場合でも、Androidは、再描画が必要な2つのリージョンの結合を含む最小の長方形内のすべてを無効にしているようです。

これは標準的な動作ですか?もしそうなら、なぜ誰かが部分的な無効化を使用するのでしょうか?

ここに画像の説明を入力してください

4

2 に答える 2

16

Android には というクラスがありViewRootImplます。このクラスは、画面に表示されるすべてのウィンドウによって所有されます (ウィンドウという用語はここでは少し紛らわしいため、この説明では、ウィンドウは上部にダイアログやポップアップがないメイン アクティビティのレイアウトです)。このレイアウトは常にトラバースされています。つまり、Android はこのウィンドウのダーティな四角形を取得して描画するのを待っているだけです。このウィンドウには多くのビュー (ボタンなど) が含まれている可能性があるため、すべてのビューを調べて、それぞれに再描画が必要かどうかを尋ねます。各ビューはダーティな四角形を返し、ViewRootImplこれらすべての四角形は 1 つの大きな四角形に結合され、最終的に再描画されます。

なぜそれをするのですか?さて、 は描画するものをViewRootImpl求めます。これは、トラバーサルがあるたびに、1 つのウィンドウ内のすべてのビューが実際に を共有することを意味します。WindowManagerServiceCanvasCanvas

あなたの質問に関しては、特定の 1 つViewだけがダーティな四角形を持っていた場合、そのダーティな四角形だけが描画されますが、別のビューにもダーティな四角形があったため、ダーティな四角形には両方が含まれています。

于 2013-04-24T15:50:17.660 に答える