SurfaceView下按HOME鍵、返回鍵的處理

最近做一個連連看遊戲,使用了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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章