View 派生クラスで Canvas に描画する基礎
Canvas を利用するには主に二種類方法があります。
ひとつは UI スレッド内で onDraw メソッドのコールバックによって描画する方法。そしてもうひとつは独立したスレッドで、SurfaceView を管理して Canvas に描画する方法です。
SurfaceView については「描画用スレッドを実装できる SurfaceView の利用方法」をみてください。
ここでは UI スレッド内で onDraw メソッドのコールバックで描画する方法を示します。
何かを描画するためには、4 つの基本的な構成要素が必要です。
その 4 つとは、ピクセルを保持するための「ビットマップ (Bitmap)」、描画呼び出しをホストするための「キャンバス (Canvas)」(そしてこれがビットマップに描く)、 「描画プリミティブ」(例えば、矩形、テキスト等)、そして「ペイントオブジェクト」(色などの描画のスタイルを定義)です。
本来、これら全てを準備する必要があるということを、まず覚えておいてください。登場するものが多くて、案外面倒ですね。
こうした面倒を Android のフレームワークが軽減してくれます。
onDraw コールバックとは
画面を再描画する処理はコストが高いので、基本的に必要がなければ行なわれません。
プログラミングで画面を更新するには、再描画を要求する必要があります。これは invalidate() メソッドで行ないます。
invalidate という単語は「無効化する」とか「破棄する」というような意味です。invalidate() メソッドで再描画を要求するということは、画面に表示されている内容を破棄して、新しい画面を表示せよ、ということです。
View クラスを継承した派生クラスで onDraw コールバックを利用すると、メソッドの引数に Canvas オブジェクトが渡されます。
これは Android フレームワークが、事前定義されたキャンバスを渡してくれている、ということです。
またそれに紐付くビットマットも用意されます。
したがって、View の派生クラスにて、Canvas に描画するのは比較的単純な作業です。Paint オブジェクトを用意して、どのような描画を行なうのか指定し、 canvas の描画メソッドを利用してキャンバスに図形を描く。そして、それが裏のビットマップに描かれる、という流れになります。