タッチイベントやジェスチャーイベントの実装方法|Android開発

Androidでタッチイベントを処理する場合、GestureDetectorを使うと様々なジェスチャーやイベントが検出できます。

タップとダブルタップを実装するサンプル

下記はGestureDetectorの簡単な使い方です。ImageView上のタップとダブルタップを判定します。

リスナ登録

ViewまたはActivityのタッチリスナを登録します。

public class ImageActivity extends Activity {

    private GestureDetector mGestureDetector;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout_image);

        /* Touch event */
        ((ImageView) findViewById(R.id.sample_img)).setOnTouchListener(mTouchEventListener);
        mGestureDetector = new GestureDetector(this, mGestureListener);
    }

    // これらの詳細は以降の項目に記載します.
    private GestureDetector.SimpleOnGestureListener mGestureListener;
    private View.OnTouchListener mTouchEventListener;
}

ジェスチャーに対する処理の実装

GestureDetector.SimpleOnGestureListenerを継承したクラスを作成し、必要なイベントをオーバーライドすることで様々なジェスチャーや目的のタッチイベントを処理できます。下記の実装内容はログ出力のみです。

private GestureDetector.SimpleOnGestureListener mGestureListener = new GestureDetector.SimpleOnGestureListener() {
    @Override
    public boolean onDoubleTap(MotionEvent e) {
        Log.i(TAG, "onDoubleTap");
        return true;
    }

    @Override
    public boolean onSingleTapConfirmed(MotionEvent e) {
        Log.i(TAG, "onSingleTapConfirmed");
        return true;
    }
};

タッチイベントリスナの内容

private View.OnTouchListener mTouchEventListener = new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        mGestureDetector.onTouchEvent(event);
        return true;
    }
};

アクティビティのタッチリスナ使用時

View.OnTouchListenerではなくActivity.onTouchEventを使用する場合は以下のようになります。

@Override
public boolean onTouchEvent(MotionEvent e) {
    mGestureDetector.onTouchEvent(e);
    return true;
}

スワイプジェスチャー処理

指で画面を横方向にスワイプした場合に別画面を表示するサンプルです。

mGestureDetector = new GestureDetector(this, mSwipeGestureListener);
mSwipeCallback = mOpenNext;
private interface ISwipeCallback {
    void onSwipe();
}

private ISwipeCallback mSwipeCallback;

private ISwipeCallback mOpenNext = new ISwipeCallback() {
    @Override
    public void onSwipe() {
        Intent intent = new Intent(ImageActivity.this, NextActivity.class);
        startActivity(intent);
        mSwipeCallback = new ISwipeCallback() {
            @Override
            public void onSwipe() {
            }
        };
    }
};
private GestureDetector.SimpleOnGestureListener mSwipeGestureListener = new GestureDetector.SimpleOnGestureListener() {

    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
        // e1 は始点、e2 は現在地.
        float diffX = e2.getX() - e1.getX();
        if (diffX <= -100) {
            // 条件成立後も onScroll は通知される. 成立1回目のみ処理したい場合はフラグなどで判定が必要.
            mSwipeCallback.onSwipe();
            return true;
        }
        return false;
    }
};

処理内容

onScroll()を実装し、移動量を判定します。distanceX, distanceYは前回のonScroll()からの差分です。
e1は始点、e2は現在位置です。今回はe1e2のみで移動量が判定できるため、それだけを使用しました。

mOpenNextmSwipeCallbackに空処理を登録しているのは、2回目以降のイベントを処理させないためです。

このエントリーをはてなブックマークに追加
にほんブログ村 IT技術ブログへ

コメント

メールアドレスが公開されることはありません。 が付いている欄は必須項目です