タッチイベントのプログラミング
タッチ機能のプログラミングの要点は、サポートされるタッチイベントを適切に処理することです。ここでは、これらのイベントと、カスタムタッチ機能を実現するプログラムにイベントを変換する方法について、詳細に説明します。
タッチイベントの処理に必要な手順は次のようになります。
- イベント処理の範囲に応じて、Managerクラス、Screenクラス、Fieldクラス、またはFieldクラスのサブクラスのいずれかを拡張し、
protected Boolean touchEvent(TouchEvent event)メソッドをオーバーライドします。 - net.rim.device.api.ui.TouchEventクラスのインスタンスを調べて、タッチの種類を特定します。
touchEvent関数では、typeプロパティを調べてTouchEvent定数と比較することで、イベントの種類を特定します。
private class NameField extends Field {
...
protected boolean touchEvent( TouchEvent event ) {
...
}// end method
...
}//end class
// handle touch event
protected boolean touchEvent( TouchEvent event ) {
int eventCode = event.getEvent();
if ( eventCode == TouchEvent.CLICK ) {
//Handle click event here
}
...
If ( eventCode == TouchEvent.MOVE ) {
//Handle move event here
}
...
この例で示されているTouchEvent以外の一般的なタッチイベントの種類としては、ライトクリックに対するTouchEvent.DOWN、タップに対するTouchEvent.TAP、スワイプジェスチャーに対するTouchEvent.SWIPE、プレスに対するTouchEvent.CLICK、プレスアンドホールドに対するTouchEvent.HOVERなどがあります。サポートされるすべてのイベント種類については、BlackBerry APIのドキュメントを参照ください。
protected boolean touchEvent( TouchEvent event ) {
switch( event.getEvent() ) {
case TouchEvent.CLICK:
//handle click event here
return true;
case TouchEvent.DOWN:
//handle down event here
return true;
case TouchEvent.MOVE:
///handle move event here
return true;
}
return false;
}//end method
前の例で示したのは、BlackBerry SDK内でのすべてのタッチイベント処理に共通する核心部分です。個々の処理で違うのは、Gesturesなどのサブイベントの認識の細部、およびサブクラスに関する追加プロパティに関係する部分です。
ジェスチャーとその細分化
ジェスチャー(net.rim.device.api.ui.TouchGesturesクラスのインスタンス)は、理論的にはTouchEventのサブタイプです。ジェスチャー(スワイプやタップなど)を特定するには、トラップされたTouchEventがジェスチャーかどうかを調べます。
If ( eventCode == TouchEvent.GESTURE ) {
//handle gesture here, see the next example
TouchEventがGESTUREの場合、ジェスチャーの実際のサブタイプは、TouchGestureタイプを調べることで特定できます。
TouchGesture gesture = event.getGesture();
int gestureEventCode = gesture.getEvent();
if (gestureEventCode == TouchGesture.TAP) {
//handle tap event here
}//end if
...
スワイプは、UIコンポーネントのアニメーションやスライドが可能なタッチスクリーン式デバイスが備えるジェスチャー特性です。スワイプジェスチャーイベントのプロパティを正しく解釈するには、ジェスチャーの方向も特定する必要があります。
protected boolean touchEvent( TouchEvent event ){
switch( event.getEvent() ) {
case TouchEvent.GESTURE:
TouchGesture gesture = event.getGesture();
switch( gesture.getEvent() ) {
case TouchGesture.SWIPE:
if( gesture.getSwipeDirection() == TouchGesture.SWIPE_SOUTH ){
//Handle swipe south event
return true;
}//end if
return true;
}//end case
}//end case
return true;
}//end touch event handler
その後、この方向を使用して、UIコンポーネントの終了、削除、スライドなどのカスタム機能を実行します。
ダブルクリックとマルチタッチ
ダブルクリックは、特殊ではあっても単純なジェスチャーの種類です。ダブルクリックイベントを特定するには、タッチされた表面で発生する連続したクリックの数を数えます。
protected boolean touchEvent( TouchEvent event ) {
switch( event.getEvent() ) {
case TouchEvent.GESTURE:
TouchGesture gesture = event.getGesture();
switch( gesture.getEvent() ) {
case TouchGesture.TAP:
if( gesture.getTapCount() == 2 ) {
//it is a double click, handle it here
return true;
}//end if
}//end switch
}//end switch
return false;
}//end method
ダブルクリックを識別するためのgetTapCount()メソッドの使用方法に注意してください。練習として、3回以上クリックをトラップした場合にどのようになるか、調べてみてください。
マルチタッチは、一般的なオペレーティングシステムでの、特殊文字のキーストロークとマウスクリックの組み合わせと考えることができます(例えば、[Ctrl]キーを押しながらファイル名をクリックして複数のファイルを選択する場合)。タッチスクリーン式デバイスの場合は、通常、複数のUIアイテムを別々の指で同時に押す操作になります。
BlackBerry Touch APIでは、タッチイベントに複数のタッチが異なる座標で含まれるかどうかを調べることで、マルチタッチイベントを認識できます。
protected boolean touchEvent( TouchEvent event ) {
switch( event.getEvent() ) {
case TouchEvent.MOVE:
if( event.getX(1) > 0 && event.getY(1) > 0) {
//handle here location of the first finger
}//end if
if( event.getX(2) > 0 && event.getY(2) > 0 ) {
//handle here location of the second finger
}//end if
return true;
}//end switch
ユーザーが画面上の複数の場所を押すと、TouchEventはタッチされた場所ごとに個別に座標のペア(ゼロより大きい値)を記録します。
APIは座標に1から始まるインデックス値を付けることに注意してください。Javaデータ構造のほとんどのインデックス(配列、添字、コレクションなど)は、0から始まります。この1から始まるインデックス方式のことを覚えておくと、デバッグの時間を節約できるかもしれません。
モバイル開発にWORAなし
自分も含めて私が知っているJava開発者のほとんどは、特定のプラットフォームだけを対象とした独自アプリケーションの開発という行為を、Javaの重要な原則であるWORA(Write Once, Run Anywhere)に反するものとして嫌います。しかし、モバイルプラットフォームは例外です。2つの主要なJava準拠モバイルアプリケーションプラットフォームであるBlackBerryとAndroidは、一般的で便利な機能のほとんどに対して非常に豊富な独自サポートを提供し、Java MEとのギャップを埋めています。もう1つの代表的な消費者向けタッチスクリーン式携帯電話であるiPhoneでは、Java MEはほとんど考慮されていません。
従って、モバイルデバイス用の魅力的で役に立つアプリケーションを開発しようとするJava開発者は、少なくともこの記事で紹介しているような独自機能をいろいろ調べてみる必要があります。
いつか近いうちに、モバイルプラットフォーム開発者たちが新しい機能豊富なJava MEを標準化してくれる日が来ることを切に願います。
