AndroidのSurface Viewの使用


AndroidでSurfaceHolderでSurfaceViewの図面を処理する
Surface Viewによるゲーム開発では、Canvasに描かれた効果やアニメーションをSurface Holderで処理する必要があります.表面、サイズ、ピクセルなどを制御します.
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);
//Surface Viewの現在の所有者にコールバックオブジェクトを与えます.
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);
					}
				}
			}
		}
	}
}