Android View MeasureSpec详解

原创 2015年11月17日 21:05:50

1.MeasureSpc类说明

1.1 SDK 说明如下

   A MeasureSpec encapsulates the layout requirements passed from parent to child. Each MeasureSpec represents a requirement for either the width or the height. A MeasureSpec is comprised of a size and a mode. 

   即:MeasureSpc类封装了父View传递给子View的布局(layout)要求。每个MeasureSpc实例代表宽度或者高度(只能是其一)要求。 

简单理解为一个32位的数字,其中前2位和后30位分别代表SpecMode和SpecSize



它有三种模式(SpecMode):

    ①最高两位是00的时候表示"未指定模式",即MeasureSpec.UNSPECIFIED。父元素部队自元素施加任何束缚,子元素可以得到任意想要的大小;一般用于系统内部,表示一种测量的状态。

    ②最高两位是01的时候表示"'精确模式",即MeasureSpec.EXACTLY。父元素已经检测出该元素的确切大小,View的最终大小就是SpecSize所对应的值;对应LayoutParams中的match_parent和具体数值两种模式。

    ③最高两位是11的时候表示"最大模式",即MeasureSpec.AT_MOST。父容器指定了一个可用大小即SpecSize,View的大小不能大于这个值;对应LayoutParams中的Wrap_content

  常用的三个函数:

  static int getMode(int measureSpec)  :  根据提供的测量值(格式)提取模式(上述三个模式之一)

  static int getSize(int measureSpec)  : 根据提供的测量值(格式)提取大小值(这个大小也就是我们通常所说的大小)

  static int makeMeasureSpec(int size,int mode)  :  根据提供的大小值和模式创建一个测量值(格式)

1.2 MeasureSpc类源码分析 

public class View implements ... {
	 ...
	 public static class MeasureSpec {
        private static final int MODE_SHIFT = 30; //移位位数为30
        //int类型占32位,向右移位30位,该属性表示掩码值,用来与size和mode进行"&"运算,获取对应值。
        private static final int MODE_MASK  = 0x3 << MODE_SHIFT;

        //向右移位30位,其值为00 + (30位0)  , 即 0x0000(16进制表示)
        public static final int UNSPECIFIED = 0 << MODE_SHIFT;
        //向右移位30位,其值为01 + (30位0)  , 即0x1000(16进制表示)
        public static final int EXACTLY     = 1 << MODE_SHIFT;
        //向右移位30位,其值为02 + (30位0)  , 即0x2000(16进制表示)
        public static final int AT_MOST     = 2 << MODE_SHIFT;

        //创建一个整形值,其高两位代表mode类型,其余30位代表长或宽的实际值。可以是WRAP_CONTENT、MATCH_PARENT或具体大小exactly size
        public static int makeMeasureSpec(int size, int mode) {
            return size + mode;
        }
        //获取模式  ,与运算
        public static int getMode(int measureSpec) {
            return (measureSpec & MODE_MASK);
        }
        //获取长或宽的实际值 ,与运算
        public static int getSize(int measureSpec) {
            return (measureSpec & ~MODE_MASK);
        }

    }
	...
}




版权声明:本文为博主原创文章,未经博主允许不得转载。

ViewRoot,DecorView,MeasureSpec和View的工作原理——Android开发艺术探索笔记

ViewRoot,DecorView,MeasureSpec和View的工作原理。View的绘制流程是从ViewRoot的performTraversals方法开始的,它经过measure、layou...

Android中View内部类MeasureSpec研究

Android中View内部类MeasureSpec的使用

快速理解android View的测量onMeasure()与MeasureSpec

笔者之前有一篇文章已经使用onMeasure()解决了listview与scollview的显示冲突问题,博客地址如下: onMeasure简单方法 完美解决ListView与ScollView冲突问...

Android中view的测量过程中,很重要的也很难理解的一个东西MeasureSpec

Android的app开发时,自定义view是一个很普遍、重要、容易提升用户体验的一个办法。 自定义view的3个关键点是,测量、摆放、绘制。 本文主要就测量中一个很重要的也很难理解的东西Meas...

Android中自定义View的MeasureSpec使用

有时,Android系统控件无法满足我们的需求,因此有必要自定义View。具体方法参见官方开发文档:http://developer.android.com/guide/topics/ui/custo...

动态获取view 大小以及 MeasureSpec介绍及使用详解

getMeasuredHeight()与getHeight的区别 实际上在当屏幕可以包裹内容的时候,他们的值相等, 只有当view超出屏幕后,才能看出他们的区别: getMeasuredHeig...

Android自定义View:MeasureSpec的真正意义与View大小控制

自定义View是Android开发中最普通的需求,灵活控制View的尺寸是开发者面临的第一个问题,比如,为什么明明使用的是WRAP_CONTENT却跟MATCH_PARENT表现相同。...

ANDROID自定义视图——onMeasure流程,MeasureSpec详解

简介: 在自定义view的时候,其实很简单,只需要知道3步骤: 1.测量——onMeasure():决定View的大小 2.布局——onLayout():决定View在ViewGroup中的位置...

ANDROID自定义视图——onMeasure流程,MeasureSpec详解

原文  http://blog.csdn.net/a396901990/article/details/36475213 在自定义view的时候,其实很简单,只需要知道3步骤: 1.测...
  • gwe_f
  • gwe_f
  • 2015年04月26日 22:36
  • 251

Android自定义视图——onMeasure流程,MeasureSpec详解

转自:http://blog.csdn.net/a396901990/article/details/36475213 简介: 在自定义view的时候,其实很简单,只需要知道3步骤...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android View MeasureSpec详解
举报原因:
原因补充:

(最多只允许输入30个字)