libro
www.tuyano.com
iアプリ・プログラミング入門

Canvasでグラフィックを描こう (4/8)

作成:2009-12-29 21:43
更新:2009-12-29 21:43

■描画の流れをチェック!

では、paintメソッドで行っている処理を見てみましょう。基本的な使い方はAWTのCanvasと同じ、といいましたが、いきなり最初からCanvasとは違う処理が出てきます。

g.lock();

この「lock」は、画面をロックする働きをします。携帯端末では、パソコンと比べるとCPUのパワーが弱く、処理速度も劣ります。グラフィックを描画する場合、いくつもの図形を描いている最中にぱたぱたと画面が更新されたりすると非常に見づらいですし、それほどCPUパワーがない機種では動作速度も遅くなりいらいらの原因となるでしょう。そこで描画の際には「画面をロックする」「描画をする」「ロックを解除する」といった流れで作業を行うのが一般的です。

g.clearRect(0, 0, Display.getWidth(), Display.getHeight());

さて、実際の描画に入りましょう。まずやっているのは「clearRect」というメソッドで表示エリアをクリアする作業です。ま、初期状態では何も描かれてませんから意味ないですが……、「こうやってきれいに消してから描画する」という手順の説明として一応やっておいた、と考えてください。

int c1 = Graphics.getColorOfName(Graphics.AQUA);
g.setColor(c1);

続いて、まず四角形を描きます。最初に、描画に使う色を設定します。これはGraphicsクラスにある「setColor」というメソッドで行います。引数に指定するのは、Colorクラスのインスタンス……ではありません。ただのint値です。

CanvasやGraphicsなど、AWTでも目にするクラスが登場するので、つい「AWTと同じだ」と考えてしまうのですが、実はAWTとはいろいろ違っている点もあるのです。その第1は、「Colorクラスがない」ということでしょう。DoJaでは、色はタダのint値として扱われます。使いたい色を示すint値をsetColorで指定することで、その色が使われるようになるのです。

では、色の値はどうやって得るのか。ここでは、Graphicsの「getColorOfName」を使っています。これは、色の名前を引数に指定することで、その色の値を返すものです。この色の名前は、Graphicsクラスに用意されているクラスフィールドを使って指定しています。

「なんだ、Graphicsに色の値があるんじゃないか。なら直接、g.setColor(Graphics.AQUA);とすればいいんじゃないのか?」――と思った人。残念、これはできません。勘違いしてしまいがちですが、例えば「Graphics.AQUA」は、「AQUAの色の値」ではないのです。これはあくまで「AQUAという色の名前を示す値」であって、これ自体がAQUAの色の値ではありません。

携帯端末には、さまざまなハードウェアがあります。フルカラーの機種もあれば、256色表示のものもあるでしょう。したがって、指定した色が常に正しくハードウェアに用意されているわけではありません。そこでDoJaでは「指定の色にもっとも近い色の値」を指定するようになっています。このため、あらかじめ色の値をクラスフィールドに用意して使うというのは難しいのです。そこで、色の名前を示す値を用意しておき、それをgetColorOfNameで指定して、その色にもっとも近い色の値を取得し使うようになっているのですね。

g.fillRect(25, 25, 100, 100);

さて、色の指定ができたら、「fillRect」で四角形を描画します。これは位置と幅を指定して呼び出すことで四角形を描くものです。まあ、AWTのGraphicsにも似たようなものがあるのでわかるでしょう。

int c2 = Graphics.getColorOfName(Graphics.PURPLE);
g.setColor(c2);
g.fillArc(75, 75, 100, 100, 0, 360);

続いて、またgetColorOfNameで色の値を取り出し、setColorで設定して、今度は円を描きます。これは「fillArc」というメソッドを使います。これは、正確にいえば「円弧」を描くメソッドです。開始角度と終了角度を360度にして描けば円になるわけです。

g.unlock(true);

そして、最後に「unlock」でロックを解除します。これは引数にbooleanが渡されます。trueに指定すると、複数回lockが呼ばれていてもすべてまとめて解除します。falseの場合には、1回分のlockを解除します。

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

public void paint(Graphics g) {
    g.lock();
    g.clearRect(0, 0, Display.getWidth(), Display.getHeight());
    int c1 = Graphics.getColorOfName(Graphics.AQUA);
    g.setColor(c1);
    g.fillRect(25, 25, 100, 100);
    int c2 = Graphics.getColorOfName(Graphics.PURPLE);
    g.setColor(c2);
    g.fillArc(75, 75, 100, 100, 0, 360);
    g.unlock(true);
}
※関連コンテンツ

「iアプリ・プログラミング入門」に戻る