タッチイベントで画面のシングルタップ、長押しを検出する

ボタンではなく、画面全体のイベントもActivityのonTouchEventをオーバライドすることで取得できる。そのためには、まずリスナとしてGestureDetector.SimpleOnGestureListenerクラスのインスタンスを渡してGestureDetectorを生成する。

画面の長押しを検出するにはGestureDetector.SimpleOnGestureListenerクラスのonLongPressイベントをオーバライドすれば良い。同様に、onSingleTapConfirmedイベントをオーバライドすればシングルタップも検出できる。このSimpleOnGestureListenerクラスは、OnDoubleTapListenerとOnGestureListenerの両方のinterfaceを実装した便利なクラスで他にダブルタップの検出等も行うことができる。

そして、ActivityのonTouchEventイベントの中で、予め生成しておいたGestureDetectorのonTouchEventメソッドにActivityで受け取ったMotionEventをそのまま渡して呼び出せば良い。

package biz.office_matsunaga.android;

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

public class TouchEventTestActivity extends Activity {
    GestureDetector gd;
    
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        gd = new GestureDetector(getApplicationContext(), new GestureDetector.SimpleOnGestureListener() {

            @Override
            public boolean onSingleTapConfirmed(MotionEvent e) {
                // TODO Auto-generated method stub
                Log.d("check", "onSingleTapConfirmed");
                Toast.makeText(getApplicationContext(), "シングルタップ", Toast.LENGTH_SHORT).show();
                return false;
            }

            @Override
            public boolean onSingleTapUp(MotionEvent e) {
                // TODO Auto-generated method stub
                Log.d("check", "onSingleTapup");
                return false;
            }

            @Override
            public void onLongPress(MotionEvent e) {
                // TODO Auto-generated method stub
                Toast.makeText(getApplicationContext(), "長押し", Toast.LENGTH_SHORT).show();
            }
        });
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // TODO Auto-generated method stub
        Log.d("check", "before gd.onTouchEvent");
        boolean r = gd.onTouchEvent(event);
        Log.d("check", "r = " + r);
        return false;
    }
}

GestureDetectorのonTouchEventメソッドの戻り値は、SimpleOnGestureListenerでイベントが消費されたことを伝えることができる。例えばSimpleOnGestureListenerのonSingleTapUpイベントでtrueを返すことによって、GestureDegectorのonTouchEventメソッドの戻り値がtrueとなる。(シングルタップの場合)これはActivityのonTouchEventイベント内でそれ以後の処理を続けるか否かの判断に使うことができる。

また、ActivityのonTouchEventイベントの戻り値でtrueを返すと、それはonTouchEventイベントが消費されたことを意味する。

(2012/01/27)

新着情報
【オープンソースソフトウェア環境構築】Apple silicon Macで開発環境を構築
【Rust Tips】Actix webでJSONをPOSTする
【Rust Tips】コマンドライン引数を取得する

Copyright(C) 2004-2013 モバイル開発系(K) All rights reserved.
[Home]