昨日に引き続き、「SurfaceViewならAndroidで高速描画ゲームが作れる」でSurfaceViewについて、勉強中。
SurfaceViewのgetHolder()によりSurfaceHolderを取得することができるが、このSurfaceHolderって何?多分Canvasを保持するものだと思うんだけど、それってSurfaceViewがCanvasを保持すればいいんじゃないのかなぁ。SurfaceHolderが保持する理由がわからない。凝集性を高めるため?
SurfaceHolderは、lockCanvas()でCanvasを取得し、そのCanvasに描画をする。最後にSurfaceHolderのunlockCanvasAndPost(Canvas)で描画を完了する。描画処理のためのプレースホルダーとして、SurfaceHolderのコールバックがあるようだ。
SurfaceView関係のクラスとメソッドの一覧を見ると、やはり描画処理に関してはSurfaceHolderがコールバックで行うということで、ビュー自体と描画処理自体を分けてるってことかな?
あと、Canvasのsave()とrestore()がわからない。Canvas#save()は呼び出された状態を内部スタックに保存するとある。Canvas#restore()でスタックに保存した状態を復元するということである。
void doDraw() {
Canvas canvas = getHolder().lockCanvas();
canvas.save(); // ★ここで状態を保存
canvas.rotate(45.0f);
Paint paint = new Paint();
canvas.drawColor(Color.WHITE);
paint.setColor(Color.BLUE);
paint.setAntiAlias(true);
paint.setTextSize(24);
canvas.drawText("Hello, SurfaceView!", paint.getTextSize(), 0, paint);
canvas.restore(); // ★ここで状態を復元
getHolder().unlockCanvasAndPost(canvas);
}SurfaceViewならAndroidで高速描画ゲームが作れるより図を引用。
このようなサンプルだとsave()とrestore()を使用すると、「Canvasのsave()とrestore()の応用」のように画像を斜めに表示することができるとなっているが、この、save()とrestore()を書かないと斜めにならないのだろうか?
0 件のコメント:
コメントを投稿