android的SurfaceView的使用

android中用SurfaceHolder处理SurfaceView的画图
在用SurfaceView进行游戏开发过程中,用到SurfaceHolder来处理它的Canvas上画的效果和动画是必不可少的。用于控制表面,大小,像素等。
Abstract interface to someone holding a display surface. Allows you to control the surface size and format,
edit the pixels in the surface, and monitor changes to the surface. This interface is typically available
through the SurfaceView class.
其中特别要注意以下的几个函数:
abstract void addCallback(SurfaceHolder.Callback callback);
// 给SurfaceView当前的持有者一个回调对象。
abstract Canvas lockCanvas();
// 锁定画布,一般在锁定后就可以通过其返回的画布对象Canvas,在其上面画图等操作了。
abstract Canvas lockCanvas(Rect dirty);
// 锁定画布的某个区域进行画图等..因为画完图后,会调用下面的unlockCanvasAndPost来改变显示内容。
// 相对部分内存要求比较高的游戏来说,可以不用重画dirty外的其它区域的像素,可以提高速度。
abstract void unlockCanvasAndPost(Canvas canvas);
// 结束锁定画图,并提交改变。


import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;

public class GameView extends SurfaceView implements Callback {
public static final String tag = "GameView";
// 声明GameThread类实例
GameThread gameThread;

public GameView(Context context) {
super(context);
// TODO Auto-generated constructor stub
// 获取SurfaceHolder
SurfaceHolder surfaceHolder = getHolder();
// 添加回调对象
surfaceHolder.addCallback(this);
// 创建GameThread类实例
gameThread = new GameThread(surfaceHolder);
}

public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
// TODO Auto-generated method stub
Log.v(tag, "surfaceChanged");
}

public void surfaceCreated(SurfaceHolder arg0) {
// TODO Auto-generated method stub
Log.v(tag, "surfaceCreated");
// 启动gameThread
gameThread.start();
}

public void surfaceDestroyed(SurfaceHolder arg0) {
// TODO Auto-generated method stub
Log.v(tag, "surfaceDestroyed");
// 通过结束run()函数的方法结束gameThread,详见GameThread类的定义
gameThread.run = false;
}

/**
* GameThread的定义
*
* @author xingye
*/
class GameThread extends Thread {
SurfaceHolder surfaceHolder;
// run()函数中控制循环的参数。
boolean run = true;

public GameThread(SurfaceHolder surfaceHolder) {
this.surfaceHolder = surfaceHolder;
}

@Override
public void run() {
// TODO Auto-generated method stub
int i = 0;
while (run) {
Log.v(tag, "GameThread");
Canvas c = null;
try {
synchronized (surfaceHolder) {
// 我们在屏幕上显示一个计数器,每隔1秒钟刷新一次
c = surfaceHolder.lockCanvas();
c.drawARGB(255, 255, 255, 255);
c.drawText("" + i++, 100, 100, new Paint());
Thread.sleep(1000);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (c != null) {
surfaceHolder.unlockCanvasAndPost(c);
}
}
}
}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值