`

MeasureSpec 源码 解析 详解

 
阅读更多

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 MeasureSpec是Android中用于View测量的重要机制,通过MeasureSpec,可以控制View的尺寸和布局。下面是Android MeasureSpec的理解和源码解析。 一、MeasureSpec基础...

    MeasureSpec三种测量模式详解例子

    在这个详解例子中,我们将深入探讨MeasureSpec的三种测量模式以及它们如何影响Android UI布局。 1. **UNSPECIFIED模式** UNSPECIFIED模式是最宽松的模式,它表示父视图不对子视图有任何尺寸上的限制。子视图可以...

    Android源码解析

    ### Android源码解析知识点概述 #### 公共技术点概览 - **Java反射** - Java反射机制允许运行时检查类、接口、字段和方法的信息,并能够动态地调用方法和修改字段值。 - **应用场景**:动态加载类、实现插件化...

    Android系统Framework层源码分析(免积分)

    本篇内容将深入探讨Android Framework层的源码分析,帮助你理解这一关键层次的工作原理。 1. **系统启动流程** - Android系统的启动始于Zygote进程,它预先加载了大部分核心库,为其他进程提供快速孵化的基础。 -...

    Android程序研发源码Android 万年历源码.zip

    以上是对"Android程序研发源码Android 万年历源码.zip"中可能包含的关键技术点的解析。通过研究这个源码,开发者可以学习到Android日历应用的开发流程,提升对Android系统日历API的理解,以及如何构建高性能、高可用...

    Android应用源码Adroid UI 界面绘制原理分析-IT计算机-毕业设计.zip

    在Android应用开发中,UI界面的...通过分析和修改源码,你可以提升自己在Android UI设计和开发上的技能,更好地完成毕业设计。同时,这个项目也可以作为撰写相关论文的参考材料,探讨Android UI的实现细节和优化策略。

    Gallery源码

    《Android原生图库源码解析》 在Android开发中, Gallery组件曾是展示图片、进行图片选择的经典组件,尤其在早期版本的Android系统中,它以直观的横向滚动方式展示了图片浏览的功能。然而,随着Android系统的更新...

    应用源码之TextViewSample.zip

    《Android源码学习:深入解析TextViewSample》 在Android应用开发中,TextView是不可或缺的UI组件,它用于显示文本信息,同时也是用户与应用交互的重要媒介。本资源“应用源码之TextViewSample.zip”旨在帮助开发者...

    Android源码——UI界面源码.7z

    在Android系统中,UI界面是用户与应用交互的关键部分,其源码的解析能帮助开发者深入理解Android系统如何处理用户界面以及如何优化性能。本文将围绕"Android源码——UI界面源码.7z"这一主题,详细阐述Android UI界面...

    安卓 简单自定义view 源码

    这个“安卓 简单自定义view 源码”示例提供了一个基础的自定义View的实现过程,尽管代码可能略显混乱,但其核心思想清晰,有助于理解自定义View的基本步骤。 首先,我们来看自定义View的基本结构。一个自定义View...

    安卓Android源码——textView.rar

    在安卓开发中,TextView是应用界面中最基础也是最常用的组件之一,它用于显示文本信息,支持多种格式,如单行、多行、可编辑、不可编辑等。...通过查看和分析源码,开发者可以发现更多细节,进一步优化自己的应用。

    Android经典设计源码-LinearLayoutSample.rar

    源码分析: 1. **XML布局文件**:查看项目中的layout文件,我们可以看到LinearLayout的XML定义,包括orientation属性、权重分配以及子视图的嵌套。这些XML属性和元素的解析在代码中会转化为相应的布局计算。 2. **...

    安卓瀑布流源码

    这里我们将深入探讨"安卓瀑布流源码"中的关键知识点。 1. 自定义ViewGroup:在Android中,GridView是一种传统的网格布局,但无法直接实现瀑布流效果。因此,我们需要自定义一个ViewGroup,比如`WaterfallFlowLayout...

    Android应用源码面试题.zip

    3. **Android组件**:Service、BroadcastReceiver、ContentProvider的使用和源码解析,了解它们在系统中的作用和工作方式,能帮助开发者实现更高效的应用集成。 4. **View系统**:深入理解View和ViewGroup的绘制...

    android api源码

    在Android开发中,深入理解Android API源码是提升技能、解决复杂问题的关键步骤。源码提供了系统的内部工作原理,使开发者能更有效地调试和优化应用。在这个资源中,重点是`android.view`包下的类库,它包含了...

    Android自定义View源码

    本文将深入探讨Android自定义View的源码分析,以`FdjSwitchView.java`和`FdjMineInfoView.java`为例,结合`view_mine_info.xml`布局文件和`attrs.xml`资源文件,解析自定义View的实现过程。 首先,我们来看`...

    安卓Android源码——MyLinerLayout.rar

    在这里,我们将深入探讨自定义布局在Android开发中的重要性,以及如何通过源码分析和学习来提升个人技能。 首先,Android的线性布局(LinearLayout)是最基础的布局之一,它允许子视图按垂直或水平方向排列。然而,...

    Android自动适应屏幕源码.rar

    最后,Android的MeasureSpec机制用于确定View在父容器中的大小。源码中可能有对onMeasure()方法的实现,展示了如何正确测量并设置View的大小以适应不同屏幕尺寸。 通过研究"Android自动适应屏幕源码.rar"中的内容,...

    流式布局源码

    3. **源码分析** - **onMeasure()**:这是测量阶段,用于确定ViewGroup及其所有子View的尺寸。在FlowLayout中,我们需要遍历所有子View,测量它们的宽度和高度,然后根据总宽度和屏幕宽度计算出需要的行数。 ```...

Global site tag (gtag.js) - Google Analytics