ホームへ戻る

2.4 ジェスチャイベントを取得する


 前の章では簡単なタッチイベントを取得しました。
AndroidSDKにはそれ以外にも、多くのジェスチャ検出の仕組みがあります。
GestureDetector.OnGestureListener と GestureDetector.OnDoubleTapListener を
実装することで、以下のイベントが取得可能になります。

onDown(); 押下時に呼ばれる
onShowPress(); 押下時に呼ばれる(押してすぐに動かすと呼ばれない)
onLongPress(); 長押し時に呼ばれる
onFling(); フリック時に呼ばれる
onScroll(); スクロール時に呼ばれる
onSingleTapUp(); シングルタップ時に呼ばれる(ダブルタップ時も呼ばれる)
onSingleTapConfirmed(); シングルタップ時に呼ばれる(ダブルタップ時は呼ばれない)
onDoubleTap(); ダブルタップ時に呼ばれる
onDoubleTapEvent(); ダブルタップイベント時に呼ばれる(押す・動かす・離す)

似たような意味のメソッドが複数あったり、意味が理解しにくかったりするものがあるので、
実際サンプルプログラムと実行結果を見ながら覚えて下さい。

発生するイベントの順番を以下に簡単に紹介します。

シングルタップ時
onDown → onShowPress※ → onSingleTapUp → onSingleTapConfirmed

長押し時
onDown → onShowPress → onLongPress

スクロール時(押してグイーっと動かす)
onDown → onShowPress※ → onScroll x n

フリック時(押してサッと動かして離す)
onDown → onShowPress※ → onScroll x n → onFling

※は押してすぐに動かすと呼ばれない

とりあえず全部実装してログを仕込んで結果を見てみましょう。
マウスの軌跡ではジェスチャが分からないので動画で紹介することができません。
今回実行結果はそれぞれ自分で確認して下さい。

メソッドは多いですが、全て書きました。
ジェスチャはGestureDetectorを生成することで検出可能になります。
今回はActivityにインターフェイスメソッドを実装したので、引数にthisを渡してあります。


public class AndroidsCastleActivity extends Activity 
        implements      GestureDetector.OnGestureListener,
                        GestureDetector.OnDoubleTapListener {

        private GestureDetector ges;
        
        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main);
                
                ges = new GestureDetector(this, this);
        }

        // タッチイベント時に呼ばれる
        @Override
        public boolean onTouchEvent(MotionEvent event) {
                ges.onTouchEvent(event);
                return false;
        }
        
        // 押下時に呼ばれる 
        @Override
        public boolean onDown(MotionEvent e) {
                Log.d("sample", "onDown()");
                return false;
        }

        // プレス時に呼ばれる(onDownが先に呼ばれ、意味が異なる)
        @Override
        public void onShowPress(MotionEvent e) {
                Log.d("sample", "onShowPress()");
        }

        // 長押し時に呼ばれる
        @Override
        public void onLongPress(MotionEvent e) {
                Log.d("sample", "onLongPress()");
        }

        // フリック時に呼ばれる
        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float x, float y) {
                Log.d("sample", "onFling()");
                return false;
        }

        // スクロール時に呼ばれる
        @Override
        public boolean onScroll(MotionEvent e1, MotionEvent e2, float x, float y) {
                Log.d("sample", "onScroll()");
                return false;
        }

        // シングルアップ時に呼ばれる(ダブルタップ時も呼ばれる)
        @Override
        public boolean onSingleTapUp(MotionEvent e) {
                Log.d("sample", "onSingleTapUp()");
                return false;
        }

        // シングルタップ時に呼ばれる(ダブルタップ時は呼ばれない)
        @Override
        public boolean onSingleTapConfirmed(MotionEvent e) {
                Log.d("sample", "onSingleTapConfirmed()");
                return false;
        }

        // ダブルタップ時に呼ばれる
        @Override
        public boolean onDoubleTap(MotionEvent e) {
                Log.d("sample", "onDoubleTap()");
                return false;
        }

        // ダブルタップイベント時に呼ばれる。「押す、スクロール、離す」で呼び出される。
        @Override
        public boolean onDoubleTapEvent(MotionEvent e) {
                Log.d("sample", "onDoubleTapEvent()");
                return false;
        }
}


ポイントは前章で紹介したonTouchEventメソッドから、GestureDetector.onTouchEventを呼び出している点です。
こうすることで、ジェスチャイベントのメソッドが呼ばれるようになります。

本章のプロジェクトはこちら


→分からないことがあれば掲示板で質問して下さい


Portions of this page are modifications based on work created and shared by Google and used according to terms described in the Creative Commons 3.0 Attribution License.

- Remical Soft -