タッチパネルのダブルタップや長押しを検出する


「タッチイベントを取得する(onTouchEventとMotionEvent)」でも紹介したように
タッチパネルのシングルタップや座標の取得はonTouchEventとMotionEventを利用することで
実現することができます。しかし、ダブルタップや長押しのように少し複雑なタッチイベントは
onTouchEventとMotionEventだけでは取得できません。

今回紹介するGestureDetectorクラスではダブルタップや長押しのような複雑なタッチイベントを簡単に取得するためのインタフェースやメソッドを提供しています。

詳しい説明はつづきからどうぞ。

gestureDetector#onTouchEvent

ダブルタップや長押しなどのタッチイベントはgestureDetector#onTouchEventによって判別され、
タッチイベントの種類によって後述するGestureDetector.OnGestureListenerと
GestureDetector.OnDoubleTapListenerのメソッドに振り分けられます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 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を表示させるようにしています。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
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;
}
2 Comments