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
の値をいろいろ変更してみてほしい。
使い方
次の例では、リストビューにフリックイベントを登録している。リストビューのsetOnTouchListener
にFlickListener
のインスタンスを渡してやればよい。
📄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】10回に1回インタースティシャル広告を表示する
- 【Android】ImageViewをタッチしたらハイライトさせる
- 【Android】リストビューの自動スクロール機能を実装する
- 【Android】安全にonActivityResultを実行する
- Volleyでmultipartリクエストを送信する
private final FlickListener.OnFlickListener flickListener = new FlickListener.OnFlickListener() {
の部分はFlickListener.OnFlickListner ではなく FlickListener.Listener では?
ご指摘の通りです。
修正しました。
ありがとうございました!