现在的位置: 首页 > 综合 > 正文

SurfaceView下按HOME键、返回键的处理

2013年07月12日 ⁄ 综合 ⁄ 共 1618字 ⁄ 字号 评论关闭

最近做一个连连看游戏,使用了SurfaceView画图。通常按下HOME键时,游戏界面隐藏到后台,再次点击图标进入游戏时,应该返回之前的游戏的状态。

首先要理解SurfaceView的生命周期:

(1)程序第一次启动时,调用view的构造函数->surfaceCreated->surfaceChanged

(2)按HOME键时,调用surfaceDestroyed;点击图标返回程序时,调用surfaceCreated->surfaceChanged

(3)按返回键时,调用surfaceDestroyed;点击图标返回程序时,调用view的构造函数->调用surfaceCreated->surfaceChanged

所以正确的做法是:

(1)将线程设为view的成员

(2)在surfaceCreated中把线程new出来,并设置运行标志true、调用线程的start(不要在构造函数中new)

(3)在surfaceDestroyed中将运行标志设为false

 代码:

public class GameView extends SurfaceView implements SurfaceHolder.Callback {
	private GameViewDrawThread gameViewDrawThread;
	private GameActivity activity;
	public GameView(GameActivity gameActivity) {
		super(gameActivity);
		getHolder().addCallback(this);
		this.activity = gameActivity;
	}
	
	public void surfaceCreated(SurfaceHolder holder) {
		gameViewDrawThread = new GameViewDrawThread(this);
		gameViewDrawThread.setRunning(true);
		gameViewDrawThread.start();
	}
	
	public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {}
	
	public void surfaceDestroyed(SurfaceHolder holder) {
		gameViewDrawThread.setRunning(false);
	}
}
 
public class GameViewDrawThread extends Thread {
	GameView gameView;
	private boolean isRunning = true;
	SurfaceHolder surfaceHolder;

	public void setRunning(boolean bRun) {
		isRunning = bRun;
	}
	
	public GameViewDrawThread(GameView gameView) {
		this.gameView = gameView;
		this.surfaceHolder = gameView.getHolder();
	}

	public void run() {
		Canvas c;
		while (isRunning == true) {
			c = null;
			try {
				c = this.surfaceHolder.lockCanvas();
				synchronized (this.surfaceHolder) {
					gameView.doDraw(c);
				}
			} finally {
				if (c != null) {
					this.surfaceHolder.unlockCanvasAndPost(c);
				}
			}
			try {
				Thread.sleep(50);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}

没看懂的,可以参考http://blog.csdn.net/xiaominghimi/article/details/6149816

抱歉!评论已关闭.