1、
封装了父布局传递给子布局的布局要求。
MeasureSpec可以表示一个宽,也可以表示一个高。
MeasureSpec是由大小和模式组成的。
2、
Exactly:父view已经检测到了子view所需要的精确大小,在这种模式下,子view的大小就是刚才所说的size
AT_MOST:父容器还没有检测到子view所需要的大小,但是它指定了一个大小,子view最大不能超过这个大小
UNSPECIFIED:父容器不对子view做出限制,子view想多大就多大。一般用于Android系统内部,表示一种状态。实际开发中很少用
3、ViewGroup的measureChildWithMargins()方法
①
②
获得子view的layout参数
获得子view宽的measurespec
获得子view高的measurespec
设置进去,并测量子view
各参数的意义:
View child:子view
int parentWidthMeasureSpec:父容器宽的measurespec
int widthUsed:父容器在水平方向上已经占用的空间大小
int parentHeightMeasureSpec:父容器高的measurespec
int heightUsed:父容器在高的方向上已经占用的空间大小
getChildMeaureSpec:获取子view在宽或高上的measureSpec
③getChildMeasureSpec
首先,获取父容器的specMode和specSize
获取父控件在垂直方向上或水平方向上可用的最大空间
根据父容器的specMode来进行判断
判断childDimension的值是否大于0是因为,当模式为match_parent或者wrap_content时,变量的实际值是小于0的,只有大于等于0,才是具体的值
将子view的size和mode组合成一个MeasureSpec返回出去。由此可用知道,子view的measureSpec是由父view的specMode和子view本身的布局参数来共同决定的
4、View的onMeasure()方法
背景是否是空,如果为空,则为最小宽度值,否则取背景和最小宽度值的最大值作为返回值
根据子view的model形式和子view建议的大小返回子view的大小
在measure阶段,view的宽和高就是由前面测量出来的measureSpec的size决定的
设置view的宽和高
5、
①
②
③在自定义的类中重新onMeasure方法