关闭

android学习——MeasureSpec介绍及使用

115人阅读 评论(0) 收藏 举报
分类:
一、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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:44534次
    • 积分:1911
    • 等级:
    • 排名:千里之外
    • 原创:81篇
    • 转载:29篇
    • 译文:66篇
    • 评论:5条
    文章分类