Android のビュー階層がどのように機能するかを理解しようとすることのみを目的としてアプリを作成しています。私は今、いくつかの本当に厳しい問題を抱えています。ここでの説明は簡潔にしようと思います。
設定:
現在、私は3つのビューを持っています。2 はViewGroups
で、1 はただのView
. それらがこの順序であるとしましょう:
TestA extends ViewGroup
TestB extends ViewGroup
TestC extends View
TestA->TestB->TestC
Where TestC is in TestB and TestB is in TestA.
私Activity
の場合、次のようにビューを表示するだけです。
TestA myView = new TestA(context);
myView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT));
setContentView(myView);
問題:
onDraw(Canvas canvas)
TestAのメソッドは呼び出されません。ビューに寸法がない (高さ/幅 = 0) というこれに対するいくつかの解決策を見てきましたが、そうではありません。をオーバーライドするonLayout()
と、レイアウトの寸法が正しく表示されます。また、getHeight()/Width() は本来あるべき姿です。ベース ビューをオーバーライドdispatchDraw()
して描画することもできます。でオブジェクトをアニメートしたい
TestB
。伝統的に、オブジェクトが本来のアニメーションを終了するまで、onDraw()
呼び出し時にメソッドをオーバーライドしていました。invalidate()
ただし、 では、ビューTestB
を呼び出しても再描画されません。invalidate()
メソッドを再度呼び出すのは親ビューの仕事であるという印象を受けていますonDraw()
が、親ビューは再度呼び出しませんdispatchDraw()
。
私の質問は、onDraw()
親ビューのメソッドが最初から呼び出されないのはなぜですか? 親ビューの子の 1 つがそれ自体を無効にするときに、親ビューのどのメソッドを呼び出す必要がありますか? 親は子供が描かれることを保証する責任がありますか、それともAndroidがそれを処理しますか? Android が に応答する場合、二度と描画されないinvalidate()
のはなぜですか?TestB