1. 作用
绘制View视图
2. 储备知识
3. draw过程详解
类似measure过程、layout过程,draw过程根据View的类型分为2种情况:
接下来,我将详细分析这2种情况下的draw过程
3.1 单一View的draw过程
应用场景
在无现成的控件View满足需求、需自己实现时,则使用自定义单一View
- 如:制作一个支持加载网络图片的ImageView控件
- 注:自定义View在多数情况下都有替代方案:图片 / 组合动画,但二者可能会导致内存耗费过大,从而引起内存溢出等问题。
具体使用
继承自View、SurfaceView 或 其他View;不包含子View
原理(步骤)
- View绘制自身(含背景、内容);
- 绘制装饰(滚动指示器、滚动条、和前景)
具体流程
下面我将一个个方法进行详细分析:draw过程的入口 = draw()
至此,单一View的draw过程已分析完毕。
总结
单一View的draw过程解析如下:
即 只需绘制View自身
3.2 ViewGroup的draw过程
应用场景
利用现有的组件根据特定的布局方式来组成新的组件
具体使用
继承自ViewGroup 或 各种Layout;含有子 View
如:底部导航条中的条目,一般都是上图标(ImageView)、下文字(TextView),那么这两个就可以用自定义ViewGroup组合成为一个Veiw,提供两个属性分别用来设置文字和图片,使用起来会更加方便。
原理(步骤)
- ViewGroup绘制自身(含背景、内容)
ViewGroup遍历子View & 绘制其所有子View,类似于单一View的draw过程 - ViewGroup绘制装饰(滚动指示器、滚动条、和前景)
自上而下、一层层地传递下去,直到完成整个View树的draw过程
具体流程
下面我将对每个步骤和方法进行详细分析:draw过程的入口 = draw()
由于 步骤2:drawBackground()、步骤3:onDraw()、步骤5:onDrawForeground(),与单一View的draw过程类似,此处不作过多描述
下面直接进入与单一View draw过程最大不同的步骤4:dispatchDraw()
至此,ViewGroup的draw过程已分析完毕。
总结
ViewGroup的draw过程如下:
4. 其他细节问题:View.setWillNotDraw()
5. 总结
本文全面总结了自定义View的Draw过程,总结如下
View类型 |
绘制流程(Draw) |
单一View |
仅绘制视图View本身。 |
视图组ViewGroup |
绘制视图本身和包含的所有子View。 |