Androidプログラマへの道 〜 Moonlight 明日香 〜 - 複雑なタッチイベントを取得する
タッチパネルを操作するとタッチイベント(Touch Event)が発生する.
onTouchEventメソッドは, "タッチダウン","移動", "タッチアップ"などのイベントが発生するたびにコールされるので, 基本的な動作はここで処理することができる. (タッチイベントを取得するを参照)
しかし, "ダブルタップ", "ロングタップ", "フリック"など少し複雑なタッチイベントを処理するには, GestureDetector.SimpleOnGestureListenerクラスを使う.
GestureDetector.SimpleOnGestureListenerクラスの代わりに, GestureDetector.OnGestureListenerクラスとGestureDetector.OnDoubleTapListenerクラスを併用して実装することも可能である.

複雑なタッチイベントを取得

    • GestureDetectorクラスのインスタンスを生成する. インスタンスを生成する際に, SimpleOnGestureListenerメソッドを登録する.
    • onTouchEventメソッドをオーバーライドし, タッチイベントをGestureDetector#onTouchEventメソッドに渡す.
    • SimpleOnGestureListenerクラスのインスタンスを生成する.
    • onGestureListenerにおいて, 各イベントを処理するメソッドをオーバーライドする.
package com.moonlight_aska.android.touchevent02;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.GestureDetector.SimpleOnGestureListener;

public class TouchEvent02 extends Activity {
  private GestureDetector gesDetect;
  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    // GestureDetecotorクラスのインスタンス生成
    gesDetect = new GestureDetector(this, onGestureListener);
  }

  @Override
  public boolean onTouchEvent(MotionEvent event) {
    // TODO Auto-generated method stub
    // タッチイベントをGestureDetector#onTouchEventメソッドに
    gesDetect.onTouchEvent(event);
    return false;
  }

  // 複雑なタッチイベントを取得
  private final SimpleOnGestureListener onGestureListener = new SimpleOnGestureListener() {
    @Override
    public boolean onDoubleTap(MotionEvent e) {
      // TODO Auto-generated method stub
      Log.v("Gesture", "onDoubleTap");
      return super.onDoubleTap(e);
    }

    @Override
    public boolean onDoubleTapEvent(MotionEvent e) {
      // TODO Auto-generated method stub
      Log.v("Gesture", "onDoubleTapEvent");
      return super.onDoubleTapEvent(e);
    }

    @Override
    public boolean onDown(MotionEvent e) {
      // TODO Auto-generated method stub
      Log.v("Gesture", "onDown");
      return super.onDown(e);
    }

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
      // TODO Auto-generated method stub
      Log.v("Gesture", "onFling");
      return super.onFling(e1, e2, velocityX, velocityY);
    }

    @Override
    public void onLongPress(MotionEvent e) {
      // TODO Auto-generated method stub
      Log.v("Gesture", "onLongPress");
      super.onLongPress(e);
    }

    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
      // TODO Auto-generated method stub
      Log.v("Gesture", "onScroll");
      return super.onScroll(e1, e2, distanceX, distanceY);
    }

    @Override
    public void onShowPress(MotionEvent e) {
      // TODO Auto-generated method stub
      Log.v("Gesture", "onShowPress");
      super.onShowPress(e);
    }

    @Override
    public boolean onSingleTapConfirmed(MotionEvent e) {
      // TODO Auto-generated method stub
      Log.v("Gesture", "onSingleTapConfirmed");
      return super.onSingleTapConfirmed(e);
    }

    @Override
    public boolean onSingleTapUp(MotionEvent e) {
      // TODO Auto-generated method stub
      Log.v("Gesture", "onSingleTapUp");
      return super.onSingleTapUp(e);
    }
  };
}

イベント発生順番

SHARP SH-03Cで試した結果を示す.
m, nは繰り返し回数. また, ()は発生しない場合もある.
    • シングルタップ
    onDown -> (onShowPress) -> onSingleTapUp -> onSingleTapConfirmed
    onDown -> onShowPress -> onSingleTapUp
    • ロングタップ
    onDown -> onShowPress -> onLongPress
    • ダブルタップ
    onDown -> (onShowPress) -> onSingleTapUp -> onDoubleTap -> onDoubleTapEvent
      -> onDown -> onDoubleTapEvent * n
    onDown -> onSingleTapUp -> onDoubleTap -> onDoubleTapEvent
      -> onDown -> onDoubleTapEvent * m -> onShowPress -> onDoubleTabEvent * n
    • スクロール
    onDown -> (onShowPress) -> onScroll * n
    • フリック
    onDown -> (onShowPress) -> onScroll * n -> onFling