安卓使用除了使用已有图片之外,还可以画图。前者由drawable完成,而后者则由Canvas等完成。本篇探讨后者,安卓画图涉及到的类,以及绘图机制的研究。
绘制一副图形,有四个基本构成:一个hold像素点的Bitmap;一个进行绘制调用(写到bitmap中)的Canvas;一个基本绘画图形(例如Rect,Path,text,Bitmap),和一支画笔(定义了线条的颜色,样式等;Paint类)。
Canvas:
Canvas有两个构造函数:
- Canvas(),空的构造函数,使用这个构造函数表明是绘制到一块空白的画布上。此时Bitmap不必要。
- Canvas(Bitmap bitmap),接下来的图形是绘制到这个bitmap上的。
接下来看看Canvas的两个public函数,理解Canvas是怎么进行“绘制调用”的。
void drawRect(Rect r, Paint paint);
void drawRect(float left, float top, float right, float bottom, Paint paint);
看看上面两个函数的应用实例:
Canvas canvas = new Canvas();
Paint paint = new Paint();
RectF re1 = new RectF(10, 240, 70, 270);
canvas.drawRect(re1, paint);
canvas.drawRect(10, 240, 70, 270);
从上面的示例中,可以知道Canvas类中定义了许多图形的绘制方法,比如矩形,圆形,线条,文字等等,这些是进行画图的基本操作。Canvas的作用就是提供这些基本操作的调用。
至于Paint类以及画图操作的Rect,Path,Circle等类查看API可以获取它们的应用信息。
那么在应用中如何画图操作是如何应用的呢?如果有Bitmap,那么很简单,直接绘制到这个Bitmap上,那么应用则交给这个Bitmap。Bitmap作为背景图片或作为控件背景等就不需要我们操心了。那么如果是绘制到一块空的画布上呢?这会空的画布有了图形之后如何被应用程序使用呢?查看下面的示例即可明白:
public class MyView extends View{
public MyView(Context context, AttributeSet set){
super(context, set);
}
protected void onDraw(Canvas canvas){
super.onDraw(canvas);
camvas/drawColor(Color.WHITE);
Paint paint = new Paint();
paint.setColor(Color.BLUE);
canvas.drawRect(...);
.
.
.
}
}
从上面的示例可知,图形最终需要交给某个继承自View的视图控件,而绘制过程则在这个控件的onDraw(canvas)回调中完成。