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

ボタンではなく、画面全体のイベントも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)

新着情報
【iOS Objective-C, Swift Tips】画像の向きを指定して保存する(Swift)
【iOS Objective-C, Swift Tips】UIImagePickerControllerの表示を日本語にする(Swift)
【iOS Objective-C, Swift Tips】ウィンドウの階層構造を3D表示する(Swift)

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