第4話 矩形描画

 前回、文字描画が出来ましたので、今回は図形を描画してみたいと思います。当然ながら Android でも様々な図形を描画することができるのですが、とりあえずは一番簡単な図形である「矩形」を描画してみたいと思います。まあ、矩形の描画さえ出来れば、他のものは API マニュアルを見ただけで、その解説が英語であろうともなんとなく使えるようになるかと思いますので。

 ソースは前回のものを引き続き使用します。今回も、変更対象のメソッドは surfaceCreated のみです。それを聞いただけで簡単そうに思えれば、今回の話はもうクリアしたも同然です。というか、第2話が難しかっただけなんですけどね。

 矩形を描画するには、android.graphics.Canvas.drawRect メソッドを使用します。引数は5つで、左上X座標、左上Y座標、右下座標X、右下座標Y、Paint インスタンス、です。第3、4引数が、「幅、高さ」ではなく、座標であることに注意して下さい。Paint の内容により、描画色や、中を塗り潰すか等のスタイルを指定します。この Paint クラスは前回の文字描画で使用したものと同じですので、インスタンス自体も使い回し出来ます。実際に使い回すかどうかは、その場面によりけりだと思いますが、今回は使いまわすことにします。

MyView.java の一部
/** * これが呼び出されるのは、Surface が初回作成された直後です。 */ @Override public void surfaceCreated( android.view.SurfaceHolder holder ) { android.graphics.Canvas ca = holder.lockCanvas(); // Surface の編集を開始 ca.drawColor( android.graphics.Color.BLUE ); // キャンバスの背景色を「青」に設定 android.graphics.Paint pa = new android.graphics.Paint(); // 文字列、矩形描画用 pa.setTextSize( 32 ); // 文字列のサイズを指定 pa.setARGB( 0xff, 0x00, 0xff, 0x00 ); // 文字列、矩形の色を「不透明の緑」に設定 ca.drawRect( 5, 100, 200, 150, pa ); // 矩形を描画 ca.drawText( "やっはろーわーるど", 10, 50, pa ); // 文字列を描画 holder.unlockCanvasAndPost( ca ); // Surface の編集を終了 }

part04実行結果00


 他のプラットフォームに触れたことのある方であれば、このように drawRect で矩形が「塗り潰された」ことに少々戸惑われる方もいらっしゃるかと思います。「塗り潰しだったら draw じゃなくて fill でしょ!」といった感じで。Android のキャンバスでは、そういったことも含めて Paint インスタンスで指示するような仕様になっています。

 では、中を塗り潰さない矩形描画を追加してみます。Paint.setStyle メソッドにより塗り潰し指定を行なうことができます。引数に android.graphics.Paint.Style.STROKE を指定すると塗り潰さなくなります。逆に、また塗り潰したくなった場合は、STROKE ではなく FILL を指定します。

MyView.java の一部
/** * これが呼び出されるのは、Surface が初回作成された直後です。 */ @Override public void surfaceCreated( android.view.SurfaceHolder holder ) { android.graphics.Canvas ca = holder.lockCanvas(); // Surface の編集を開始 ca.drawColor( android.graphics.Color.BLUE ); // キャンバスの背景色を「青」に設定 android.graphics.Paint pa = new android.graphics.Paint(); // 文字列、矩形描画用 pa.setTextSize( 32 ); // 文字列のサイズを指定 pa.setARGB( 0xff, 0x00, 0xff, 0x00 ); // 文字列、矩形の色を「不透明の緑」に設定 ca.drawRect( 5, 100, 200, 150, pa ); // 矩形を描画 ca.drawText( "やっはろーわーるど", 10, 50, pa ); // 文字列を描画 pa.setStyle( android.graphics.Paint.Style.STROKE ); // 矩形を塗り潰さない ca.drawRect( 5, 200, 200, 250, pa ); // 矩形を描画 holder.unlockCanvasAndPost( ca ); // Surface の編集を終了 }

part04実行結果01


 以上で今回のパートは終了です。特に難しい話は無かったかと思うのですが、細かい部分の仕様まで知りたくなった場合、結局のところ、英語の API マニュアルを読むしかないというのが問題と言えば問題ですね。まあそこは、頑張って下さいとしか言いようがないですがw 私も苦労していますので、そこは諦めましょう。


part02.java
package home.part02; import android.app.Activity; import android.os.Bundle; public class part02 extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView( new MyView( this ) ); } }

MyView.java
package home.part02; class MyView extends android.view.SurfaceView implements android.view.SurfaceHolder.Callback { public MyView( android.content.Context context ) { super( context ); getHolder().addCallback( this ); } /** * これが呼び出されるのは、Surface のいくつかの構造(フォーマットやサイズ)が変化した直後です。 */ @Override public void surfaceChanged( android.view.SurfaceHolder holder, int format, int width, int height ) { } /** * これが呼び出されるのは、Surface が初回作成された直後です。 */ @Override public void surfaceCreated( android.view.SurfaceHolder holder ) { android.graphics.Canvas ca = holder.lockCanvas(); // Surface の編集を開始 ca.drawColor( android.graphics.Color.BLUE ); // キャンバスの背景色を「青」に設定 android.graphics.Paint pa = new android.graphics.Paint(); // 文字列、矩形描画用 pa.setTextSize( 32 ); // 文字列のサイズを指定 pa.setARGB( 0xff, 0x00, 0xff, 0x00 ); // 文字列、矩形の色を「不透明の緑」に設定 ca.drawRect( 5, 100, 200, 150, pa ); // 矩形を描画 ca.drawText( "やっはろーわーるど", 10, 50, pa ); // 文字列を描画 pa.setStyle( android.graphics.Paint.Style.STROKE ); // 矩形を塗り潰さない ca.drawRect( 5, 200, 200, 250, pa ); // 矩形を描画 holder.unlockCanvasAndPost( ca ); // Surface の編集を終了 } /** * これが呼び出されるのは、Surface が破棄される直前です。 */ @Override public void surfaceDestroyed( android.view.SurfaceHolder holder ) { } }

【次】


[戻る]
管理人:T.Umezawa
最終更新日時:2014/11/13