MeasureSpec 解析

MeasureSpec

1、A MeasureSpec is comprised of a size and a mode.

打印成二进制:

MODE_MASK=11000000000000000000000000000000, //0011左移动30位得到

~MODE_MASK =  00111111111111111111111111111111;

size & ~MODE_MASK  :  MeasureSpec 是个32位的int型,后三十位是是分配给size的。

2、mode有三种:

//0

// 01000000000000000000000000000000

// 10000000000000000000000000000000

mode & MODE_MASK  :  & 相同取1,相异取0;所以  01&11 =01 ;10 &11=10,后三十位全部为0

MeasureSpec 是个32位的int型,前2位是是分配给mode 的。

MeasureSpec objects are used to push requirements down the tree from parent to child. A MeasureSpec can be in one of three modes:

  • UNSPECIFIED:    The parent has not imposed any constraint on the child. It can be whatever size it wants. 无限制;,这种情况不多,一般都是父控件是AdapterView,通过measure方法传入的模式。
  • EXACTLY: This is used by the parent to impose an exact size on the child. The child must use this size, and guarantee that all of its descendants will fit within this size. 限制尺寸;当我们将控件的layout_width或layout_height指定为具体数值时如andorid:layout_width="50dip",或者为FILL_PARENT是,都是控件大小已经确定的情况,都是精确尺寸。
  • AT MOST: This is used by the parent to impose a maximum size on the child. The child must guarantee that it and all of its descendants will fit within this size. 限制最大尺寸;,当控件的layout_width或layout_height指定为WRAP_CONTENT时,控件大小一般随着控件的子空间或内容进行变化,此时控件尺寸只要不超过父控件允许的最大尺寸即可。因此,此时的mode是AT_MOST,size给出了父控件允许的最大尺寸。

3、取或:要任一表达式的一位为 1,则结果中的该位为 1。否则,结果中的该位为 0。 如图

(size & ~MODE_MASK) | (mode & MODE_MASK) 

MeasureSpec 是个32位的int型,前2位是是分配给mode 的;后三十位是是分配给size的。

4 getMode()

如果现在一个 MeasureSpec  =01000000000000000000111100000000;

01000000000000000000111100000000 & MODE_MASK (11000000000000000000000000000000)=01000000000000000000000000000000

//结果值是EXACTLY mode

5 、getSize()

如果现在一个 MeasureSpec  =01000000000000000000111100000000

01000000000000000000111100000000 & ~MODE_MASK(00111111111111111111111111111111)=000000000000000000111100000000  //得出size值111100000000=3840

出处:http://www.cnblogs.com/sueZheng/p/4046869.html

时间: 2024-10-05 04:27:38

MeasureSpec 解析的相关文章

源码解析Android中View的measure量算过程

Android中的Veiw从内存中到呈现在UI界面上需要依次经历三个阶段:量算 -> 布局 -> 绘图,关于View的量算.布局.绘图的总体机制可参见博文< Android中View的布局及绘图机制>.量算是布局和绘图的基础,所以量算是很重要的一个环节.本文将从源码角度解析View的量算过程,这其中会涉及某些关键类以及关键方法. 对View进行量算的目的是让View的父控件知道View想要多大的尺寸. 量算过程概述 如果要进行量算的View是ViewGroup类型,那么ViewGr

Android视图View绘制流程与源码分析(全)

来源:[工匠若水 http://blog.csdn.net/yanbober] 1 背景 还记得前面<Android应用setContentView与LayoutInflater加载解析机制源码分析>这篇文章吗?我们有分析到Activity中界面加载显示的基本流程原理,记不记得最终分析结果就是下面的关系: 看见没有,如上图中id为content的内容就是整个View树的结构,所以对每个具体View对象的操作,其实就是个递归的实现. 前面<Android触摸屏事件派发机制详解与源码分析一(

Android View系统分析之二View与ViewGroup

目录 在Android View系统分析之从setContentView说开来(一)一文中,我们从setContentView开始阐述了Android中的视图层次,从设置内容布局到整个视图层次的建立的过程.并且对View和ViewGroup的关系进行了简单的介绍,今天我们继续来深入的了解Android中的View和ViewGroup. ViewGroup与View的关系 我们在定义一个布局时,在它的顶层通常都是使用LinearLayout或者RelativeLayout等组件来包装一些子控件,例

Android之自定义流式布局FlowLayout

流式布局常常用于“热门标签”中,大概功能就是将所有的子View一行一行的排列,如果一行中剩下的空间不足以盛放下一个子View,则换到另一行继续排列.这样做的好处是不需要在主线程中自己麻烦定义控件的位置,只需要把生成的控件放到容器中,容器自己会自动排列.首先来看一下运行结果: Android中的自定义容器控件(继承自ViewGroup的控件)都有两个必须实现的方法:onMeasure()和onLayout() (1)onMeasure:测量子View的宽和高,设置自己的宽和高,根据自View的布局

Android应用层View绘制流程与源码分析

Android应用层View绘制流程与源码分析 1 背景 还记得前面<Android应用setContentView与LayoutInflater加载解析机制源码分析>这篇文章吗?我们有分析到Activity中界面加载显示的基本流程原理,记不记得最终分析结果就是下面的关系: 看见没有,如上图中id为content的内容就是整个View树的结构,所以对每个具体View对象的操作,其实就是个递归的实现. 前面<Android触摸屏事件派发机制详解与源码分析一(View篇)>文章的3-1

Android View measure流程详解

Android View measure流程详解 Android中View绘制的流程包括:measure(测量)->layout(布局)->draw(绘制). 因为Android中每个View都占据了一块矩形的空间,当我们要在屏幕上显示这个矩形的View的时候 首先我们需要知道这个矩形的大小(宽和高)这就对应了View的measure流程. 有了View的宽和高,我们还需要知道View左上角的起点在哪里,右下角的终点在哪里,这就对应了View的layout流程. 当矩形的区域在屏幕上确定之后,

chenglei1986/DatePicker源码解析(一)

DatePicker在android其实是有提供的一个控件,相信有不少的人使用过它,但是这个控件的外观我们只能做一些简单的设定(原生的),如果我们有更高需求,希望能自定义我们的datepicker的外观,希望赋予它更多的功能,我们就需要自定义一个datepciker控件. 在github上,我发现了一个chenglei1986/DatePicker的项目,可以实现上面的需求.地址是https://github.com/chenglei1986/DatePicker 这个自定义控件非常灵活,通过学

Android Json数据的解析+ListView图文混排+缓存算法Lrucache 仿知乎

前几天心血来潮,打算根据看知乎的API自己做一个小知乎,定制的过程遇到ListView的优化问题及图片未缓存重加载等等许多问题,解决了以后打算和博友分享一下. 接口数据:http://api.kanzhihu.com/getpostanswers/20150925/archive 首先,Json数据太常用,相信每一位开发者Json的解析都是必备的.我们要准备以下知识: JavaBean,枚举你需要的元素,用来存储数据. 异步加载网络内容的必备途径,多线程加载+AsyncTask两种方式. Jso

Fresco源码解析 - DraweeView

DraweeView 是Fresco的三大组件(Hierarchy.Controller.View) 之一,作为MVC模式中的 View,主要负责显示由 Hierarchy 提供的数据(placeholder.actual image.progress drawable等),Controller 作为幕后,负责获取数据. 继承体系 DraweeView 并不是是一个简单的自定义View,它必须要提供与 Hierarchy 和 Controller 交互的接口,DraweeView 的继承关系如下