首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > XML SOAP >

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

2012-11-06 
Android中measure过程、WRAP_CONTENT详解以及xml布局文件解析流程浅析(下)本文原创, 转载请注明出处:http:/

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绘制原理>    

   

热点排行