以常见的FrameLayout
、LinearLayout
、RelativeLayout
、ConstraintLayout
为例,进行分析:
通过查阅这几个控件的onMeasure
、onLayout
、onDraw
方法,得出结果如下:
控件 | onMeasure | onLayout | onDraw | 备注 |
---|---|---|---|---|
FrameLayout | 先子view,然后是自身。 | 先子view,然后是自身。 | 先自身,然后子view。 | child的顺序是正序 |
LinearLayout | 先子view,然后是自身 | 先子view,然后是自身 | 先自身,然后子view | child的顺序是正序 |
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?