设置:
目前我有三个视图。其中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);
问题:
TestA的
onDraw(Canvas canvas)
方法从未被调用。我看到有一些解决方案说我的视图没有任何尺寸(高度/宽度=0),但这不是事实。当我覆盖onLayout()
时,我获取了我的布局的尺寸,它们是正确的。而且,getHeight()/Width()
正好应该如此。我还可以重写dispatchDraw()
并让我的基本视图绘制自己。我想在
TestB
中动画一个对象。传统上,我会覆盖onDraw()
方法并在其自身上调用invalidate()
直到对象完成它应该执行的动画。然而,在TestB
中,当我调用invalidate()
时,该视图从未重新绘制。我认为它是我的父视图的工作再次调用onDraw()
方法,但我的父视图不会再次调用dispatchDraw()
。
我的问题是,为什么我的父视图的onDraw()
方法从未被调用呢?当其子项使自身无效时,父视图中应该调用哪些方法?父视图负责确保其子项被绘制还是由Android负责?如果Android响应invalidate()
,为什么TestB
再次没有被绘制?
ViewGroup
中。最早可以检索它的时间是onFinishInflate()
。之后你有选择。要么通过getChildAt(int index)
方法获取你的子项,要么使用findViewById(int id)
。索引将是子项在xml中定位的顺序。但我不知道子项内部的索引如何工作。 - DeeV