サイト移転のお知らせ:http://techbooster.org/に移転しました

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

3月 20, 2011   //   by kseto   //   デバイス  //  No Comments

「タッチイベントを取得する(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;
}

関連する記事:

Sponsored Link

Comments are closed.

技術書新刊 発売中

アンドロイドアカデミアには、CIやテスト、互換検証など実務に生きるノウハウをあつめています

技術書新刊 発売中

Android Next!はAndroid 7.0に対応したはじめての技術書です!


The Web Explorer 2はCSSの中央寄せやWebAudioなど未来を読み解く一冊です


Revised TypeScript in DefinitelylandはTypeScript 2.0(β)に対応した解説書です。インストールから型定義まで幅広くサポートしています


技術書をかこう!はエンジニアらしい執筆環境を構築、HowTo本です