タッチパネルのダブルタップや長押しを検出する
|「タッチイベントを取得する(onTouchEventとMotionEvent)」でも紹介したように
タッチパネルのシングルタップや座標の取得はonTouchEventとMotionEventを利用することで
実現することができます。しかし、ダブルタップや長押しのように少し複雑なタッチイベントは
onTouchEventとMotionEventだけでは取得できません。
今回紹介するGestureDetectorクラスではダブルタップや長押しのような複雑なタッチイベントを簡単に取得するためのインタフェースやメソッドを提供しています。
詳しい説明はつづきからどうぞ。
gestureDetector#onTouchEvent
ダブルタップや長押しなどのタッチイベントはgestureDetector#onTouchEventによって判別され、
タッチイベントの種類によって後述するGestureDetector.OnGestureListenerと
GestureDetector.OnDoubleTapListenerのメソッドに振り分けられます。
// GestureDetectorインスタンス変数 GestureDetector gestureDetector; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // GestureDetectorインスタンス作成 gestureDetector = new GestureDetector(this, this); } @Override public boolean onTouchEvent(MotionEvent ev) { // gestureDetector#onTouchEventメソッドでタッチイベントの判別・振り分けを行う gestureDetector.onTouchEvent(ev); return false; }
GestureDetector.OnGestureListenerとGestureDetector.OnDoubleTapListener
GestureDetector#onTouchEventで振り分けられたタッチイベントを処理するために、
GestureDetector.OnGestureListenerとGestureDetector.OnDoubleTapListenerの
2つのインタフェースを実装します。
GestureDetector.OnGestureListener
GestureDetector.OnGestureListenerで用意されているメソッドには以下のようなものがあります。
- boolean onDown(MotionEvent e)
画面を押したときに呼び出される。
- boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY)
画面にはじいたときに呼び出される。
- void onLongPress(MotionEvent e)
画面を長押ししたときに呼び出される。
- boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY)
画面をドラッグしたときに呼び出される。
- void onShowPress(MotionEvent e)
画面を押したときに呼び出される。ただし、画面を押してすぐにドラッグしたり画面を離した場合は呼び出されない。
- boolean onSingleTapUp(MotionEvent e)
画面をシングルタップしたときに呼び出される。なお、ダブルタップのときにも呼び出される。
GestureDetector.OnDoubleTapListener
続いてGestureDetector.OnDoubleTapListenerで用意されているメソッドには以下のようなものがあります。
- boolean onDoubleTap(MotionEvent e)
画面をダブルタップしたときに呼び出される。
- boolean onDoubleTapEvent(MotionEvent e)
画面のダブルタップ中のイベント(押す、スクロール、離す)で呼び出される。
- boolean onSingleTapConfirmed(MotionEvent e)
画面をシングルタップしたときに呼び出される。なお、ダブルタップのときには呼び出されない。
サンプルコード
上記のメソッドを実装したサンプルコードです。
呼び出されるタイミングが分かるように各メソッドでToastを表示させるようにしています。
public boolean onDown(MotionEvent e) { Toast.makeText(this, "called onDown()", Toast.LENGTH_LONG).show(); return false; } public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { Toast.makeText(this, "called onFling()", Toast.LENGTH_LONG).show(); return false; } public void onLongPress(MotionEvent e) { Toast.makeText(this, "called onLongPress()", Toast.LENGTH_LONG).show(); } public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { Toast.makeText(this, "called onScroll()", Toast.LENGTH_LONG).show(); return false; } public void onShowPress(MotionEvent e) { Toast.makeText(this, "called onShowPress()", Toast.LENGTH_LONG).show(); } public boolean onSingleTapUp(MotionEvent e) { Toast.makeText(this, "called onSingleTapUp()", Toast.LENGTH_LONG).show(); return false; } public boolean onDoubleTap(MotionEvent e) { Toast.makeText(this, "called onDoubleTap()", Toast.LENGTH_LONG).show(); return false; } public boolean onDoubleTapEvent(MotionEvent e) { Toast.makeText(this, "called onDoubleTapEvent()", Toast.LENGTH_LONG).show(); return false; } public boolean onSingleTapConfirmed(MotionEvent e) { Toast.makeText(this, "called onSingleTapConfirmed()", Toast.LENGTH_LONG).show(); return false; }