关于自定义控件的onMeasure()其中的MeasureSpec

来源:互联网 发布:js match对象 编辑:程序博客网 时间:2024/06/05 03:17

我在看一个项目的时候,发现项目用到了自定义控件,其中一个控件是继承了GridView,并且重写了onMeasure()方法,按照一般的理解,onMeasure()是用来计算view大小的,它传进来两个参数onMeasure(int widthMeasureSpec, int heightMeasureSpec),这个MeasureSpec是一个32位的int,是用来规定view的绘制大小的,其中的最高2位用来表示绘制模式,查阅源码可以知道一共有三种模式。

1、UNSPECIFIED(未定义模式, 00),意味着parent View不会限制child View的大小

2、EXACTLY(精确模式,01),即当前View的大小是固定的

3、AT_MOST(最大模式,10),即当前View的大小允许在0-parent_View.size范围内

MeasureSpec的剩下30位表示View的size,根据源码显示,其范围是0 ~ 2^30-1,即剩下的30位所能表示的最大int数

*我在看了一些onMeasure介绍的文章发现他们在演示示例的时候,其MeasureSpec一般为

int heightMeasureSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST)

这个mode就不说了,根据具体需要而改变,但是这个size我是抱有疑问的,因为源码里给的size范围是 2^30-1,但是Integer.MAX_VALUE  = 2^31-1,那么右移2位之后应该就是 2^29-1了,这里不是就缩小的范围了吗,但奇怪的是不光别人演示代码是这样的,就连我那个别人写的项目也是这样写的,所以我比较疑惑,我认为这里右移1位才是合适的。

不过由于这个size是最大尺寸,所以也很难测试,这里就记录一下吧......

阅读全文
0 0
原创粉丝点击