如何使左/右滑动手势更自由?

时间:2013-10-15 21:09:21

标签: java android swipe ontouchlistener

我有这个代码。有用。我可以向左和向右滑动以获得所需的结果。但是,问题是我必须几乎严格地水平滑动才能使滑动动作起作用。我想在刷卡时有更多的自由。当我斜向滑动时,我希望滑动也能正常工作。我该如何更改此代码?

这是代码

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;
            }
        }

1 个答案:

答案 0 :(得分:0)

if (Math.abs(diffX) > Math.abs(diffY) - 50)条件确定它是水平滑动还是垂直滑动。您可以做的第一件事是将50密度相关,乘以DisplayMetrics.density

如果这不会产生您正在寻找的结果,请考虑使用三角法来确定起点和终点之间的角度。考虑从e1e2的向量,找到它与x轴之间的角度。它应该是arccos(diffX/sqrt(diffX*diffX + diffY*diffY))(弄清楚如何让它在所有4个象限中都可以作为读者练习)。

通过将该角度与特定的度数范围(例如右滑动为-45到45)进行比较,您可以获得更加直观和可自定义的结果。

请注意,这只考虑方向而非速度。