【Android】フリックイベントを実装する


Android SDKには、フリックイベントを受け取るためのリスナーが用意されていないので、独自で実装してやる必要がある。というわけで、シンプルなリスナークラスを作ってみた。(移動速度等は考慮していないのであしからず)

FlickListener.java

📄FlickListener.java
import android.view.MotionEvent;
import android.view.View;

public class FlickListener implements View.OnTouchListener {

    /**
     * フリックイベントのリスナー
     */
    public interface Listener {
        void onFlickToLeft();
        void onFlickToRight();
        void onFlickToUp();
        void onFlickToDown();
    }

    /**
     * フリック判定時の遊び
     * 小さいほど判定が敏感になる
     */
    private static final float DEFAULT_PLAY = 100;

    private final Listener listener;
    private final float play;

    private float lastX;
    private float lastY;

    public FlickListener(Listener listener) {
        this(listener, DEFAULT_PLAY);
    }

    public FlickListener(Listener listener, float play) {
        this.listener = listener;
        this.play = play;
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                touchDown(event);
                break;
            case MotionEvent.ACTION_UP:
                touchOff(event);
                break;
        }
        return true;
    }

    private void touchDown(MotionEvent event) {
        lastX = event.getX();
        lastY = event.getY();
    }

    private void touchOff(MotionEvent event) {
        final float currentX = event.getX();
        final float currentY = event.getY();

        // x -> y の順で判定しているので、斜めにフリックした場合はLeft,Rightのイベントの方が優先される
        // Up,Downを優先したい場合は、条件判定の順序を入れ替えること
        if ((currentX + play) < lastX) {
            listener.onFlickToLeft();
        } else if (lastX < (currentX - play)) {
            listener.onFlickToRight();
        } else if ((currentY + play) < lastY) {
            listener.onFlickToUp();
        } else if (lastY < (currentY - play)) {
            listener.onFlickToDown();
        }
    }
}

やってることは単純で、OnTouchListenerを実装して、タッチダウン時とアップ時にX, Yの増加量を比較することで、フリックされたかどうかを判定している。判定の感度が気に食わない場合はDEFAULT_PLAYの値をいろいろ変更してみてほしい。

使い方

次の例では、リストビューにフリックイベントを登録している。リストビューのsetOnTouchListenerFlickListenerのインスタンスを渡してやればよい。

📄xxx.java
...
        listView.setOnTouchListener(new FlickListener(flickListener));
...

    private final FlickListener.Listener flickListener = new FlickListener.Listener() {
        @Override
        public void onFlickToLeft() {
            // doSomething();
        }

        @Override
        public void onFlickToRight() {
            // doSomething();
        }

        @Override
        public void onFlickToUp() {
            // doSomething();
        }

        @Override
        public void onFlickToDown() {
            // doSomething();
        }
    };

なお移動速度とか考慮する場合はGestureDetectorクラスとか使うといいそうな・・(試してないけど)。

以上。

関連する記事


「【Android】フリックイベントを実装する」への2件のフィードバック

  1. private final FlickListener.OnFlickListener flickListener = new FlickListener.OnFlickListener() {

    の部分はFlickListener.OnFlickListner ではなく FlickListener.Listener では?

    1. itmammoth

      ご指摘の通りです。
      修正しました。
      ありがとうございました!

コメントする

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

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください