礒山 賢司
前回は,描画で利用するPanelクラスやCanvasクラスについて解説しました。さて,今回のテーマは「イベント処理」です。「イベント」とは,「携帯電話のキーを押す」などのユーザーのアクションを受け,何らかの応答をする仕組みのことです。iアプリではどのようなイベントがあり,どのように処理をするのか解説していきます。
●イベントの種類
iアプリでは,パソコンで動作するJavaアプリケーションとほとんど変わりないイベント機能を提供しています。イベントの種類は,大きく分けると,キー・イベント,コンポーネント・イベント,ソフト・キー・イベント,タイマー・イベントの4種類があります。このほかにも,マルチメディア(音)に関するイベントありますが,このイベントについては,次回解説する「マルチメディア」で解説する予定です。
キー | キーコード | キー種別 | Press | Release |
0 | 0 | ダイヤル | ○ | ○ |
1 | 1 | ダイヤル | ○ | ○ |
2 | 2 | ダイヤル | ○ | ○ |
3 | 3 | ダイヤル | ○ | ○ |
4 | 4 | ダイヤル | ○ | ○ |
5 | 5 | ダイヤル | ○ | ○ |
6 | 6 | ダイヤル | ○ | ○ |
7 | 7 | ダイヤル | ○ | ○ |
8 | 8 | ダイヤル | ○ | ○ |
9 | 9 | ダイヤル | ○ | ○ |
* | 10 | ダイヤル | ○ | ○ |
# | 11 | ダイヤル | ○ | ○ |
左 | 16 | ナビゲート | ○ | × |
上 | 17 | ナビゲート | ○ | × |
右 | 18 | ナビゲート | ○ | × |
下 | 19 | ナビゲート | ○ | × |
中 | 20 | ナビゲート | ○ | ○ |
オフフック | 48 | 機能 | ○ | × |
表1●キーとイベントの関係 |
前回解説した「Panelクラス」を使って作成したiアプリを例に取ると,イベントが発生すると,その情報は「ComponentListenerインタフェース」によって,「componentAction( )メソッド」へ通知されます。componentAction( )メソッドは,イベントの発生情報を受け取ると,メソッド内に記述された処理を実行します。
また,「Panelクラス」はSoftKeyListenerというインタフェースを持つ「ソフト・キー・イベント」(後述)も用意しています。これらのイベントを総称して「高レベル・イベント」と呼んでいます。
一方,前回説明したCanvasクラスを使ってアプリケーションを作成する場合は,低レベル・イベント処理になります。「processEvent( )メソッド」を利用し,イベントの種別,イベントに伴うパラメータ,などを開発者側で正しく解析し,プログラムに反映しなければなりません。
●キー・イベント
まず最初に説明するのは,ユーザー操作を取得する「キー・イベント」です。皆さんの手元にある携帯電話を見てください。「0」から「9」までのダイヤル・キー,「*」,「#」,「メニュー」や,「クリア」などが書かれた機能キーなど,数多くのキーが並んでいるでしょう。キー・イベントは,これらの「キーを押す/離す」を取得し,iアプリへ通知します。iアプリでは表1に示すキー・イベントを処理できます。
iアプリでこれらのキー・イベントを処理するには,EventListenerというクラスから派生している「KeyListenerインタフェース」を使います(リスト8)。
鋭い読者は気が付いたかと思いますが,表1には「ソフト・キー」と「電源キー(オンフック・キー)」が示されていません。これらは特殊な機能キーであり,ソフト・キーについては,別途ソフト・キー・イベントが提供されているため,それによって処理をします。電源キーはさらに特殊なキーで,iアプリの強制終了などに用いられ,アプリケーションから制御することはできません。
●コンポーネント・イベント
コンポーネント・イベントは,Panelオブジェクトに配置する,ボタン,テキスト・ボックス,リスト・ボックスに,「文字を入力した」などの変化が起きたときに,それをアプリケーションに通知します(表2)。コンポーネント・イベントを処理する場合は,「ComponentListenerインタフェース」を使います(リスト9)。
BUTTON_PRESSED | ボタン・コンポーネントが押されときに発行する |
SELECTION_CHANGED | リスト・コンポーネントのアイテムの選択が変化したときに発行する |
TEXT_CHANGED | テキスト・コンポーネントの文字列入力が確定したときに発行する |
表2●コンポーネント・イベントの種類 |
コンポーネント・イベントは,イベントの数も限定されているので,利用するのはさほど難しくはないでしょう。ただしボタンなど,同じコンポーネントをPanelオブジェクトに複数配置している場合は,「どのコンポーネントからのイベントなのか?」ということを正しく処理しなければなりません。サンプルでは,あえてそのようなプログラミングをしているので参考にしてみてください。
●ソフト・キー・イベント
iアプリでは,各メーカーの携帯電話で同様の操作を実現するために,「ソフト・キー」という特殊なキーが定義されており,「ダイヤルキー以外のキー」にその機能が割り当てられています。システム規定値では,2つのソフト・キーを使用できます。ソフト・キー・イベントは,携帯電話メーカーがiアプリ向けに独自のクラス・ファイルを提供している場合のみ使用できます。このメーカー独自のクラス・ファイルは,NTTドコモのWebサイトで提供するようですが,4月10日現在,そのような様子はないようです。
ソフト・キーを処理するサンプルがリスト10です。キー・イベントと同様に「Press」と「Release」を取得し,処理しています。
●タイマー・イベント
ゲームなどのiアプリでは,「どのタイミングで処理を実行するか」が必要になってくる場合があります。この場合は,タイマー・イベントを使います。
リスト11では,2つのタイマーを,異なるタイマー周期で動作させ,それぞれのタイマー・イベントを受けたときに,2つのラベルにタイマーの回数を表示しています。利用しているタイマーは,それぞれ,1000ms(ms=1/1000秒),2000msです。
iアプリでは,このTimerオブジェクトとは別に,Canvasクラスへの低レベル・イベントとして通知できる「ShortTimerクラス」も提供しています。ShortTimerオブジェクトは,キー・イベントと同等に扱い,「processEventメソッド」に通知します。Timerオブジェクトと比べると,イベントの判別が必要など,複雑な処理を必要としますが,細かな制御には適しています(リスト12)。
●イベント処理と処理能力
一点だけ,筆者の体験談から「タイマー・イベントの注意点」を説明しておきましょう。携帯電話はPCのように高性能ではありません。MPUの動作クロックも数10MHzの性能でしょう。このため「タイマーの分解能」にもおのずと限界があり,極端に短いスパンのタイマー・イベントは正確にイベントが発生しない場合もあります。
さらに,この処理能力の限界については,その他の要因でも発生します。例えばある機種で,文字をスクロールするTickerクラスを利用したiアプリを実行したとします。短い周期タイマーを発生させた場合,Tickerが極端に遅い,または動かない(文字が流れない),という現象が発生します。これは,携帯電話の性能の限界もその要因ですが,それを考慮してプログラミングしないことにも問題があると言えます。
また,携帯電話という性質上当然のことですが,「通話優先」という考えが根底にあり,通話のための処理を最優先にして動作している場合が多いのです。このため,おのずとiアプリの優先順位は下がることになります。
このように,iアプリを作成する場合は,携帯端末機の性能限界や,本来の携帯端末機としての機能にも,十分な注意を払ってアプリケーションを作成する必要があるのです。
●最後に
多くのiアプリは,ユーザーからの何らかの「アクション」を必要とするでしょう。イベント処理は,このユーザーとの接点を担う,たいへん重要な処理だといえます。
イベントの扱い方一つで,iアプリのパフォーマンスが左右されるため,さまざまな角度から検討して使う必要があります。しかし,魅力的なiアプリを作成しようと考えるなら,このイベントについての知識は必要不可欠です。ぜひ,サンプル・コードを元に,様々なパターンのイベントを研究してみてください。
描画とイベントの仕組みが分かると,一通り動作するアプリケーションが作成できます。次回は,待ち受け画面に代表されるような「イメージ」,そして携帯電話で鳴らすことができる「音」などの,「リソース」の扱いについて解説します。