MeasureSpec的简单说明

来源:互联网 发布:淘宝和农村淘宝的区别 编辑:程序博客网 时间:2024/06/11 09:05

三个对外公开的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计算的出来的

原创粉丝点击