How Android Draws Views

一个Activity获取焦点后,android框架就会要求这个Activity绘制它的layout。android框架负责处理画的过程,但是这个Activity必须提供layout层次的root node。

绘制的动作开始于layout的root node。框架要求这个root node 测量(measure)和绘制(draw) 这个layout树.绘制的过程就是遍历整个layout树,并且渲染(rendering)每一个与无效区域(invalid region)相交的View。每一个View group负责依次请求它的children绘制自身,每个View都会负责绘制自己。因为是按顺序遍历树,也就是说父节点先于它的子节点绘制,兄弟节点根据它们在树中出现的顺序绘制。

绘制分两个过程:测量过程和布局过程:测量过程是在measure(int,int)函数中实现的,并且这个过程是自上而下的遍历整个View树的过程,在这个过程中每个View都会把自己的尺寸限制沿树向下传递。在测量过程的最后,每个View都会存储自己的尺寸。第二个过程发生在layout(int,int,int,int)函数中,并且它也是一个自上而下的过程。在这个过程中,每个父节点根据测量过程测量的尺寸来决定它的子节点的位置布局。

当一个View的measure()函数返回时,它的getMeasuredWidth()和getMeasureHeight()方法的返回值必须是已经设置好了,(译注:实际上测量过程是这样的:父节点会调用子节点的measure()的方法并把尺寸限制要求传递进来,这个方法是final的,也就是你不能覆写它。而measure会调用OnMeasure()方法,你通常会覆写这个方法,并在这个方法里根据限制条件实现测量动作并调用setMeasuredDimension(int width, int height)把结果保存,然后呢父节点会调用getMeasuredWidth()和getMeasuredHeight()方法取的测量结果,父节点根据这个结果来决定怎么布局它的子节点的View)相应这个View的子View也必须遵循这个规则。一个View的measured width 和measured height必须遵守父节点对它的尺寸约束。这就保证了在测量过程结束后所有的父节点都能接受它所有子节点的尺寸。一个父节点可能多次调用它子节点的measure()方法。例如:父节点不限制的情况下先调用一次它所有子节点的measure()方法来看看它们一共想要多大的尺寸,所有子节点在没有限制条件下的尺寸要求的总和如果太大或者太小,那么父节点就会用实际数字(译注:就是加上限制条件)再次调用measure()(即, 如果孩子不同意它们之间所分配获得的空间大小, 那么父节点将进行调停,并在第二个过程中设定限制条件)。

测量过程使用两个类来传递尺寸信息。ViewGroup.LayoutParams被View用来告诉它的父节点它想要的大小和放置。而ViewGroup.LayoutParams只是描述View想要多宽多高。具体每个尺寸规格,它可以指定如下值:

  一个精确的数字

  FILL_PARENT,意味着view想尽量和它的父节点一样大。(减去父节点的Padding)

  WRAP_CONTENT,意味着view想要适应其内容大小的尺寸(加上自己的Padding)

 

不同的ViewGroup子类有对应不同的LayoutParams子类。例如:RelativeLayout拥有对应的LayoutParams子类,这个LayoutParams的子类有在水平、竖直方向让View居中放置的能力。

MeasureSpecs 用于父节点到子节点向下传递限制规则。它可以为如下三种模式之一:

  UNSPECIFIED:父节点用该值来限制其子节点所渴望的大小。例如,一个LinearLayout可以调用其子节点的measure()函数,并把高度规定为UNSPECIFIED而宽度规定为EXACTLY 240,来看看在宽度240个像素的规定下,这个子节点想要多高。

  EXACTLY:父节点用该值强加一个精确的值给它的子节点。这个子节点必须用这个尺寸,并保证它(这个子节点)所有的子节点都在这个尺寸范围内。

  AT_MOST:父节点用该值强加一个最大值给它的子节点。这个子节点必须保证它和它的子节点必须在这个范围之内。

 

参考文档:android API英文版

     http://blog.sina.com.cn/s/blog_69a4fbd70100rgkn.html

     http://notfatboy.iteye.com/blog/583914

  

posted @ 2012-09-05 01:16  zhaoke5421  阅读(198)  评论(0编辑  收藏  举报