Androidで長押し(ロングタップ)やダブルタップのイベントを取得するサンプル

2009年 9月 3日 15:13

通常Activityでは画面の長押しやダブルタップ(PCで言う所のダブルクリック)を取得することはできませんが、GestureDetectorクラスを使うことで、長押しやダブルタップのイベントを取得できるようになります。GestureDetectorクラスを使うと他にもいろいろなイベントが取得できるようになるので、いろいろと便利だったりします。

ソースとしては次のような感じになります。
以下の例ではActivityにGestureDetector関連のリスナーを直接実装していますが、書き方はいろいろとできますので、匿名クラスを使ったり専用のクラスを実装したりとかでもOKです。自分の好きな方法でやるといいかなと思います。

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

public class TestGesture extends Activity implements
            GestureDetector.OnGestureListener,   // 長押し(onLongPress)のイベントが取得できます。
            GestureDetector.OnDoubleTapListener {// ダブルタップのイベントが取得できます。

    /** GestureDetectorを定義する */
    private GestureDetector gestureDetector;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // GestureDetector設定
        // このクラス(TestGesture)をリスナーとして設定
        this.gestureDetector = new GestureDetector(this, this);

        setContentView(R.layout.main);
    }

    /**
     * タッチイベント
     */
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // Activityのタッチイベント中でGestureDetectorのイベントを呼び出す
        // 長押しやダブルタップ等はGestureDetector内で判定されて、
        // GestureDetectorに登録したリスナー(このクラス)に処理が振り分けられる
        // if文で戻り値を判定することで、GestureDetectorで処理した後、
        // 通常のonTouchEventをそのまま継続するかどうかを選択できる
        if(this.gestureDetector.onTouchEvent(event)) return true;

        return super.onTouchEvent(event);
    }

    /**
     * 長押しイベント
     */
    @Override
    public void onLongPress(MotionEvent e) {
        Log.v("INFO", "onLongPress");
    }

    /**
     * ダブルタップイベント
     */
    @Override
    public boolean onDoubleTap(MotionEvent e) {
        Log.v("INFO", "onDoubleTap");
        return false;
    }

    @Override
    public boolean onDoubleTapEvent(MotionEvent e) {
        Log.v("INFO", "onDoubleTapEvent");
        return false;
    }

    @Override
    public boolean onDown(MotionEvent arg0) {
        Log.v("INFO", "onDown");
        return false;
    }

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        Log.v("INFO", "onFling");
        return false;
    }

    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
        Log.v("INFO", "onScroll");
        return false;
    }

    @Override
    public void onShowPress(MotionEvent e) {
        Log.v("INFO", "onShowPress");
    }

    @Override
    public boolean onSingleTapUp(MotionEvent e) {
        Log.v("INFO", "onSingleTapUp");
        return false;
    }

    @Override
    public boolean onSingleTapConfirmed(MotionEvent e) {
        Log.v("INFO", "onSingleTapConfirmed");
        return false;
    }
}

トラックバック URL


※言及リンクのないトラックバックは削除されます。
※書き込まれてから公開されるまで時間がかかる場合があります。

コメント / トラックバック 2 件

  1. ロイ より:

    はじめまして、ちょっと質問させていただきたいます
    GestureDetectorを使って、バックグランドのサービスからHOMEキーの長押しイベントを取得できませんでしょうか?
    いきなりですが、よろしくお願いいたします。

  2. UbuntuでWeblog より:

    AndroidのMapViewでダブルタップ

    通常Activityでは画面の長押しやダブルタップ(PCで言う所のダブルクリック)を取得することはできませんが、GestureDetectorクラスを使うことで、長?…

コメントをどうぞ

Spam protection by WP Captcha-Free

※書き込まれてから公開されるまで時間がかかる場合があります。