Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使左右滑动手势更自由?_Java_Android_Swipe_Ontouchlistener - Fatal编程技术网

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

Java 如何使左右滑动手势更自由?,java,android,swipe,ontouchlistener,Java,Android,Swipe,Ontouchlistener,我有这个密码。它起作用了。我可以左右滑动,得到想要的结果。但是,问题是我必须几乎严格地水平滑动,才能使滑动操作正常工作。我想在刷卡时有更多的自由。我希望当我沿对角线方向滑动时,滑动也能起作用。我应该如何更改此代码 这是密码 import android.content.Context; import android.view.GestureDetector; import android.view.GestureDetector.SimpleOnGestureListener;

我有这个密码。它起作用了。我可以左右滑动,得到想要的结果。但是,问题是我必须几乎严格地水平滑动,才能使滑动操作正常工作。我想在刷卡时有更多的自由。我希望当我沿对角线方向滑动时,滑动也能起作用。我应该如何更改此代码

这是密码

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;
            }
        }
if(Math.abs(diffX)>Math.abs(diffY)-50)
条件确定是水平还是垂直滑动。您可以做的第一件事是将
50
密度乘以
DisplayMetrics.density

如果这不能产生你要寻找的结果,请考虑用三角法来确定起点和终点之间的夹角。考虑从<代码> E1 < /代码>到<代码> E2 < /代码>的向量,并找到它与<代码> x < /代码>轴之间的夹角。它应该是

arccos(diffX/sqrt(diffX*diffX+diffY*diffY))
(如何使它在所有4个象限中工作留给读者作为练习)

通过将该角度与特定的角度范围进行比较(例如,右击为-45到45),可以获得更直观、更可定制的结果

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