`

Android 是怎样画视图的

 
阅读更多
当一个activity取得焦点时,它将被要求去画出它的布局(layout),android将获得画这个视图的进程,但这个activity必须

要提供它的布局结构的根节点。

画布局开始于这个布局的根节点。他必须检测和画出这个布局结构(layout tree)。沿着这个布局结构画出布局

每个视图组(view group)负责画出它的每个子视图(用draw()),并且视图(view)负责画出他自己。

因为布局树是倒过来的,所以父节点比他的子节点先画,兄弟节点按他的先后顺序被画出。

    画一个视图要经过两个处理:一个检测处理和一个布局处理。检测处理由measure(int, int)实现从头到尾的检测视图树

通过递归遍历这个视图树。在检测处理的最后每个视图将会储存它的检测结果。第二个的布局处理发生在layout(int, int, int, int)

他也是从头到尾的,在这个过程中,每个父节点将会通过上一个检测处理得到的元素尺寸定位它的子节点的位置。

   当一个视图的measure()返回时,它的getMeasuredWidth() 和 getMeasuredHeight()的值必须被设定,用于它的所有子节点使用。

这个检测处理过程用两个类去交流数据:这个View.MeasureSpec类用于告诉他们的父节点他们想要怎样的尺寸和位置。然后基本LayoutParams类将

用于描述视图想要多大的长和宽。每个元素的尺寸必须指定以下三个之一:

1.精确的值

2.LL_PARENT。这意味着View想设定为同它的父结点一样大

3.WRAP_CONTENT 只需要能达到它的内容显示 

每一个ViewGroup类有相应的LayoutParams子类,用来描述它的尺寸和定位信息

MeasureSpec被用来自顶向下(通过View tree)传递各种尺寸和定位需求。

每一个MeasureSpec能够是下列3种模型中的一个:

1.UPSPECIFIED。

2.EXACTLY。

3.AT_MOST

参考:
http://blog.csdn.net/qinjuning/article/details/7110211
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics