游戏开发-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类的绘图函数。其他的步骤类似
- 游戏开发-SurfaceView类使用详解
- Android游戏开发----动画SurfaceView详解
- Android游戏开发----动画SurfaceView详解
- android开发中使用surfaceView开发游戏
- Android游戏开发使用View还是SurfaceView
- Android游戏开发使用View还是SurfaceView
- Android开发中的游戏开发使用View还是SurfaceView?
- Android 开发中的游戏开发使用 View 还是 SurfaceView
- android 游戏开发 - 使用SurfaceView 创建你自己的View
- Android 游戏开发笔记一、入门之SurfaceView的使用
- android:使用SurfaceView游戏开发简单屏幕适配方法
- 安卓surfaceview使用之游戏首页开发
- Android 游戏开发 SurfaceView框架
- Android 游戏开发之 SurfaceView
- Android SurfaceView游戏开发示例
- Android SurfaceView游戏开发示例
- Android surfaceview使用详解
- Android SurfaceView使用详解
- Qt 提供的遍历器
- 链栈:初始化、判断栈空、入栈、出栈、获取栈顶元素等
- Windows GDI、DC
- Win7远程桌面防火墙设置
- myeclipse9.0 老是挂掉,处于假死状态,
- 游戏开发-SurfaceView类使用详解
- 练成Linux系统高手教程
- Aspose.Cells v7.5.3 支持读写HTML文件格式的页面设置选项
- java多线程返回函数结果
- [cocos2d-x]用CCSpriteBatchNode进行文理贴图的优化
- CreateProcess函数第二个命令行参数--(windows核心编程笔记)
- GDI+编程基础
- 掌控——构建Linux系统Nagios监控服务器
- Struts1.2.9 HelloWorld