最後の更新は次の時刻以降のはず. Time-stamp: "2002/11/21 Thu 09:48"
Canvas クラスの processEvent(int type, int param) に通知されるので, これをオーバーライドします.
/* Canvas での Key 入力をうけとる例他 2002/10/24 */ import com.nttdocomo.ui.*; /** Canvas での Key 入力をうけとる例のクラス */ public class CanvasKeySample1 extends IApplication { /** 起動するときに呼ばれる メソッド. 必須. */ public void start(){ MyCanvasWithKey mc=new MyCanvasWithKey(); Display.setCurrent(mc); } } /** */ class MyCanvasWithKey extends Canvas { /** コンストラクタ. 配列の初期化のみ行う */ MyCanvasWithKey(){ eventname[Display.KEY_PRESSED_EVENT]="が押された"; eventname[Display.KEY_RELEASED_EVENT]="が離された"; for(int i=0; i < 0x1f; i++){ keyname[i]="名前不明" + i; } keyname[Display.KEY_0]="0"; keyname[Display.KEY_1]="1"; keyname[Display.KEY_2]="2"; keyname[Display.KEY_3]="3"; keyname[Display.KEY_4]="4"; keyname[Display.KEY_5]="5"; keyname[Display.KEY_6]="6"; keyname[Display.KEY_7]="7"; keyname[Display.KEY_8]="8"; keyname[Display.KEY_9]="9"; keyname[Display.KEY_ASTERISK]="*"; keyname[Display.KEY_DOWN]="↓"; keyname[Display.KEY_LEFT]="←"; keyname[Display.KEY_UP]="↑"; keyname[Display.KEY_RIGHT]="→"; keyname[Display.KEY_POUND]="#"; keyname[Display.KEY_SELECT]="選択"; // 以下は Panel のときと異なる. keyname[Display.KEY_SOFT1]="ソフトキー1"; keyname[Display.KEY_SOFT2]="ソフトキー2"; setSoftLabel(Frame.SOFT_KEY_1, "ソ1"); setSoftLabel(Frame.SOFT_KEY_2, "ソ2"); } /** 描画するメソッド. repaint で繰り返し呼び出される */ public void paint(Graphics g){ g.clearRect(0,0,getWidth(),getHeight()); g.drawString(msg,0,20); // 文字列 msg を x,y 座標の位置に描く } /** 何かイベントが起きる(例. キーが押される)と呼び出されるメソッド type がイベントの種類 */ public void processEvent(int type, int param){ msg=keyname[param] + eventname[type]; repaint(); } String msg=""; // 何かで初期化しておかないと. private static final String[] keyname=new String[0x1f]; private static final String[] eventname=new String[2]; } /* Local Variables: mode: java End: */
これを利用して, アニメーションを開始, 停止する例を書いてみましょう
/* Canvas での Key 入力をうけとる例他 2002/11/14 Thu 10:35 */ import com.nttdocomo.ui.*; import com.nttdocomo.util.*; /** Canvas での Key 入力をうけとる例のクラス */ public class CanvasKeySample2 extends IApplication { /** 起動するときに呼ばれる メソッド. 必須. */ public void start(){ AnimWithKey mc=new AnimWithKey(); Display.setCurrent(mc); Timer ti=new Timer(); ti.setTime(1000); // 1000ミリ秒で発生するタイマー ti.setRepeat(true); // 繰り返し発生するタイマー ti.setListener(mc); // クラス mc の timerExpired を使用. ti.start(); // カウントダウン開始. 一時停止は, ti.stop(); } } /** */ class AnimWithKey extends Canvas implements TimerListener { /** コンストラクタ. 配列の初期化のみ行う */ AnimWithKey(){ setSoftLabel(Frame.SOFT_KEY_1, "停止"); setSoftLabel(Frame.SOFT_KEY_2, "終了"); inAnimation=true; im=new Image[2]; MediaImage mi0=MediaManager.getImage("resource:///pose0.gif"); MediaImage mi1=MediaManager.getImage("resource:///pose1.gif"); try{ mi0.use(); im[0]=mi0.getImage(); mi1.use(); im[1]=mi1.getImage(); } catch (Exception e){ //"gif を貼ることに失敗" } } /** 描画するメソッド. repaint で繰り返し呼び出される */ public void paint(Graphics g){ // 特定の座標に, im[0] または im[1] を貼る. g.clearRect(0,0,getWidth(),getHeight());// 画面を消す g.drawImage(im[t],getWidth()/3,getHeight()/4); // 絵を貼る } /** Timer が 0 になったとき呼ばれるメソッド implements TimerListner を宣言したらこれが必要 */ public void timerExpired(Timer source){ if(inAnimation){ t= (t+1) % 2; // 時間を進め } repaint(); // paint() を再度呼び出す. } /** 何かイベントが起きる(例. キーが押される)と呼び出されるメソッド type がイベントの種類 */ public void processEvent(int type, int param){ if( type==Display.KEY_PRESSED_EVENT ){ if (param==Display.KEY_SOFT1 && inAnimation){ inAnimation=false; setSoftLabel(Frame.SOFT_KEY_1, "開始"); } else if( param==Display.KEY_SOFT1 && !inAnimation ){ inAnimation=true; setSoftLabel(Frame.SOFT_KEY_1, "停止"); } else if ( param==Display.KEY_SOFT2){ IApplication.getCurrentApp().terminate(); } } } private Image im[]; private int t=0; private boolean inAnimation; } /* Local Variables: mode: java End: */
実は getKeypadState() メソッドを使うと, 2個以上の key の同時押しも検出できます.