MeasureSpec
MODE_SHIFT = 30;
MODE_MASK = 0x3 << MODE_SHIFT;
UNSPECIFIED = 0 << MODE_SHIFT;
EXACTLY = 1 << MODE_SHIFT;
AT_MOST = 2 << MODE_SHIFT;
上面做的其实是位运算,我们转成2进制看吧
<<运算规则:
按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。
MODE_SHIFT = 30 移动的位数。
MODE_MASK = 0x3 << MODE_SHIFT 把0x3向左移动30个位数。
0x3 = 0000 0000 0000 0000 0000 0000 0000 0011
左移30位等于 11
00 0000 0000 0000 0000 0000 0000 0000 。
UNSPECIFIED = 0 << MODE_SHIFT = 0000 0000 0000 0000 0000 0000 0000 0000 = 0
EXACTLY = 1 << MODE_SHIFT = 01
00 0000 0000 0000 0000 0000 0000 0000 = 1073741824
AT_MOST = 2 << MODE_SHIFT = 1
000 0000 0000 0000 0000 0000 0000 0000 =-2147483647
假设 widthMeasureSpec=measureSpec =1073742678 (这是我debug出来的值)=01
00 0000 0000 0000 0000 0011
01
01
011
0
MeasureSpec.getSize(widthMeasureSpec) = 854 = 0011
01
01
011
0
看具体getSize里面是怎么实现的: return (measureSpec & ~MODE_MASK);
~MODE_MASK = ~11
00 0000 0000 0000 0000 0000 0000 0000 =00
11 1111 1111 1111 1111 1111 1111 1111
measureSpec & ~MODE_MASK = 1073742678 &00
11 1111 1111 1111 1111 1111 1111 1111 = 01
00 0000 0000 0000 0000 0011
01
01
011
0 & 00
11 1111 1111 1111 1111 1111 1111 1111 =0000 0000 0000 0000 0000 0011 0101 0110 = 854
& :两个都为1时结果为1。
MeasureSpec.getMode(widthMeasureSpec) = 1073741824=01
00 0000 0000 0000 0000 0000 0000 0000
measureSpec & MODE_MASK = 1073742678 & 11
00 0000 0000 0000 0000 0000 0000 0000 = 01
00 0000 0000 0000 0000 0011
01
01
011
0 & 11
00 0000 0000 0000 0000 0000 0000 0000 =0100 0000 0000 0000 0000 0000 0000 0000 = 1073741824 = EXACTLY
从上面的分析可以看出widthMeasureSpec 里面存储的是两个内容一个是类型mode一个是值width,系统是通过把两个值相加用一个值表示两个内容 makeMeasureSpec(int size, int mode) {return size + mode;} 这个函数就是用来做相加操作的,也就是把type和value打包成一个值,总结:高位用于存储类型,低位用于存储具体值。
另外 上面的是当宽度设置为fill_parent的时候。
当宽度设置为wrap_content的时候 widthMeasureSpec=-2147482794 = 1111 1111 1111 1111 1111 1100 1010 1010
mode = -2147483648 = Integer.MIN_VALUE= 1000 0000 0000 0000 0000 0000 0000 0000 = AT_MOST
width = 854
分享到:
相关推荐
Android MeasureSpec的理解和源码解析 Android MeasureSpec是Android中用于View测量的重要机制,通过MeasureSpec,可以控制View的尺寸和布局。下面是Android MeasureSpec的理解和源码解析。 一、MeasureSpec基础...
在这个详解例子中,我们将深入探讨MeasureSpec的三种测量模式以及它们如何影响Android UI布局。 1. **UNSPECIFIED模式** UNSPECIFIED模式是最宽松的模式,它表示父视图不对子视图有任何尺寸上的限制。子视图可以...
### Android源码解析知识点概述 #### 公共技术点概览 - **Java反射** - Java反射机制允许运行时检查类、接口、字段和方法的信息,并能够动态地调用方法和修改字段值。 - **应用场景**:动态加载类、实现插件化...
本篇内容将深入探讨Android Framework层的源码分析,帮助你理解这一关键层次的工作原理。 1. **系统启动流程** - Android系统的启动始于Zygote进程,它预先加载了大部分核心库,为其他进程提供快速孵化的基础。 -...
以上是对"Android程序研发源码Android 万年历源码.zip"中可能包含的关键技术点的解析。通过研究这个源码,开发者可以学习到Android日历应用的开发流程,提升对Android系统日历API的理解,以及如何构建高性能、高可用...
在Android应用开发中,UI界面的...通过分析和修改源码,你可以提升自己在Android UI设计和开发上的技能,更好地完成毕业设计。同时,这个项目也可以作为撰写相关论文的参考材料,探讨Android UI的实现细节和优化策略。
《Android原生图库源码解析》 在Android开发中, Gallery组件曾是展示图片、进行图片选择的经典组件,尤其在早期版本的Android系统中,它以直观的横向滚动方式展示了图片浏览的功能。然而,随着Android系统的更新...
《Android源码学习:深入解析TextViewSample》 在Android应用开发中,TextView是不可或缺的UI组件,它用于显示文本信息,同时也是用户与应用交互的重要媒介。本资源“应用源码之TextViewSample.zip”旨在帮助开发者...
在Android系统中,UI界面是用户与应用交互的关键部分,其源码的解析能帮助开发者深入理解Android系统如何处理用户界面以及如何优化性能。本文将围绕"Android源码——UI界面源码.7z"这一主题,详细阐述Android UI界面...
这个“安卓 简单自定义view 源码”示例提供了一个基础的自定义View的实现过程,尽管代码可能略显混乱,但其核心思想清晰,有助于理解自定义View的基本步骤。 首先,我们来看自定义View的基本结构。一个自定义View...
在安卓开发中,TextView是应用界面中最基础也是最常用的组件之一,它用于显示文本信息,支持多种格式,如单行、多行、可编辑、不可编辑等。...通过查看和分析源码,开发者可以发现更多细节,进一步优化自己的应用。
源码分析: 1. **XML布局文件**:查看项目中的layout文件,我们可以看到LinearLayout的XML定义,包括orientation属性、权重分配以及子视图的嵌套。这些XML属性和元素的解析在代码中会转化为相应的布局计算。 2. **...
这里我们将深入探讨"安卓瀑布流源码"中的关键知识点。 1. 自定义ViewGroup:在Android中,GridView是一种传统的网格布局,但无法直接实现瀑布流效果。因此,我们需要自定义一个ViewGroup,比如`WaterfallFlowLayout...
3. **Android组件**:Service、BroadcastReceiver、ContentProvider的使用和源码解析,了解它们在系统中的作用和工作方式,能帮助开发者实现更高效的应用集成。 4. **View系统**:深入理解View和ViewGroup的绘制...
在Android开发中,深入理解Android API源码是提升技能、解决复杂问题的关键步骤。源码提供了系统的内部工作原理,使开发者能更有效地调试和优化应用。在这个资源中,重点是`android.view`包下的类库,它包含了...
本文将深入探讨Android自定义View的源码分析,以`FdjSwitchView.java`和`FdjMineInfoView.java`为例,结合`view_mine_info.xml`布局文件和`attrs.xml`资源文件,解析自定义View的实现过程。 首先,我们来看`...
在这里,我们将深入探讨自定义布局在Android开发中的重要性,以及如何通过源码分析和学习来提升个人技能。 首先,Android的线性布局(LinearLayout)是最基础的布局之一,它允许子视图按垂直或水平方向排列。然而,...
最后,Android的MeasureSpec机制用于确定View在父容器中的大小。源码中可能有对onMeasure()方法的实现,展示了如何正确测量并设置View的大小以适应不同屏幕尺寸。 通过研究"Android自动适应屏幕源码.rar"中的内容,...
3. **源码分析** - **onMeasure()**:这是测量阶段,用于确定ViewGroup及其所有子View的尺寸。在FlowLayout中,我们需要遍历所有子View,测量它们的宽度和高度,然后根据总宽度和屏幕宽度计算出需要的行数。 ```...