イベント処理
前回は、とりあえずプログラムを動かしてみましたが、
さすがに文字を表示するだけでは、
HTMLでできるじゃんという感じなので、
今回は、表示した文字を、携帯電話のキーで動かすプログラムを作ってみましょう。
ソースはこちら
import com.nttdocomo.ui.*;
public class EventTest extends IApplication
{
TestCanvas testCanvas;
public void start()
{
testCanvas = new TestCanvas();
Display.setCurrent(testCanvas);
}
}
class TestCanvas extends Canvas
{
//文字表示座標
int x = 10;
int y = 10;
//画面サイズ
int screenWidth = getWidth();
int screenHeight = getHeight();
public void paint(Graphics g)
{
g.lock(); //ロック
g.clearRect(0, 0, screenWidth, screenHeight); //クリア
g.drawString("Hello World!", x, y);
g.unlock(true); //アンロック
}
public void processEvent(int type, int param)
{
System.out.println("EVENT: type=" + type + " param=" + param);
if( type == Display.KEY_PRESSED_EVENT) //キー押しイベントだったら
{
switch(param)
{
case Display.KEY_UP: y +=(-4); break;
case Display.KEY_DOWN: y += 4; break;
case Display.KEY_LEFT: x +=(-4); break;
case Display.KEY_RIGHT: x += 4; break;
}
repaint();
}
}
}
赤字が前回からの追加部分です。
EventTestクラスには変更なし(名前は変えたけど、、、)。
変更点は2つ。
1つ目は今回の目玉?のイベント処理です。
processEvent メソッドは、Canvas内で、イベントが発生したときに呼び出されます。
イベントのタイプが キー押し だったとき、
キーの種別を判定して、文字表示座標 x、y を変更しています。
実験用にSystem.out.printlnでコンソールにイベントを表示させています。
もう1つpaintメソッド内。
文字を移動するので、画面を背景色で塗りつぶしています(clearRect)。
塗りつぶすサイズを取得するために、screenWidth、screenHeightで画面サイズを取得しています。
ついでに、lock、unlockというのを使用。
これはちらつきをなくすダブルバッファという機能を実現するものです(実機が対応していれば)。
プログラムを実行してみてください。
くどいようですが、プログラムの属性設定でAppClassを入力するのを忘れないように。
あと、入力したつもりが、更新されないことが多いので(←なぜか知らないが本当によくある)
"プロジェクトの設定は保存されました"というメッセージを確認すること。
プログラムを実行すると、キーの上下左右で、文字が移動します。
実験用にprintln文を入れてみました。
イベントをコンソールに出力しています。
1のキーを押してみてください。
以下のようなメッセージが表示されます。
EVENT: type=0 param=1
EVENT: type=1 param=1
これは、こういうことです。
EVENT: type=Display.KEY_PRESSED_EVENT param=Display.KEY_1
EVENT: type=Display.KEY_RELEASED_EVENT param=Display.KEY_1
もちょっと訳すとこうなります(この定数はDisplayクラスで定義されている)。
EVENT: type=キー押しイベント param=1のキー
EVENT: type=キー離しイベント param=1のキー
なんとなく何が起こっているか分りましたか?
次はもうちょっとプログラムをいじってみましょう。