Android 怎样绘制视图
当一个活动获取焦点,要绘制自己的布局。Android框架会操作绘图过程,但是活动必须提供布局层次的根节
点。
绘图开始于布局的根节点。它需要调整并绘制布局树。通过遍历树和描绘相交于无效区域的每个视图操作绘
图(????)。反过来,每个视图组是要求它的每个子节点被绘制(使用draw()方法),并且每个视图要求
绘制出自己。由于树是按照次序遍历的,意味着父节点在子节点前被绘制,而兄弟节点按照出现在树的次序被
绘制。
(注:框架将不会绘制不在无效的区域的视图,也将考虑制定背景。你可以强制绘制视图,通过调用
invalidate()方法)
绘制布局有两个过程:一个衡量阶段和一个布局阶段。衡量阶段是实现了measure(int,int)接口,并且从上
而下遍历视图树。每个视图递归设置尺寸规格到树。在衡量阶段的最后,每个视图都存有自己的尺寸。第二阶
段发生在layout(int,itn,int,int),也是从上而下。这个阶段,每个父节点将在衡量阶段已经计算了大小的子
节点安排好位置。
当一个View的measure()方法返回值,除了全部视图的派生,还有他的getMeasureWidth()和
getMeasureHeight()值必须设置。View标准的宽和高值必须符合View父节点附加的约束。在衡量阶段的最后要
保证所有父节点能接受他们的子节点的尺寸。父View可以多次调用measure()方法在子节点上。例如,如果子
View的不约束大小太大或太小(如果子节点不满意他们所得的空间,父节点就要在第二阶段阻止并指定规则)
,父View可以测量每个没有指定尺寸的子View,找出来他们需要多大空间,然后调用measure()方法重新给子
View确切的数值。
衡量阶段用到两个类表示尺寸。View可以用View.Measurespec类通知父类怎样测量放置。基类LayoutParams
只描述了View的宽和高多大。对于每个尺寸,能用下面的任意一个:1、一个精确的数值 2、FILL_PARENT,跟
父节点一般大 3、WRAP_CONTENT,它内容的大小。
(注:创始布局,调用requestLayout ()。View不再合适当前区域内时通常对自己调用这个方法。)
LayoutParams类的子类有些是不同于ViewGroup的子类。例如,RelativeLayout有自己的包含能够水平和垂直
方向居中的LayoutParam子类。
MeasureSpecs被用在放置要求到树从父节点到子节点。MeasureSpec能是下面三个模式之一:1、UNSPECIFIED,
用在父节点测定子View的期望尺寸。例如,LinearLayout能调用measure()在它高为UNSPECIFIED、宽为WXACTLY
240的子节点,查出子View希望给240像素的高度。 2、EXACTLY,用于父节点给子节点设置一个确切的数值。子
节点必须用这个值,还要保证它的子类在这个值内。 3、AT_MOST,用于父节点给子节点设置一个最大值。子节
点必须用这个值,还要保证它的子类在这个值内。