MeasureSpec计算分析
来源:互联网 发布:xbox手柄映射软件 编辑:程序博客网 时间:2024/06/05 06:45
本篇文章不将View的宽高是怎么计算的,只讲MeasureSpec这个类的size和mode是怎么计算的。
1.measureSpec的形成
sUseBrokenMakeMeasureSpec是个boolean值,为true时使用老版本的方式生成measureSpec,为false时用新的方式生成measureSpec。不过得到的结果都是一样的。其中MODE_MASK=11measureSpec是一个int型的变量,java中int型变量由4个字节(32bit)组成,其中高2位用来封装mode,mode一共有3种:
- UNSPECIFIED = 0 << MODE_SHIFT; 即: 00
000000 00000000 00000000 00000000
- EXACTLY = 1 << MODE_SHIFT; 即: 01
000000 00000000 00000000 00000000
- AT_MOST = 2 << MODE_SHIFT; 即: 10
000000 00000000 00000000 00000000
低30位用来封装size.
最终得到的结果为高2位的mode和低30位的size
2.getMode方法获取mode
000000 00000000 00000000 00000000
所以将32位的measureSpec和11000000 00000000 00000000 00000000进行&运算,最终得到的肯定是measureSpec的高2位。比如生成measureSpec时传入
参数3,AT_MOST。那么measureSpec为10000000 00000000 00000000 00000101,
measureSpec & MODE_MASK=10000000 00000000 00000000 00000101 &
11
000000 00000000 00000000 00000000
=
10000000 00000000 00000000 00000000=AT_MOST可以看出,传入measureSpec后,measureSpec的低30位肯定全部为0,最终只剩下高2位。而measureSpec的高2位正好就是mode
3.getSize方法获取size
计算方法和getMode差不多,只是先将MODE_MASK取反,~MODE_MASK为00111111 11111111 11111111 11111111那结果可想而知,measureSpec和~MODE_MASK进行&运算,结果肯定为measureSpec的低30位了,因为高2位和00进行&运算肯定是00了总结:自定义View时会经常使用到MeasureSpec,通过它拿size或者mode,其实只是生成一个32位的int值,取其高2位或者低30位。提高了运行效率
阅读全文
0 0
- MeasureSpec计算分析
- MeasureSpec之详细分析
- MeasureSpec 的分析
- MeasureSpec
- MeasureSpec
- MeasureSpec
- MeasureSpec
- MeasureSpec
- MeasureSpec
- MeasureSpec
- MeasureSpec
- MeasureSpec
- MeasureSpec
- MeasureSpec
- Android源码分析之---View.MeasureSpec 解析
- MeasureSpec的理解和详尽源码分析
- MeasureSpec的理解和详尽源码分析
- MeasureSpec类的分析以及View的工作流程
- Column count doesn't match value count at row 1
- 文本特征值提取,采用结巴将文本分词,tf-idf算法得到特征值,以及给出了idf词频文件的训练方法
- centos 下安装lamp环境
- hadoop配置HA原理
- JVM学习笔记一 之 内存结构
- MeasureSpec计算分析
- BZOJ3436:小K的农场
- 17090202_Win7(64位)下光盘安装/构建CentOS7(64位)双系统教程
- 关于任务二(用户兴趣标注)的总结
- ubuntu 14.04 perl: warning: Setting locale failed.
- Linux服务器安装SVN
- sql server 异地备份与删除 (保留用于参考)
- Windows查看端口占用情况
- 针对通过 SSH 连接到 Azure Linux VM 时发生的失败、错误或被拒绝问题进行故障排除