2010/11/27

onDoubleTap と onDoubleTapEvent の違い

Android の Activity には onTouchEvent というのがあって、シングルタップを捕まえることができます。しかし、ダブルタップのような複雑なイベントを捕まえる機能はデフォルトでは備わっていません。

そういった複雑な動作を捕まえるためには、Activity に OnGestureListener, OnDoubleTapListener というインターフェースを実装してやります。
(具体的な使い方は Google Map でダブルタップズーム for Android を参考にしてください)

ところで、 OnDoubleTapListener には OnDoubleTap と OnDoubleTapEvent という2つのメソッドが存在しますが、最初どういう違いがあるのか良くわからなかったので、ちょっと調べてみました。
って言っても、コメント読んだだけですが :-)


OnDoubleTap の ToolTip には、
Notified when a double-tap occurs.
と書いてあります。直訳すると、
ダブルタップされた時に通知されます
って感じでしょうか。そのままですね。


OnDbouleTapEvent の ToolTip には、
Notified when an event within a double-tap gesture occurs, including the down, move, and up events.
と書いてあります。
ダブルタップ中にイベントがおこると通知されます。ダウン、移動、アップを含みます
という感じでしょうか。
実際、OnDbouleTapEvent をログで捕まえると、一回のダブルタップで4,5回のイベントを捕まえる事ができます。
OnDbouleTapEvent が呼ばれた起因を調べるには、以下のように MotionEvent の getAction メソッドを使えば可能です。
public boolean onDoubleTapEvent(MotionEvent e) {
        switch (e.getAction()) {
        case MotionEvent.ACTION_DOWN:
            Log.i("Test", "Action Down.");
            return true;
        case MotionEvent.ACTION_UP:
            Log.i("Test", "Action Up.");
            return true;
        case MotionEvent.ACTION_MOVE:
            Log.i("Test", "Action Move.");
            return true;
        default:
            Log.i("Test", "Action Other.");
            return true;
        }
    }
2回タップした後に、指を離さず、ちょっと動かしてみたときのログは以下のようになりました。
11-26 23:43:57.286: INFO/Test(326): Action Down.
11-26 23:43:57.406: INFO/Test(326): Action Move.
11-26 23:43:57.447: INFO/Test(326): Action Move.
11-26 23:43:57.476: INFO/Test(326): Action Move.
11-26 23:43:57.536: INFO/Test(326): Action Move.
11-26 23:43:57.576: INFO/Test(326): Action Move.
11-26 23:43:57.607: INFO/Test(326): Action Move.
11-26 23:43:57.827: INFO/Test(326): Action Up.

2010/11/28 追記
その他のイベントも、どのような順番で処理されるのか調べてみました。
OnGestureListener の処理順

0 件のコメント: