Android Canvas组件实例

本文是翻译自一篇英文教程Android Canvas Example,读者可以到原文章地址中下载源代码。在原文中,作者已经修改了在canvas上画图是程序崩溃的bug,我相信这个对初学者是一个非常好的学习实例。

Android系统提供一系列的图像接口,满足了大多数应用的需求。我们可以使用2D图像库和OpenGL ES1.0的3D函数库。在这片实例教程中,我们将讨论如何使用2D图形显示图像。在Android中,我们可以使用两种方式实现2D图像显示:

  1. 在layout xml文件中定义View对象
  2. 使用2D图像库直接在Canvas上绘制图像
举个例子,我们想显示一张图片在android屏幕上,我们可以再layout xml文件中定义ImageView对象来显示图片,也可以将图片加载到Bitmap对象中,然后绘制到Canvas上显示。使用何种发放取决于实际需求。本文中,讲简要介绍如何把图片加载到Bitmap对象中,并且画到canvas对象上。

在canvas对象上画图,一般使用onDraw()回调函数,我们可以使用SurfaceHolder.lockCanvas()来的到canvas。

public class DrawCanvas extends SurfaceView implements Callback {
private CanvasThread canvasThread;
 
public DrawCanvas(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
 
public DrawCanvas(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
 
this.getHolder().addCallback(this);
this.canvasThread = new CanvasThread(getHolder());
this.setFocusable(true);
}
 
public DrawCanvas(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
 
}
 
public void startDrawImage() {
canvasThread.setRunning(true);
canvasThread.start();
}
 
@Override
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
// TODO Auto-generated method stub
 
}
 
@Override
public void surfaceCreated(SurfaceHolder arg0) {
// TODO Auto-generated method stub
 
}
 
@Override
public void surfaceDestroyed(SurfaceHolder arg0) {
// TODO Auto-generated method stub
boolean retry = true;
canvasThread.setRunning(false);
while(retry) {
try {
canvasThread.join();
retry = false;
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
 
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
Bitmap sweet = BitmapFactory.decodeResource(getResources(), R.drawable.sq);
canvas.drawColor(color.black);
canvas.drawBitmap(sweet, 0, 0, null);
}
 
private class CanvasThread extends Thread {
private SurfaceHolder surfaceHolder;
private boolean isRun = false;
 
public CanvasThread(SurfaceHolder holder) {
this.surfaceHolder = holder;
}
 
public void setRunning(boolean run) {
this.isRun = run;
}
 
@Override
public void run() {
// TODO Auto-generated method stub
Canvas c;
 
while(isRun) {
c = null;
try {
c = this.surfaceHolder.lockCanvas(null);
synchronized(this.surfaceHolder) {
DrawCanvas.this.onDraw(c);
}
} finally {
surfaceHolder.unlockCanvasAndPost(c);
}
}
}
}
}

DrawCanvas继承了SurfaceView类,并且实现了Callback接口。在类定义中,画图的主要部分是onDraw函数。这个函数在一个线程CanvasThread中被调用。有兴趣的朋友可以到源地址中下载源代码来运行程序。

猜你喜欢

转载自blog.csdn.net/leojames102/article/details/7908083