android学习——MeasureSpec介绍及使用

来源:互联网 发布:gta5最漂亮的捏脸数据 编辑:程序博客网 时间:2024/06/06 18:00
一、MeasureSpc类说明  SDK的介绍:MeasureSpc类封装了父View传递给子View的布局(layout)要求。每个MeasureSpc实例代表宽度或者高度

它有三种模式:
①、UNSPECIFIED(未指定),父元素部队自元素施加任何束缚,子元素可以得到任意想要的大小;
②、EXACTLY(完全),父元素决定自元素的确切大小,子元素将被限定在给定的边界里而忽略它本身大小;
③、AT_MOST(至多),子元素至多达到指定大小的值。

常用的三个函数:
static int getMode(int measureSpec) : 根据提供的测量值(格式),提取模式(上述三个模式之一)
static int getSize(int measureSpec) : 根据提供的测量值(格式),提取大小值(这个大小也就是我们通常所说的大小)

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


MeasureSpec类的处理思路是:
右移运算,使int 类型的高两位表示模式的实际值,其余30位表示其余30位代表长或宽的实际值----可以是WRAP_CONTENT、MATCH_PARENT或具体大小exactly size。通过掩码MODE_MASK进行与运算 “&”,取得模式(mode)以及长或宽(value)的实际值。

MeasureSpec . makeMeasureSpec 方法,实际上这个方法很简单:

1 public static int makeMeasureSpec(int size, int mode) {2             return size + mode;3      }


二、measure过程详解

UI框架开始绘制时,皆是从ViewRoot.java类开始绘制的:

ViewRoot类简要说明: 任何显示在设备中的窗口,例如:Activity、Dialog等,都包含一个ViewRoot实例,该类主要用来与远端 WindowManagerService交互以及控制(开始/销毁)绘制。

1、开始UI绘制 , 具体绘制方法则是:

//开始View绘制流程  private void performTraversals(){      ...      //这两个值我们在后面讨论时,在回过头来看看是怎么赋值的。现在只需要记住其值MeasureSpec.makeMeasureSpec()构建的。      int childWidthMeasureSpec; //其值由MeasureSpec类构建 , makeMeasureSpec      int childHeightMeasureSpec;//其值由MeasureSpec类构建 , makeMeasureSpec      // Ask host how big it wants to be      host.measure(childWidthMeasureSpec, childHeightMeasureSpec);      ...  }  ...  View Code 

2、调用measure()方法去做一些前期准备 measure()方法原型定义在View.java类中,final修饰符修饰,其不能被重载:


0 0
原创粉丝点击