游戏开发-SurfaceView类使用详解

来源:互联网 发布:手机淘宝对话框打不开 编辑:程序博客网 时间:2024/05/16 12:58

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

原创粉丝点击