读书人

Android中measure过程、WRAP_CONTENT详

发布时间: 2012-11-06 14:07:00 作者: rapoo

Android中measure过程、WRAP_CONTENT详解以及xml布局文件解析流程浅析(下)

本文原创, 转载请注明出处:http://blog.csdn.net/qinjuning



上篇文章<<Android中measure过程、WRAP_CONTENT详解以及xml布局文件解析流程浅析(上)>>中,我们

了解了View树的转换过程以及如何设置View的LayoutParams的。本文继续沿着既定轨迹继续未完成的job。

主要知识点如下:
1、MeasureSpc类说明
2、measure过程详解(揭秘其细节);
3、root View被添加至窗口时,UI框架是如何设置其LayoutParams值得。

在讲解measure过程前,我们非常有必要理解MeasureSpc类的使用,否则理解起来也只能算是囫囵吞枣。


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实例代表宽度或者高度

(只能是其一)要求。 它有三种模式:

①、UNSPECIFIED(未指定),父元素部队自元素施加任何束缚,子元素可以得到任意想要的大小;

②、EXACTLY(完全),父元素决定自元素的确切大小,子元素将被限定在给定的边界里而忽略它本身大小;

③、AT_MOST(至多),子元素至多达到指定大小的值。


常用的三个函数:

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

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

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


以上摘取自: <<MeasureSpec介绍及使用详解>>

1.2 MeasureSpc类源码分析 其为View.java类的内部类,路径:\frameworks\base\core\java\android\view\View.java


这张表格更能帮助我们分析View的MeasureSpec的确定条件关系。


为了帮助大家理解,下面我们分析某个窗口使用地xml布局文件,我们弄清楚该xml布局文件中每个View的

MeasureSpec值的组成。

  /**    * @param windowSize  The available width or height of the window    *    * @param rootDimension The layout params for one dimension (width or height) of the window.   */   private int getRootMeasureSpec(int windowSize, int rootDimension) {       int measureSpec;       switch (rootDimension) {       case ViewGroup.LayoutParams.MATCH_PARENT:           // Window can't resize. Force root view to be windowSize.           measureSpec = MeasureSpec.makeMeasureSpec(windowSize, MeasureSpec.EXACTLY);           break;       case ViewGroup.LayoutParams.WRAP_CONTENT:           // Window can resize. Set max size for root view.           measureSpec = MeasureSpec.makeMeasureSpec(windowSize, MeasureSpec.AT_MOST);           break;       default:           // Window wants to be an exact size. Force root view to be that size.           measureSpec = MeasureSpec.makeMeasureSpec(rootDimension, MeasureSpec.EXACTLY);           break;       }       return measureSpec;   }       


调用root View的measure()方法时,其参数是由getRootMeasureSpec()设置的,基本思路同我们前面描述的 差不多。贴出来的代码只是简简单单列出了measure 、layout 、 draw 过程的调用点,里面有很多逻辑处理, 阅读起来比较费劲,我也只能算是个囫囵吞枣水平。大家有兴趣地可以看看源码,加深理解。

最后,由于小子理解水平有限,可能很多地方让大家“丈二和尚--摸不着头脑”,给大家两个小建议吧: 1、仔细钻研源码 ; 2、想认真系统性研读UI绘制原理的话,建议详细阅读<<Android内核剖析>>第十三章 <UI绘制原理>


读书人网 >XML SOAP

热点推荐