canvas中包含了作图的方法。 完成作图过程,最基本的四大组件是,canvas, bitmap, drawing prmitive, paint. 其中canvas是画布,包含了作图的方法。作图方法最终需要保存在bitmap当中。 作图的图元,如矩形,轨迹,字,bitmap(是一个图形),paint相当于颜料,它指定了作图的颜色和作图的风格。
利用canvas作图,有几种方法,一般而言,用户使用view布局作图,这种方法适合对性能不敏感,并且控件不需要动态改变的情况。
如果用户需要自己作图,如video game。则有两种方法。
1)可以直接利用view,重载onDraw方法,调用canvas的drawing calls来作图;这种作图过程占用的是UI thread.
2) 或者利用surfaceview作图。这种作图方法会创建单独的thread,作图更快速。
以上的总结来自于这篇文章,它介绍了如何使用canvas作图的基本方法。
下面两篇文章给出了实例,如何在canvas上,利用custom view作图
下面的代码实例中,显示了如何利用canvas 往surfaceview作图。
package org.example.sudoku;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.SurfaceHolder.Callback;
import android.view.animation.Animation;
public class MySurfaceView extends SurfaceView implements Callback, Runnable {// 备注1
private SurfaceHolder sfh;
private Thread th;
private Canvas canvas;
private Paint paint;
private int ScreenW, ScreenH;
public MySurfaceView(Context context) {
super(context);
th = new Thread(this);
sfh = this.getHolder();
sfh.addCallback(this); // 备注1
paint = new Paint();
paint.setAntiAlias(true);
paint.setColor(Color.RED);
this.setKeepScreenOn(true);// 保持屏幕常亮
}
@Override
public void startAnimation(Animation animation) {
super.startAnimation(animation);
}
public void surfaceCreated(SurfaceHolder holder) {
ScreenW = this.getWidth();// 备注2
ScreenH = this.getHeight();
th.start();
}
private void draw() {
try {
canvas = sfh.lockCanvas(); // 得到一个canvas实例
canvas.drawColor(Color.WHITE);// 刷屏
canvas.drawText("Himi", 100, 100, paint);// 画文字文本
canvas.drawText("这就是简单的一个游戏框架", 100, 130, paint);
} catch (Exception ex) {
} finally { // 备注3
if (canvas != null)
sfh.unlockCanvasAndPost(canvas); // 将画好的画布提交
}
}
public void run() {
while (true) {
draw();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
}
}
代码解释:
0) surfaceview初始化的时候,创建了一个thread。因为这个surfaceview 继承与runnable接口,所以this指针可以传给这个thread.
当这个thread开始运行时,它会从this.run ()开始运行。
1) surface创建的时候,会调用到surfaceCreated()。这个函数中调用了一个thread.start()。这样这个thread就运行在run()函数当中。
2)run函数调用draw()方法,绘制图形。