- 在6.0及其以下,sAlwaysRemeasureExactly=true
- 如果需要重写布局则进入如下逻辑:
- 首先清空标记为PFLAG_MEASURED_DIMENSION_SET(测量值已记录)
- 尝试通过缓存中获取结果(非强制重新布局情况)
- 如果没有缓存则调用onMeasure()进行测量
- 如果有缓存则直接取缓存
- 记录最终的测量结果,并加入至缓存
5.ViewGroup.onMeasure()实现过程
- 遍历子View,调用measureChildWithMargins()
- 根据传入的子View,父View的测量结果,已经使用过的宽高,和子View的LayoutParams,进行处理,调用getChildMeasureSpec()获取子View的测量结果
- 将计算后的结果,通过MeasureSpec.makeMeasureSpec(resultSize, resultMode)进行封装
- 调用子View的measure()方法,将父布局测量以后的结果传递给子View,子View在onMeasure()中就可以获得MeasureSpec
- 通过resolveSizeAndState()方法记录测量结果