您的位置:首页 > 移动开发 > Android开发

Android官方文档翻译--How Android Draws Views

2011-09-26 16:04 309 查看
Android如何绘制视图

当一个activity接收到焦点的时候,它将会被要求绘制界面布局。Android的framework将会处理绘制的过程,但是activity必须提供布局层的根节点。

绘制是从布局层的根节点开始的。它要度量和绘制布局树。绘制是通过遍历整个布局树然后渲染那些交叉于无效区域的视图。反之,每一个view group负责请求它的孩子进行绘制并且每一个则view负责自身。由于树的遍历是有序的,这就意味着父亲将会比孩子先绘制,并同其它绘制过的兄妹在树中有序出现。

绘制布局有两个阶段的过程:一个测量的阶段和布局的阶段。测量阶段是靠实现measure(int, int)方法,并且会从上自下遍历整个view树。每一个view在递归过程中会将尺寸往下拉动。在测量的最后阶段,每一个视图都都存储了自身的度量值。第二个阶段发生在layout(int, int, int, int) 并且也是从上自下的。在这个阶段没一个父亲负责使用在度量阶段计算的尺寸来定位它的孩子。

当每一个视图的measure()方法返回的时候,同那些所有的视图后代一起,它的getMeasuredWidth() , getMeasuredHeight()的值必须被设置。View的可度量的宽和高必须要遵照view的父亲所给的限制。这保证了在度量的最胡阶段,所有的父亲接受它们的孩子的度量值。一个父亲view可以在它的孩子上多次调用measure()方法,例如,父亲可以用不明确的尺寸发现他们到底需要多大来度量每一个孩子,然后再次调用measure()方法,当孩子的没受限制的尺寸的总和太大或是太小,就会使用实际的数据


度量阶段使用两个类来和尺寸交互。View.MeasureSpec类被view用来告诉它们的父亲他们想被如何度量和摆放。LayoutParsms 类只是描述view需要多宽和多高。对于每一个尺寸,可以指定为下面的之一:

一个确切的数字
FILL_PARENT, 这意味着视图想要和它的父亲一样大
WRAP_CONTENT, view只想包裹住自己的内容

LayoutParams的子类对应不同的ViewGroup的子类。例如,相对布局有它自己的LayoutParams的子类,包含了可以让子视图在中央水平和垂直布局的能力。

MeasureSpecs被用来将需求从树的父亲到孩子往下推进。MeasureSpecs只能是下面树模式中的一种:
UNSPECIFIED: 这被父亲用来决定需要哪个尺寸的子视图。例如,一个线性布局可以在它的孩子上调用measure()方法,并将高度设置为UNSPECIFIED,宽度为EXACTLY 240来发现子视图需要被给的240像素的高度有多高。
EXACTLY: 被父view用来给子view强加一个精确的大小。子view必须是这个大小,并确保它的后代都在这个大小范围之内。
AT_MOST: 被父view用来强加一个最大的大小给子view。子view必须是这个大小,并确保它的后代都在这个大小范围之内。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: