调用ViewGroup的addView之后,是怎样显示出来的
展开全部
在调用addview之后, 将view添加到ViewGroup的数组, 将该ViewGroup设置为该view的parent。从AddView方法, 到addViewInner方法结束之前, 所有流程都是同步的。
其中在addViewInner之前,会通过调用requestLayout()和invalidate(true)为该view设置标记。
在调用addview之后, 系统底层会通过发送一条消息, 该消息是由Choreographer类的一个内部类 FrameDisplayEventReceiver来处理,最终会走到ViewRootImpl的performTraversals(),然后内部就是经典的三大流程 measure,layout,draw。
对应的相关处理是measureHierarchy(),performLayout,performDraw()。在这些内部, 会通过前面设置的标记来区分哪些view需要测量绘制等(每个ViewGroup不止一个view,因此有些需要测绘,有些不需要,就是通过flag来区分的)。执行完以后, 通知系统底层绘制view。大概就是这样
其中在addViewInner之前,会通过调用requestLayout()和invalidate(true)为该view设置标记。
在调用addview之后, 系统底层会通过发送一条消息, 该消息是由Choreographer类的一个内部类 FrameDisplayEventReceiver来处理,最终会走到ViewRootImpl的performTraversals(),然后内部就是经典的三大流程 measure,layout,draw。
对应的相关处理是measureHierarchy(),performLayout,performDraw()。在这些内部, 会通过前面设置的标记来区分哪些view需要测量绘制等(每个ViewGroup不止一个view,因此有些需要测绘,有些不需要,就是通过flag来区分的)。执行完以后, 通知系统底层绘制view。大概就是这样
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
/** * Adds a child view with the specified layout parameters. * * @param child the child view to add * @param index the position at which to add the child * @param params the layout parameters to set on the child */ 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);
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询