1

invalidateAndroidでカスタムビューを作成し始めたばかりなので、ビュー階層のペイント(描画)サイクル、およびViewメソッドとの効果的な使用に関するすべての事実をまだ学習していませんonDraw。しかし、私は不可解な行動に出くわしました。

私はRelativeLayoutクラスを拡張するカスタムビューグループを持っています。それが私の親の見解です。その中で、子供として、私はいくつかのカスタムの子ビューを持っています。時々、ユーザーのアクションに応じて、親と子の両方で、これらのビューのさまざまな部分を再描画する必要があります。

通常、これは一連のイベントです。invalidate(rct)子ビュークラス内から、更新する必要のある領域を区切るRectであるrctを呼び出すことにより、その小さな領域を無効にします。

不可解なことは、この非常にローカライズされたアクションが、真に過剰でグローバルな応答を引き起こすことです。LogCatトレース出力の証拠から、次のように思われます。

(1)親ビュー全体が完全に再描画されます

に続く:

(2)すべての子ビューは完全に再描画されます

確かに、応答(1)が発生した場合は、(2)が実際に続くはずです。これは、すべての子ビューが完全に再描画する必要があるためです。しかし、なぜ(1)がまったく起こらないのでしょうか。

これは、ビュー階層のペイントサイクルの通常の動作ですか?もしそうなら、それはとても間違っているようです! 代わりに、再描画する必要があるのは、親のごく一部だけで、再描画する子ビューでダーティとマークされた長方形の真下にあると予想していました。さらに、親のその小さな領域でさえ、上にある子がその領域で完全に不透明でない場合にのみ再描画する必要があります。

この一見無意味な大規模な再描画アクティビティの証拠は、各カスタムビューの各onDrawメソッド本体に、次のようなLogCatトレースステートメントがあることです

@Override
protected void onDraw(Canvas c) {
   Rect rct = new Rect();     
   Boolean doDraw = c.getClipBounds(rct);
   Log.v(LOGTAG, "onDraw Entry doDraw=" + doDraw + "  rct=" + rct);

   ....  
}

LogCat出力は、各onDraw呼び出しがビューの表面全体に対するものであることを明確にします。

4

0 に答える 0