android 之 MeasureSpec 的用途

大家都知道,在View的Measure里会用到一个叫MeasureSpec这个类,为什么要用它呢?

android里的布局不像ios,它可以用描述来形容这个布局,不用写死它的宽高,因为android的手机分辨率太多了,所以简单的设置某一个view的宽高,不能很好的适配。


所以android引出了布局描述:wrap_content,match_parent,fill_parent,这些布局描述会在xml里写好,那么在java里头,是怎么读取这些描述,然后用什么去表示它们呢?


android java层,用了两个变量来承载这些信息:mode和size。

mode有三种类型:EXACTLY,AT_MOST,UNSPECIFIED

size就是大小了,没什么说的

到这以后,MeasureSpec就来了,它把mode和size巧妙的结合在一起。而且生成的一个int数,高32-31位来装mode,30-0位来装size

10000000000000000000000000000000 AT_MOST
00000000000000000000000000000000 UNSPECIFIED
01000000000000000000000000000000 EXACTLY

  private static final int MODE_SHIFT = 30;
  private static final int MODE_MASK = 0x3 << MODE_SHIFT;


MeasureSpec通过getMode取mode,通过getSize取size

  public static int getMode(int measureSpec) {
            return (measureSpec & MODE_MASK);//<span style="font-family: Arial, Helvetica, sans-serif;">这里面的modemask就是:</span><span style="font-family: Arial, Helvetica, sans-serif;">11000000000000000000000000000000</span><p>它用modemask&xx就能得到mode</p>
        }
<span style="font-family: Arial, Helvetica, sans-serif;"> public static int getSize(int measureSpec) {</span>
            return (measureSpec & ~MODE_MASK);//00111111111111111111111111111111~MODE_MASK:
        }




通过makeMeasureSpec把mode和size相加,得出一个size与mode的结合体

  public static int makeMeasureSpec(int size, int mode) {
            return size + mode;
        }
至于为什么要把它们两合成一个int值,我觉得应该是省内存,或是android原本的设想是没有mode,后来为了加上mode但又不想影响原有参数,就把这两合起来当成int了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值