布局过程

  • 确定每个子 View 相对于父 View 的位置
  • 为什么要写自定义布局(自定义 Layout)?
    • 简化 xml

从整体看

  • 测量流程(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 传入的自己的实际尺寸和位置保留