1.onLayout执行流程
ViewGroup首先调用了layout()确定了自己本身在其父View中的位置,然后调用onLayout()确定每个子View的位置,每个子View又会调用View的layout()方法来确定自己在ViewGroup的位置。
- 注意:View的layout()方法用于View确定自己本身在其父View的位置
ViewGroup的onLayout()方法用于确定子View的位置.
至此,我们已经看完了measure和layout这两个过程,对于一些问题我们做一个小的总结 :
- 获取View的测量大小measuredWidth和measuredHeight的时机。 在某些复杂或者极端的情况下系统会多次执行measure过程,所以在onMeasure()中去获取View的测量大小得到的是一个不准确的值。为了避免该情况,最好在onMeasure()的下一阶段即onLayout()中去获取。
- getMeasuredWidth()和getWidth()的区别 在绝大多数情况下这两者返回的值都是相同的,但是结果相同并不说明它们是同一个东西。 首先,它们的获取时机是不同的。 在measure()过程结束后就可以调用getMeasuredWidth()方法获取到View的测量大小,而getWidth()方法要在layout()过程结束后才能被调用从而获取View的实际大小。 其次,它们返回值的计算方式不同。 getMeasuredWidth()方法中的返回值是通过setMeasuredDimension()方法得到的,这点我们之前已经分析过,在此不再赘述;而getWidth()方法中的返回值是通过View的右坐标减去其左坐标(right-left)计算出来的。
- 刚才说到了关于View的坐标,在这就不得不提一下: view.getLeft(),view.getRight(),view.getBottom(),view.getTop(); 这四个方法用于获取子View相对于父View的位置。 但是请注意:
getLeft( )表示子View的左边距离父View的左边的距离
getRight( )表示子View的右边距离父View的左边的距离
getTop( )表示子View的上边距离父View的上边的距离
getBottom( )表示子View的下边距离父View的上边的距离
在此,画一个示例图作为参考 :