0

私はこのコードを持っています。できます。左右にスワイプして、目的の結果を得ることができます。ただし、問題は、スワイプ アクションを機能させるには、ほぼ厳密に水平にスワイプする必要があることです。スワイプの自由度が欲しい。斜めにスワイプしたときにもスワイプが機能するようにします。このコードをどのように変更すればよいですか?

ここにコードがあります

import android.content.Context;
    import android.view.GestureDetector;
    import android.view.GestureDetector.SimpleOnGestureListener;
    import android.view.MotionEvent;
    import android.view.View;
    import android.view.View.OnTouchListener;

    public class OnSwipeTouchListener implements OnTouchListener {  

        Context context = null;

        private final GestureDetector gestureDetector = new GestureDetector(context, new GestureListener());

        public boolean onTouch(final View view, final MotionEvent motionEvent) {
            return gestureDetector.onTouchEvent(motionEvent);
        }



        private final class GestureListener extends SimpleOnGestureListener {

            private static final int SWIPE_THRESHOLD = 100;
            private static final int SWIPE_VELOCITY_THRESHOLD = 100;

            @Override
            public boolean onDown(MotionEvent e) {
                return true;
            }

            @Override
            public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
                boolean result = false;
                try {
                    float diffY = e2.getY() - e1.getY();
                    float diffX = e2.getX() - e1.getX();
                     if (Math.abs(diffX) > Math.abs(diffY) - 50) {
                        if (Math.abs(diffX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
                            if (diffX > 0) {
                                onSwipeRight();
                            } else {
                                onSwipeLeft();
                            }
                        }
                    } else {
                        if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) {
                            if (diffY > 0) {
                                onSwipeBottom();
                            } else {
                                onSwipeTop();
                            }
                        }
                    }
                } catch (Exception exception) {
                    exception.printStackTrace();
                }
                return result;
            }
        }
4

1 に答える 1

0

条件はif (Math.abs(diffX) > Math.abs(diffY) - 50)、それが水平方向のスワイプか垂直方向のスワイプかを決定します。最初にできることは、 を50掛けて密度依存にすることDisplayMetrics.densityです。

探している結果が得られない場合は、三角法を使用して開始点と終了点の間の角度を決定することを検討してください。e1からまでのベクトルを考えて、それと軸e2の間の角度を見つけます。xそうあるべきですarccos(diffX/sqrt(diffX*diffX + diffY*diffY))(4 つの象限すべてで機能させる方法を理解することは、読者の課題として残されています)。

その角度を特定の角度範囲 (右スワイプの場合は -45 ~ 45 など) と比較することで、より直感的でカスタマイズ可能な結果を​​得ることができます。

これは速度ではなく方向のみを考慮していることに注意してください。

于 2013-10-15T21:18:36.363 に答える