一、实现游戏框架SurfaceView
public class MySurfaceView extends SurfaceView implements Callback, Runnable { private SurfaceHolder surfaceholder; //surface控制器 private Thread thread; //Runnable接口对应的线程 //构造函数实现 public MySurfaceView(Context context) { super(context); thread = new Thread(this); //创建一个本类自带线程,可以运行本类的重载的run()函数 surfaceholder = this.getHolder(); //获取surface控制器 surfaceholder.addCallback(this); // 添加回调函数,使surfaceCreated等回调函数有效 } @Override public void surfaceCreated(SurfaceHolder holder) {//在创建时,开始线程,运行自带的run()函数 thread.start(); } //Runnable接口重载的run()函数 public void run() { //循环执行每过指定时间重新画图, 从而实现动画效果 while (true) { draw(); try { Thread.sleep(100); } catch (InterruptedException e) { } } } //在surface的大小发生改变时激发 public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } //销毁时激发,一般在这里将画图的线程停止、释放。 public void surfaceDestroyed(SurfaceHolder holder) { } //实现画图 private void draw() { try { //通过surface控制器获取surface上的画布,并锁定画布 Canvas canvas = surfaceholder.lockCanvas(); //开始绘画操作 canvas.drawColor(Color.WHITE); canvas.drawText("Himi", 100, 100, paint); canvas.drawText("游戏框架", 100, 130, paint); } catch (Exception ex) { } finally { //结束锁定画布,并将画好的画布提交。 if (canvas != null) sfh.unlockCanvasAndPost(canvas); } } }
整个流程如下:
1、继承SurfaceView并实现SurfaceHolder.Callback接口和Runnable接口。
2、通过SurfaceView.getHolder()获得SurfaceHolder对象。
3、通过SurfaceHolder.addCallback(callback)添加回调函数。
4、创建一个本类自带线程,可以运行本类的重载的run()函数
5、在surfaceCreated函数中启动线程。使运行线程函数run()
6、在线程函数里实现绘画:
先通过SurfaceHolder.lockCanvas()获得Canvas对象并锁定画布,然后绘画,最后通过SurfaceHolder.unlockCanvasAndPost(Canvas canvas)结束锁定画图,并提交画布
7、销毁时激发surfaceDestroyed函数,一般在这里将画图的线程停止、释放。
二、activity中加载这个游戏框架
setContentView(MySurfaceView);
三、游戏框架SurfaceView的另外一种实现:
public class GameSurfaceView extends SurfaceView implements SurfaceHolder.Callback {//继承SurfaceView并实现SurfaceHolder.Callback接口,没有Runnable接口 MyThread myhread; //构造函数 public GameSurfaceView(Context context) { super(context); myhread = new MyThread(); //获取Surface控制器 this.holder = this.getHolder(); //添加回调函数 holder.addCallback(this); } //绘制界面 protected void onDraw(Canvas canvas) { super.onDraw(canvas); } public void surfaceCreated(SurfaceHolder holder) {//创建时启动线程 mythread.start(); } //内部线程类 class MyThread extends Thread { //运行函数 public void run() { while (go_on) { try { Thread.sleep(100); } catch (InterruptedException e) { } synchronized (holder) { Canvas canvas = holder.lockCanvas(); //绘制画面 GameSurfaceView.this.onDraw(canvas); holder.unlockCanvasAndPost(canvas); } } } } }
说明:因为没有实现Runnable,所以要自创一个内部线程类,并在构造函数是创建对象,线程类的run函数要调用GameSurfaceView类的绘图函数。其他的步骤类似