SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

BlackBerry Touch APIを使用してタッチ操作対応のアプリケーションを開発する

BlackBerry独自のタッチ指向プログラミングの基礎

タッチイベントのプログラミング

 タッチ機能のプログラミングの要点は、サポートされるタッチイベントを適切に処理することです。ここでは、これらのイベントと、カスタムタッチ機能を実現するプログラムにイベントを変換する方法について、詳細に説明します。

 タッチイベントの処理に必要な手順は次のようになります。

  1. イベント処理の範囲に応じて、Managerクラス、Screenクラス、Fieldクラス、またはFieldクラスのサブクラスのいずれかを拡張し、protected Boolean touchEvent(TouchEvent event)メソッドをオーバーライドします。
  2. private class NameField extends Field {
       ...
       protected boolean touchEvent( TouchEvent event ) {
       ...
       }// end method
       ...
    }//end class
    
  3. net.rim.device.api.ui.TouchEventクラスのインスタンスを調べて、タッチの種類を特定します。
  4. // 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のドキュメントを参照ください。

  5. touchEvent関数では、typeプロパティを調べてTouchEvent定数と比較することで、イベントの種類を特定します。
  6. 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

 TouchEventGESTUREの場合、ジェスチャーの実際のサブタイプは、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を標準化してくれる日が来ることを切に願います。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Edmon Begoli(Edmon Begoli)

大規模な商用プロジェクトやパブリックソフトウェアプロジェクトに携わって10年間のキャリアを持つソフトウェアアーキテクト。現在は大きな公共機関に勤務。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/4397 2009/10/01 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー