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);