当前位置:操作系统 > 安卓/Android >>

Android绘制视图

 

当一个Activity获得焦点,它会请求绘制其布局。Android框架将会管理绘制的过程,但是Activity必须提供布局层次中的根节点。

         绘制视图是从布局的根节点开始。请求计算和绘制布局树。绘制负责遍历树和渲染每个可交互的无效区域。依次的,每一个View group负责请求绘制其子View,每一个View负责绘制自己(利用draw()方法)。因为树是顺序遍历的,这就意味着先画父节点(父View在子View背后),然后依照树的次序来绘制其他同级节点。

         Android框架只会重绘无效的区域,而且还会帮你绘制背景图片。

         你能够利用invalidate()方法强制重绘View。

         绘制布局就是两个传递的过程:一个测量传递和布局传递。测量传递是实现measure(int,int)方法和从上至下遍历视图树。每一个视图在递归时传递尺寸规格下去。在尺寸传递的最后,每一个视图都存储了尺寸。第二个传递发生在layout(int,int,int,int)同样也是自上而下的。在这个传递期间每一个父节点都负责利用测量传递的数据计算其尺寸并且来定位其子节点。

         当View的measure()方法返回,它的getMeasuredWidth()和getMeasuredHeight()的值必须被设置,以及View所有后代的。View的测量宽度和测量高度的值必须符合View的父节点施加的约束。这样就可以保证测量传递的最后,所有的父节点接受他们子节点的尺寸值。一个父节可以会对其子节点调用多次measure()方法。比如,父节点可以通过每一个子节点不明确的尺寸调用measure()方法找出它们想要多大,然后就会使用实际的数值调用measure()方法,如果所有子节点没有受约束的尺寸的总大小太大了或太小了(既,如果子节点不同意每个之间的空间,父节点会介入并且设置第二阶段的规则)。

         更新一个布局,调用requestLayout()这个方法是通常View认为自己已经不适合当前的布局时调用。

         测量传递利用两个类来交流尺寸。

·TheView.MeasureSpec类通常用于View告诉他们的父节点他们想怎样计算和定位。

·基础的LayoutParams类只是描述View想要长和宽的大小。每一个尺寸都可以指定:

                 &一个确定的值

                  &FILL_PARENT,表示View想和父节点一样大小(减去填充)

                  &WRAP_CONTENT,表示View只是想包容其内容大小(加上填充)

 

         每一个ViewGroup的子类都有对应的LayoutParams子类。例如:RelativeLayout有它自己的LayoutParams,包括能够让子视图横向和纵向居中的能力。

         MeasureSpecs通常用于在树中沿着父节点到子节点下传需求,MeasureSpec可以是三种模式之一:

         &UNSPECIFIED:通常用于父节点决定要求子节点的尺寸。例如:LinearLayout可能在其子节点调用measure()方法,设置它的高为UNSPECIFIED,宽为EXACTLY 240找出子View在宽为240像素时的高度。

         &EXACTLY:通常用于父节点利用一个绝对的尺寸的child。child必须使用这个尺寸并且保证所有的子节点将会适应这个尺寸。

         &AT_MOST:通常用于parent利用最大值尺寸的child。这个child必须保证其所有的子节点适应这个尺寸。

作者:ldj299

补充:移动开发 , Android ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,