SurfaceViewを動かす


AndroidアプリにおいてはSurfaceViewは速度が安定しない(特にタブレット端末など、画面が大きいもので画像を動かそうとすると著しくパフォーマンスが落ちます)ので、本格的なゲームを作ろうとしているときなどはあまり使われません。

しかし、ちょっとした動きのあるアプリを作りたいときなどはこれで十分です。

とはいえ、情報があまりなく、独特なつくりなので実装しにくいViewではあります。

ちなみに、前回の記事の続きです。

[AnimationSurfaceView.java]

public class AnimationSurfaceView extends SurfaceView implements Runnable, SurfaceHolder.Callback {
	
	Canvas main_canvas;

	static final long FPS = 30;
	static final long FRAME_TIME = 1000 / FPS;
	SurfaceHolder surfaceHolder;
	Thread thread;
	int screen_width, screen_height;
	
	public AnimationSurfaceView(Context context) {
		super(context);
		surfaceHolder = getHolder();
		surfaceHolder.addCallback(this);
	}

	@Override
	public void run() {
		main_canvas = null;

		long loopCount = 0;
		long waitTime = 0;
		long startTime = System.currentTimeMillis();
		
		while (thread != null) {

			try {
				loopCount++;
				main_canvas = surfaceHolder.lockCanvas();

				//処理系
				Update();
				
				//描画系
				Draw();
 
				surfaceHolder.unlockCanvasAndPost(main_canvas);

				waitTime = (loopCount * FRAME_TIME) - (System.currentTimeMillis() - startTime);

				if (waitTime > 0) {
					Thread.sleep(waitTime);
				}
			} catch (Exception e) {
			}
		}
	}
	

	private void Draw() {
	}

	private void Update() {
	}

	@Override
	public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
		screen_width = width;
		screen_height = height;
	}

	@Override
	public void surfaceCreated(SurfaceHolder holder) {
		thread = new Thread(this);
		thread.start();
	}

	@Override
	public void surfaceDestroyed(SurfaceHolder holder) {
		thread = null;
	}
}

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください