布局过程
- 确定每个子 View 相对于父 View 的位置
- 为什么要写自定义布局(自定义 Layout)?
从整体看
- 测量流程(measure):从根 View 递归调用每一级子 View 的 measure() 方法,对他们进行测量,获得子 View 的位置和尺寸
- 布局流程(layout):从根 View 递归调用每一级子 View 的 layout() 方法,把测量过程中得出的子 View 的位置和尺寸传给子 View
- 为什么要分两个流程?
- 在父 ViewGroup 的参数为 wrap_content 但是子 View 有一个为 match_parent
从个体看
- 运行前,开发者在xml文件里对每个View的布局要求 layout_xxx
- 父 View 在自己的 onMeasure 中,根据开发者在 xml 中写的对子 View 的要求,结合自己的可用空间,得出对子 View 的具体尺寸要求
- 子 View 在自己的 onMeasure 中,根据父 View 的要求以及自己的特性算出自己的期望尺寸
- 父 View 在子 View 计算出期望尺寸后,得出子 View 的实际尺寸和位置
- 子 View 在自己的 layout() 方法中,将父 View 传入的自己的实际尺寸和位置保留