作为Android Graphics专题的开篇,毫无疑问,我们将讨论Android UI技术的核心概念——Canvas。
Canvas是Android UI框架的基础,在Android的控件体系中,所有容器类、控件类在实现上都依赖于Canvas,界面的绘制实质上都是Canvas绘制的。本文将讨论Canvs的由来,并通过实例展示Canvas的基础用法。
对于应用开发而言,我们可以不去深究Canvas与Android 控件体系的实现细节,但明白Canvas与控件的关联有助于我们更好的使用Canvas。Android控件体系不是了解的朋友可以参见博文《Android原理揭秘系列之View、ViewGroup》。
先看下Android所有控件的基类——View.java的代码片段:
…
protected void onDraw(Canvas canvas) {
}
….
熟悉Andriod应用开发的人对onDraw方法一定不会陌生。View基类里onDraw方法里是空的,但请注意,方法传入了形参——Canvas对象,也就是说,Canvas对象是UI体系流程中已经创建好的,我们直接拿来用即可,一般不需要自己构造。Canvas的典型使用场景是,在自定义控件重载基类的onDraw方法,并在onDraw方法中通过Canvas绘制我们想要的图形、图片等效果。
我们再看看容器类的基类——ViewGroup.java的dispatchDraw方法的代码片段:
protected void dispatchDraw(Canvas canvas) {
…
for (int i = 0; i < count; i++) {
…
more |= drawChild(canvas, child, drawingTime);
}
…
}
dispatchDraw方法是ViewGroup分发绘制子View的核心函数,其通过drawChild方法具体绘制各个子View。这里我们只需要注意Canvas对象的出现位置,同样,Canvas作为形参从dispatchDraw方法传入,并传给drawChild方法用以绘制子view。
通过View和ViewGroup两个核心函数的代码片段分析,我们能够非常清晰的明确Canvas在控件体系中的作用,以及我们接下来将讨论的Canvas用法的canvas对象来自何处。
Canvas在概念上可以理解为其它编程语言中的画布,在画布中,我们可以绘制各种图形,也可以绘制图片,更深层次的,如上ViewGroup的dispatchDraw方法所描述的,我们可以通过变换Canvas,进而在容器内中自定义的绘制子控件。
本文只讨论Canvas的基础用法,即在自定义控件重载的onDraw方法中,使用Canvas来绘制基本的图形、图像等基础用法。