2011年5月31日火曜日

Androidでドライブレコーダー 2日目

片手まで、勉強しぃしぃやるので、完成までに非常に時間がかかるだろう。完成するかな?
昨日に引き続き、「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 件のコメント:

コメントを投稿