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

The if (Math.abs(diffX) > Math.abs(diffY) - 50) condition determines if it's a horizontal or vertical swipe. First thing you can do is make that 50 density-dependent by multiplying it by DisplayMetrics.density.

If that doesn't produce the result you're looking for, consider using trigonometry to determine the angle between the start and end point. Consider the vector from e1 to e2 and find the angle between it and the x axis. It should be arccos(diffX/sqrt(diffX*diffX + diffY*diffY)) (figuring out how to make it work in all 4 quadrants is left as an exercise for the reader).

By comparing that angle to a specific range of degrees (e.g. -45 to 45 for right swipe), you can achieve a much more intuitive and customizable result.

Note that this only considers direction and not velocity.

于 2013-10-15T21:18:36.363 回答