How Android Draws Views

来源:互联网 发布:mac怎么调整图片方向 编辑:程序博客网 时间:2024/05/21 18:45


翻译自http://developer.android.com/guide/topics/ui/how-android-draws.html


当Activity获得焦点时,就会被要求画出布局。安卓框架会处理绘图的过程,但是Activity必须提供布局架构的根节点。


绘图从layout的根节点开始。框架会遍历layout树,同时渲染处于有效区域的view。同样的,绘图过程中 ViewGroup负责要求它的每个孩子调用draw函数。因为树是按顺序遍历的,所以父视图会先于子视图被画出来。


画出布局是两个传递过程:measure pass和layout pass。前者由measre(int, int)实现,是从顶向下的遍历过程。在measure过程的最后,每个视图都存储了自己的尺寸。后者由layout(int, int, int, int)实现,也是自顶向下的过程。该过程中每个父视图负责使用measure pass中计算好的尺寸放置它的子视图。


视图的测量宽度和测量高度必须遵从自己父视图加以的限制。一个父视图可能对它的所有孩子视图调用measure()超过一次。例如,父视图可能传递unspecified去measure它的每个孩子,以计算每个孩子想要多大的位置。如果所有孩子视图的总面积太大或者太小,这时再次调用measure(),传递实际的数字,父视图会在第二次pass中协调子视图的位置,并设定规则。


measure pass使用两个类去传递参数。

1. ViewGroup.LayoutParams 

用于view告诉父视图自己想被怎么measure和position。在高和宽上,LayoutParams能被一下之一设定:

精确的数字

MATCH_PARENT:和父视图一样大

WRAP_CONTENT:只是足够大去放置所有的内容,包括padding

RelativeLayout拥有ViewGroup.LayoutParams 的子类,增加了把子视图水平和垂直居中的能力。

2.MeasureSpec

用于父视图自顶向下将要求加于子视图。常量有:

UNSPECIFIED

EXACTLY

AT MOST: 子视图的最大值

0 0
原创粉丝点击