在Android documentation,它说的addView(和一些其他方法)以下:从View#调用的ViewGroup#addView或一个ViewGroup#removeView画
注:不调用从平局(Android的这个方法。 (android.graphics.Canvas),dispatchDraw(android.graphics.Canvas) 或任何相关的方法。
这个限制的原因是什么?另外,“相关方法”是什么?比如说,是surfaceChanged这样的方法?
在Android documentation,它说的addView(和一些其他方法)以下:从View#调用的ViewGroup#addView或一个ViewGroup#removeView画
注:不调用从平局(Android的这个方法。 (android.graphics.Canvas),dispatchDraw(android.graphics.Canvas) 或任何相关的方法。
这个限制的原因是什么?另外,“相关方法”是什么?比如说,是surfaceChanged这样的方法?
这是因为当渲染View
时,包含View
的ViewGroup
在映射出每个视图在屏幕上出现的位置时会经过某些步骤。一个ViewGroup
采取的步骤是:
ViewGroup
措施,其所有子视图)ViewGroup.LayoutParams
定位测量子女)
由于拉延步骤是最后一步在屏幕上呈现View
■当,在该过程的这个步骤中添加额外View
小号可能改变(无效)中的整个布局。如果你看看源代码ViewGroup
你会看到,在打电话给addView(View v)
再次开始整个布局的过程:
public void addView(View child, int index, LayoutParams params) {
if (DBG) {
System.out.println(this + " addView");
}
// addViewInner() will call child.requestLayout() when setting the new LayoutParams
// therefore, we call requestLayout() on ourselves before, so that the child's request
// will be blocked at our level
requestLayout();
invalidate(true);
addViewInner(child, index, params, false);
}
此外,当ViewGroup
绘制其子View
S上的屏幕上,它通常遍历当前添加到ViewGroup
的所有View
。因此,如果这种类型的事件是在绘制方法期间调度的,那么它可能会导致ViewGroup尝试绘制尚未完成呈现的必要步骤的View
。
至于相关的方法,这些方法本质上会使ViewGroup
的当前绘图操作无效。
编辑:
的SurfaceHolder.Callback方法跟踪你的绘图表面或SurfaceView/GLSurfaceView的状态只是Interface
方法。由于布局的状态应该保持不变,直到Draw步骤完成,所以在这个过程中不应该真的需要调用这个方法。但是,由于这些方法基本上都是您实现的接口方法(它们在源代码中默认为空),因此调用其中一种方法应该会导致错误,尽管我不确定它们应该没有真正的原因这样做是适当的。一种情况下,如果你的底层实现导致像我上面解释的问题,将会遇到问题...
感谢您的回答!关于surfaceChanged部分,你有什么要说的吗? – kolistivra
- 查看我的编辑。 – Submersed