为了在SurfaceView上画图,我们定义一个MySurfaceView类,该类继承SurfaceView并且实现SurfaceHolder.Callback接口。在surfaceCreated方法中我们启动一个线程,在该线程中实现对画布canvas的操作。
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
/**
*
* @author xu duzhou
*
*/
public class Mysurfaceview extends SurfaceView implements Callback {
SurfaceHolder holder;
MysurfaceviewThread mysurfaceviewThread;
public Mysurfaceview(Context context) {
super(context);
// TODO Auto-generated constructor stub
holder = getHolder();//获取SurfaceHolder对象,同时指定callback
holder.addCallback(this);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
// TODO Auto-generated method stub
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
// 当SurfaceView被创建时,将画图Thread启动起来。
mysurfaceviewThread = new MysurfaceviewThread();
mysurfaceviewThread.start();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// 当SurfaceView被销毁时,释放资源。
if (mysurfaceviewThread != null) {
mysurfaceviewThread.exit();
mysurfaceviewThread = null;
}
}
/**
* 内部类 MysurfaceviewThread,该类主要实现对canvas的具体操作。
* @author xu duzhou
*
*/
class MysurfaceviewThread extends Thread {
private boolean done = false;
public MysurfaceviewThread() {
super();
this.done = false;
}
public void exit() {
// 将done设置为true 使线程中的while循环结束。
done = true;
try {
join();
} catch (Exception e) {
// TODO: handle exception
}
}
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
SurfaceHolder surfaceHolder = holder;
int i = 1;
int j = 0;
while (!done) {
if (i > j) {
j = i;
i++;
} else {
j = i;
i--;
}
synchronized (surfaceHolder) {
//锁定canvas
Canvas canvas = surfaceHolder.lockCanvas();
//canvas 执行一系列画的动作
canvas.drawColor(Color.BLACK);
Bitmap _bit = BitmapFactory.decodeResource(getResources(),
R.drawable.ic_launcher);
canvas.drawBitmap(_bit, 10 + i, 10 + i, null);//使用默认的Paint对象
//释放canvas对象,并发送到SurfaceView
surfaceHolder.unlockCanvasAndPost(canvas);
}
if (i == 100) {
j = i;
}
if (i == 1) {
j = 0;
}
}
}
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new Mysurfaceview(this));
}
程序运行结果就是 图片来回的运动如下图: