一、实现游戏框架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类的绘图函数。其他的步骤类似