View.MeasureSpec
来源:互联网 发布:mrp格式软件下载 编辑:程序博客网 时间:2024/05/21 16:23
一: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值,前两位代表模式,后三十位代表大小。想要模式或者大小,只需要合理的和不同值按位与即可。
- View.MeasureSpec
- View的MeasureSpec使用
- 【view】MeasureSpec介绍
- 解析View中的MeasureSpec
- 【Android基础】-View.MeasureSpec
- Android View MeasureSpec详解
- Android View(三)-MeasureSpec详解
- 自定义View准备:MeasureSpec理解
- View中MeasureSpec的作用
- View MeasureSpec 和LayoutParams关系
- Android API之android.view.View.MeasureSpec
- Android中自定义View的MeasureSpec使用
- Android中自定义View的MeasureSpec使用
- Android中自定义View的MeasureSpec使用
- Android源码分析之---View.MeasureSpec 解析
- Android中自定义View的MeasureSpec使用
- Android中自定义View的MeasureSpec使用
- Android中自定义View的MeasureSpec使用
- JAVA进阶4.12——泛型
- 索引
- 工厂方法模式
- iOS拼接URL,类似安卓body体进行转码(转为gbk)提交。
- 为什么中国的程序员总被称为码农?
- View.MeasureSpec
- python之函数参数传递
- 网站的一些状态提示
- lvs为何不能完全替代DNS轮询
- IOS开发记录用户登录状态
- Ceres-Solver库使用(一)--windows下安装配置
- leetcode刷题笔记-ZigZag Conversion
- AFNetworking 3.0 源码解析之Serialization
- Netty 之 浅析ByteToMessageDecoder