前言
自定义 View 时Android 开发中的一个热点知识,我们结合源码了解绘制 View 的必备知识。
流程
- measure 测量
- layout 位置
- draw 绘制
measure 测量
view 大小的测量是在 onMeasure 中实现的,测量过程用到了MeasureSpac,MeasureSpec是一个int类型的值,由高2位的规格模式和低30位的具体尺寸,由父View的MeasureSpec和子View的LayoutParams(LayoutParams就是我们在xml写的时候设置的layout_width和layout_height 转化而来的)通过计算得出一个针对子View的测量规格。
- MeasureSpac=测绘模式+数值
三种测绘模式:
1. EXCATlY 精确值模式:当我们在布局文件中定义准确的 dp 数值或者“match_parent”时,使用的就是精确值模式。
2. AT_MOST 最大值模式,使用 “warp_content” 时,根据内部元素大小确定,但不能大于父类控件的大小。
3.UNSPECIFIED View大小随意,一般在自定义View 才使用
layout 位置
怎样确定子控件在父控件中的位置?
我们用图说话
原谅我的PS绘图,通过子控件的四个参数(left,right,top,bottom)就能知道在父类控件中的位置。
控件左上角(left,top),控件右上角(bottom,right)
Let us read the fucking code:
draw 绘制
绘制是自定义 View 最最最最最最重要的部分。 Draw 用于把 view 绘制到屏幕上。
View 的绘制流程:
1. 绘制背景 background.draw(Canvas)
2. 绘制自己 onDraw()
3. 绘制子View dispatchDraw
4. 绘制装饰 onDrawScrollBars
View 会调用 dispatchDraw 遍历地掉用子控件的draw方法。