1.什么是布局过程
布局是计算控件大小和位置的过程。
布局过程分为两个阶段
- 测量阶段
计算控件及其子控件的大小 - 布局阶段
计算子控件的位置
2.测量和布局阶段原理总览

3.测量阶段的原理细讲
父容器在onMeasure方法中先测量出child的尺寸,然后再测量出自己的尺寸
以AbsoluteLayout为例
-
调用ViewGroup.measureChildren()测量所有child的尺寸
测量好后child会调用setMeasuredDimension保存测量的尺寸,
然后可以通过child的view.getMeasuredWidth获取测量的尺寸。ViewGroup.getChildMeasureSpec函数很关键(承上启下的作用)
getChildMeasureSpec(int spec, int padding, int childDimension)
根据ViewGroup的parentWidthMeasureSpec,Child的widthMeasureSpec计出Child的最终的widthMeasureSpe -
根据child测量得到的尺寸计算得到AbsoluteLayout最大的尺寸
-
根据计算得到的maxWidth,自己的withMeasureSpec,得到自己的尺寸,并保存。
AbsoluteLayout测量阶段的相关函数
4.总结
- 为什么会将尺寸由 尺寸模式和尺寸尺寸?
因为控件的尺寸大小不是由自己决定的,还要考虑到父容器的大小
尺寸模式其实是父容器约束child大小的一种方式
见getChildMeasureSpec()函数。 - 调用ViewGroup.measureChildren()测量所有child的尺寸 ,
然后child会调用view.setMeasuredDimension保存测量的尺寸,
然后通过child的view.getMeasuredWidth获取测量的尺寸。 - ViewGroup.getChildMeasureSpec函数很关键
getChildMeasureSpec(int spec, int padding, int childDimension)
根据ViewGroup的parentWidthMeasureSpec,Child的widthMeasureSpec计出Child的最终的widthMeasureSpec - 如果想手动测量某个View的尺寸
调用View.measure()方法
todo
MeasureSpec的几种模式
网友评论