タッチイベントで画面のシングルタップ、長押しを検出するボタンではなく、画面全体のイベントも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)
Copyright(C) 2004-2013 モバイル開発系(K) All rights reserved.
[Home]
|