在View测量时都知道父view将MeasureSpec和子view的LayoutParams共同决定子view的宽高,即MeasureSpec,创建规则如上图。
如果记忆这个规则的话,那样会很傻。当然也可以记啦!很少嘛!但是这样不利于理解啊!那为什么这样创建这样规则呢?
请看下面:
首先这个measureSpec它由两部分组成:size和mode, size就是父view的大小(即宽高),mode就非常特殊了,它起了一个向下的约束规则
具体看mode有三种:
1、EXACTLY :它是精确测量子view的约束,就是说:我必须要求我的子view的size是确定大小的,如果是子view的size是确定的,那子view模式还是EXACTLY
2、AT_MOST: 它是要求子view的size不能超过父view的size,就是说,子view你的大小你自己决定,但是就是不要超过我的大小
3、UNSPECIFIED:它是对子view不加任何限制的,就是说:子view你的大小你想多大多小你自己决定了,和我没有任何关系
OK!清楚上面的MODE意义,来结合表来看一下。
1行一列:
当父view的mode为EXACTLY,很容易理解:父view要求子view为具体数值,但是子view此时确实为具体数值啊,所有子view最终
测量的size就是子view的size(即childsize),那此时子view的mode为EXACTLY,为什么呢?因为子view的size为具体数值,从而可以确定子view的子view的数值(这句话不是很好理解,请结合后面来理解)
2行1列:
当父view的mode为EXACTLY,很容易理解:父view要求子view为具体数值,但是子view这时要求有点奇葩:它说我要和父view的大小一样大
那你说此时结合它俩的要求,子view的大小应该是怎样的?当然是和父view的size相同啊!父要求子:我只要求你有具体数值就行。子说:我的大小和你一样。明白了吧!最后子view的数值是确定的,就是parentsize,由于子view的值是确定的,那子view得到的mode还是EXACTLY
2行2列
当父view的mode为AT_MOST时,它要求:子view的大小不能超过我,而子view要求是:它说我要和父view的大小一样大。综合来看,子view的size是确定的值么?
当然不是,是一个不确定的值,这个值要求不大于parentsize,所以此时子view的mode是AT_MOST,由于mode是AT_MOST,那此时子view选取的值应该是一个界限值:parentsize
3行1列
当父view的mode为EXACTLY,很容易理解:父view要求子view为具体数值。但是子view要求确实:我要和我的下一级view或内容一样大。子view的值确定吗?当然不确定了,而且子view还要看子view的子view的值。所以子view的mode为AT_MOST,子view的子view的size不能超过子view,那子view的mode当然为AT_MOST了,那此时子view的界限呢?
注意:这里子view的界限为:<=父view的parentsize. 自定义view的时候这里需要特别注意。
其他的父view的measureSpec和子view的LayoutParams结合规则都是这样的。不再赘述了!
本文为原创博文,转载请注明转载地址:
http://blog.youkuaiyun.com/yueyu6859