View.MeasureSpec
2016-09-20 15:46
218 查看
一:MeasureSpec介绍
MeasureSpec 是Android对外提供的获取控件测绘的工具类,它用于View的,onMeasure()测绘的时候,它对外提供三个主要方法:
//获取控件的模式
int getMode(int measureSpec) ;
//获取控件的大小
int getSize(int measureSpec) ;
//组装控件的measureSpec值
int makeMeasureSpec(int size, int mode) ;
二:实现原理
2.1 基础知识
控件的宽高模式类型有一下三种.比如在xml布局里,view的宽可以设置下面任意一种。
AT_MOST [自适应wrap_context]
EXACTLY[精确值 match_parent、fill_parent 、30dp]
UNSPECIFIED[未指定]
2.2 MeasureSpec 常量值介绍
int MODE_SHIFT =30;
intMODE_MASK = 0x3 << MODE_SHIFT;[1100 0000 0000 0000 0000 0000 0000 0000 ]
intUNSPECIFIED = 0 << MODE_SHIFT; [0000 0000 0000 0000 0000 0000 0000 0000 ]
intEXACTLY = 1 << MODE_SHIFT; [0100 0000 0000 0000 0000 0000 0000 0000 ]
intAT_MOST = 2 << MODE_SHIFT; [1000 0000 0000 0000 0000 0000 0000 0000 ]
2.3) 举例介绍Android实现
2.3.1) 举例
measureSpec: 其实就是int值,32位.前两位代表模式,后三十位代表大小.例如我们现在有一个组件,我们配置它的宽为android:layout_width="12px". 那么它的各个值如下
size: 模式是精确模式[0100 0000 0000 0000 0000 0000 0000 0000]
model: 大小是12px[ 0000 0000 0000 0000 0000 0000 0000 0110]
2.3.2) makeMeasureSpec() 组装测绘值实现
public static int makeMeasureSpec(int size, int mode) {
return size + mode;
}
发现底层的组装measureSpec很简单,就是size和mode直接求和。也就是 [0100 0000 0000 0000 0000 0000 0000 0000]和[ 0000 0000 0000 0000 0000 0000 00000110]相加,得到measureSpec值[01000000 0000 0000 0000 0000 0000 0110]
2.3.3) getMode() 获取模式的实现
public static int getMode(int measureSpec) {
return (measureSpec & MODE_MASK);
}
底层获取model的方法很简单,就是measureSpec和MODE_MASK按位于,也就是[0100 0000 0000 0000 0000 0000 0000 0110]和[1100 0000 0000 0000 0000 0000 0000 0000[按位于,结果就是[0100 0000 0000 0000 0000 0000 0000 0000]也就是EXACTLY。
获取模式其实就是其实measureSpec前两位代表模式后30位代表大小。想要获取到模式的话,measureSpec直接和一个前两位是11,后三十位是00的数字按位与,就只留下前两位的值,后三十位置为0.
2.3.4) getSize()获取大小
public static int getSize(int measureSpec) {
return (measureSpec & ~MODE_MASK);
}
底层获取size,其实就是measureSpec 和 ~MODE_MASK按位于。其实就是[0100 0000 0000 0000 0000 0000 0000 0110]和[0011 1111 1111 1111 1111 1111 1111 1111]按位与,结果就是[0000 0000 0000 0000 0000 0000 0000 0110]也就是12.
其实measureSpec前两位代表模式后30位代表大小。想要获取大小的话,measureSpec直接和前两位是00,后三十位是11的数字相与,就把前两位置为0,,后三十位保留下来了。
3. 总结
MeasureSpec其实就是使用一个int值,前两位代表模式,后三十位代表大小。想要模式或者大小,只需要合理的和不同值按位与即可。
MeasureSpec 是Android对外提供的获取控件测绘的工具类,它用于View的,onMeasure()测绘的时候,它对外提供三个主要方法:
//获取控件的模式
int getMode(int measureSpec) ;
//获取控件的大小
int getSize(int measureSpec) ;
//组装控件的measureSpec值
int makeMeasureSpec(int size, int mode) ;
二:实现原理
2.1 基础知识
控件的宽高模式类型有一下三种.比如在xml布局里,view的宽可以设置下面任意一种。
AT_MOST [自适应wrap_context]
EXACTLY[精确值 match_parent、fill_parent 、30dp]
UNSPECIFIED[未指定]
2.2 MeasureSpec 常量值介绍
int MODE_SHIFT =30;
intMODE_MASK = 0x3 << MODE_SHIFT;[1100 0000 0000 0000 0000 0000 0000 0000 ]
intUNSPECIFIED = 0 << MODE_SHIFT; [0000 0000 0000 0000 0000 0000 0000 0000 ]
intEXACTLY = 1 << MODE_SHIFT; [0100 0000 0000 0000 0000 0000 0000 0000 ]
intAT_MOST = 2 << MODE_SHIFT; [1000 0000 0000 0000 0000 0000 0000 0000 ]
2.3) 举例介绍Android实现
2.3.1) 举例
measureSpec: 其实就是int值,32位.前两位代表模式,后三十位代表大小.例如我们现在有一个组件,我们配置它的宽为android:layout_width="12px". 那么它的各个值如下
size: 模式是精确模式[0100 0000 0000 0000 0000 0000 0000 0000]
model: 大小是12px[ 0000 0000 0000 0000 0000 0000 0000 0110]
2.3.2) makeMeasureSpec() 组装测绘值实现
public static int makeMeasureSpec(int size, int mode) {
return size + mode;
}
发现底层的组装measureSpec很简单,就是size和mode直接求和。也就是 [0100 0000 0000 0000 0000 0000 0000 0000]和[ 0000 0000 0000 0000 0000 0000 00000110]相加,得到measureSpec值[01000000 0000 0000 0000 0000 0000 0110]
2.3.3) getMode() 获取模式的实现
public static int getMode(int measureSpec) {
return (measureSpec & MODE_MASK);
}
底层获取model的方法很简单,就是measureSpec和MODE_MASK按位于,也就是[0100 0000 0000 0000 0000 0000 0000 0110]和[1100 0000 0000 0000 0000 0000 0000 0000[按位于,结果就是[0100 0000 0000 0000 0000 0000 0000 0000]也就是EXACTLY。
获取模式其实就是其实measureSpec前两位代表模式后30位代表大小。想要获取到模式的话,measureSpec直接和一个前两位是11,后三十位是00的数字按位与,就只留下前两位的值,后三十位置为0.
2.3.4) getSize()获取大小
public static int getSize(int measureSpec) {
return (measureSpec & ~MODE_MASK);
}
底层获取size,其实就是measureSpec 和 ~MODE_MASK按位于。其实就是[0100 0000 0000 0000 0000 0000 0000 0110]和[0011 1111 1111 1111 1111 1111 1111 1111]按位与,结果就是[0000 0000 0000 0000 0000 0000 0000 0110]也就是12.
其实measureSpec前两位代表模式后30位代表大小。想要获取大小的话,measureSpec直接和前两位是00,后三十位是11的数字相与,就把前两位置为0,,后三十位保留下来了。
3. 总结
MeasureSpec其实就是使用一个int值,前两位代表模式,后三十位代表大小。想要模式或者大小,只需要合理的和不同值按位与即可。
相关文章推荐
- 自定义View之onMeasure(int widthMeasureSpec, int heightMeasureSpec)方法解释
- 为什么要重写View的onMeasure(int widthMeasureSpec, int heightMeasureSpec)方法
- View的工作原理之MeasureSpec测量规格
- Android View MeasureSpec详解
- 自定义View,关于onMeasure方法的两个参数widthMeasureSpec,heightMeasureSpec
- 自定义View---widthMeasureSpec和heightMeasureSpec是从哪来?
- View.MeasureSpec
- View MeasureSpec 和LayoutParams关系
- View.MeasureSpec
- View onMeasure (int widthMeasureSpec, int heightMeasureSpec)
- ViewGroup getChildMeasureSpec
- ListView和Scrolloview共用View.measure(widthMeasureSpec, heightMeasureSpec) 空指针异常
- setMeasuredDimension(widthMeasureSpec, heightMeasureSpec)方法导致在视图中自定义ViewGroup一下的控件显示不出来
- ViewGroup.getChildMeasureSpec(int spec, int padding, int childDimension)解释
- 【Android - 自定义View】之MeasureSpec简介
- 解决ListView 跟ScroolView 共存 listItem.measure(0, 0) 空指针
- 简单说说自己对自定义view的onMeasure的理解
- 四 View 的 measure 过程
- Android View的Measure
- View的Measure过程解析