三个对外公开的static变量
我们知道View在屏幕上显示出来要先经过measure和layout
在调用onMeasure(int widthSpec, int heightSpec)方法时,要涉及到MeasureSpec的使用,该类是定义View的测量规格或者测量规则
这个类是View里面的嵌套内部类,提供了三个对外公开的static变量UNSPECIFIED,EXACTLY,AT_MOST,这三个变量统称为specMode
UNSPECIFIED
父容器不对View有任何限制,要多大给多大,这种情况一般用于系统内部,表示一种测量的状态。
EXACTLY
父容器已经测量出View所需要的精确大小,这个时候View的最终大小就是SpecSize所指定的值。它对应于LayoutParams中的match_parent和具体的数值这两种模式。
AT_MOST
父容器指定了一个可用大小即SpecSize,View大小不能大于这个值,具体是什么值要看不同View的具体实现。它对应于LayoutParams中的Wrap_content
MeasureSpec的这3中模式和我们平时设置的layout参数fill_parent, wrap_content有什么关系呢?
经过代码测试就知道,当我们设置width或height为fill_parent时,容器在布局时调用子 view的measure方法传入的模式是EXACTLY,因为子view会占据剩余容器的空间,所以它大小是确定的。而当设置为 wrap_content时,容器传进去的是AT_MOST, 表示子view的大小最多是多少,这样子view会根据这个上限来设置自己的尺寸。当子view的大小设置为精确值时,容器传入的是EXACTLY, 而MeasureSpec的UNSPECIFIED模式目前还没有发现在什么情况下使用
MeasureSpec提供的三个方法
makeMeasureSpec(int size,int mode)
size参数自己设定,mode必须是specMode的三个值中的一个
getMode(int measureSpec)
方法返回specMode的三个值中的一个,注意方法参数measureSpec,这个参数的值是怎么得来的呢?正是由makeMeasureSpec方法计算出来的
getSize(int measureSpec)
获取View的大小,方法参数的值同样是由makeMeasureSpec计算的出来的