关于MeasureSpec的一些了解

MeasureSpec是一个封装了某个view大小和模式的int数值。该类是为了计算view或者Viewgroup中的view对应的大小已经尺寸。一般我们在onMeasure中用到。

 MeaureSpce有三种数值:

  1:精确模式

        在这种模式下面,view的尺寸多少,那么该view经过计算的尺寸就为多少

  2:最大模式

       在这种模式下面,父组建能够给出的最大空间,那么该view的长和宽也就定下来了,当然也可能比这个小

 3:未指定模式

       也就是说当前view,可以随意的用空间,不受限制


这个int数值中包含了该view的大小已经模式,但是我们所知道的int数值有32位,那么该如何解释了?

这32位二进制位,最高项的2位是用来决定模式的,其余的位数用来决定大小 。


最高位两位是00的时候表示的是“未指定模式”,即MeasureSpec.UNSPECIFIED

最高位两位是01的时候表示的是“精确模式”.即MeasureSpec.EXACTLY

最高位两位是11的时候表示的是“最大模式”。即MeasureSpec.AT_MOST


而MeasureSpec工具类就是用来帮我们从指定的模式和大小下获取我们view的长或者宽。

  

//根据指定的大小和模式来得到经过计算的大小

public static int makeMeasureSpec(int size ,int mode);


//根据指定measureSpec来得到模式

pubic static int getMode(int measureSpec):


//根据measureSpec来得到对应的大小(32位中的后30位)

public static int getSize(int measureSpec)


另外添加一个例子:listview 的inititem

private void measureItem(View child) {
2465         ViewGroup.LayoutParams p = child.getLayoutParams();
2466         if (p == null) {
2467             p = new ViewGroup.LayoutParams(
2468                     ViewGroup.LayoutParams.MATCH_PARENT,
2469                     ViewGroup.LayoutParams.WRAP_CONTENT);
2470         }
2471
2472         int childWidthSpec = ViewGroup.getChildMeasureSpec(mWidthMeasureSpec,
2473                 mListPadding.left + mListPadding.right, p.width);
2474         int lpHeight = p.height;
2475         int childHeightSpec;
2476         if (lpHeight > 0) {
2477             childHeightSpec = MeasureSpec.makeMeasureSpec(lpHeight, MeasureSpec.EXACTLY);
2478         } else {
2479             childHeightSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
2480         }
2481         child.measure(childWidthSpec, childHeightSpec);

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值