View工作流程
View工作流程主要指measure、layout、draw这三个流程,即测量、布局和绘制,其中measure确定View的自身的宽高,layout确定View在父容器放置的位置,draw将View绘制到屏幕上。
measure
为了更好理解measure过程,先了解MeasureSpec,MeasureSpec代表一个32位int值,高2位代表SpecMode,低30位代表SpecSize(这句话不知道几个意思)。SpecMode指的测量模式,SpecSize指在某种测量模式下规格大小。
SpecMode有三种:
- EXACTLY
精确值模式,父容器已经检测出View所需要的精确大小,这时候View的最终大小就是SpecSize所指定的值。它对应代码LayoutParams(控件layout_width属性和layout_height属性)中match_parent和具体数值。 AT_MOST
最大值模式,父容器指定了一个可用大小值,只要不超过父容器允许最大尺寸即可。它对应代码LayoutParams(控件layout_width属性和layout_height属性)中wrap_content。UNSPECIFIED
父容器不对View有任何限制,要多大给多大,如ListView。
自定义控件不重写onMeasure(),View类默认只支持EXACTLY模式,如果让View支持wrap_content属性,必须重写onMeasure()来指定wrap_content大小。代码如下:
setMeasuredDimension方法会设置View宽/高的测量值
layout
layout的作用是ViewGroup用来确定子元素的位置,当ViewGroup的位置被确定后,他在onLayout会遍历所有子元素并调用其layout方法。
layout方法大致流程:首先通过setFrame设定View四个顶点位置,View四个顶点一旦确定,那么它在父容器中位置也就确定了。
draw
重写onDraw()方法,并在Canvas对象上绘制所需要的图形,简而言之,有画笔和画布就可:
Android 画笔Paint
Android 画布Canvas
Android之画笔Paint和画布Canvas及实例练习圆角、刮刮卡、圆形头像、倒影效果
自定义attrs属性
attrs.xml
values目录下创建attrs.xml
这里format的color指的颜色。
其他:reference指资源ID;
dimension指尺寸;
string、integer、boolean指基本数据类型。
也可以用“|”来分隔不同的属性。
完整代码
|
|
xml引用
|
|
布局文件添加schemas声明: xmlns:circle=”http://schemas.android.com/apk/res-auto“ ,这里circle是自定义前缀,名字随便取。但与下面CustomView中自定义属性circle:circle_color=””前缀一致。另外也可以声明 xmlns:circle=”http://schemas.android.com/apk/res/包名“ ,效果是一样的。
参考
《Android群英传》
《Android开发艺术探索》
更新日志
- 2017.03.02 修改
- 2016.01.01 撰写