ViewGroup在调用onMeasure时,会先测量父View,还是会先测量子View?

434 阅读1分钟

以常见的FrameLayoutLinearLayoutRelativeLayoutConstraintLayout为例,进行分析:

通过查阅这几个控件的onMeasureonLayoutonDraw方法,得出结果如下:

控件onMeasureonLayoutonDraw备注
FrameLayout先子view,然后是自身。先子view,然后是自身。先自身,然后子view。child的顺序是正序
LinearLayout先子view,然后是自身先子view,然后是自身先自身,然后子viewchild的顺序是正序
RelativeLayout先子view,然后是自身。先子view,然后是自身。先自身,然后子view。child的顺序:onMeasure不能保证正序,onLayout和onDraw是正序。
ConstraintLayout先子view,然后是自身。先子view,然后是自身。子view参与,自身不参与。child的顺序:onMeasure、onLayout和onDraw是正序。

ps: 正序是指按照child添加的顺序。

当然了,在这些ViewGroup实现的onMeasure方法中,child的onMeasure方法可能会被调用多次。

系列文章:

从源码角度理解FrameLayout#onMeasure对child的measure调用次数

从源码角度理解LinearLayout#onMeasure对child的measure调用次数

从源码角度理解RelativeLayout#onMeasure对child的measure调用次数

从源码角度理解ConstraintLayout#onMeasure对child的measure调用次数

ViewGroup在调用onMeasure时,会先测量父View,还是会先测量子View?