简体   繁体   English

如何使左右手势更自由?

[英]How to make the swipe left/right gestures more free?

I have this code. 我有这个代码。 It works. 有用。 I can swipe left and right and get the desired result. 我可以左右滑动以取得所需的结果。 However, the problem is that I have to swipe almost strictly horizontally for the swipe action to work. 但是,问题是我必须严格地水平滑动才能使滑动动作起作用。 I want more freedom when swiping. 滑动时我希望有更多的自由。 I want the swipe to also work when I swipe diagonally. 我希望对角滑动时滑动也能起作用。 How should I change this code? 我应该如何更改此代码?

here is the code 这是代码

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

The if (Math.abs(diffX) > Math.abs(diffY) - 50) condition determines if it's a horizontal or vertical swipe. if (Math.abs(diffX) > Math.abs(diffY) - 50)条件确定是水平滑动还是垂直滑动。 First thing you can do is make that 50 density-dependent by multiplying it by DisplayMetrics.density . 您可以做的第一件事是,将其乘以DisplayMetrics.density使密度依赖于50

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. 考虑从e1e2的向量,并找到它与x轴之间的角度。 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). 它应该是arccos(diffX/sqrt(diffX*diffX + diffY*diffY)) (为读者练习如何使它在所有四个象限中起作用)。

By comparing that angle to a specific range of degrees (eg -45 to 45 for right swipe), you can achieve a much more intuitive and customizable result. 通过将该角度与特定的度数范围(例如,向右滑动为-45到45度)进行比较,您可以获得更加直观和可自定义的结果。

Note that this only considers direction and not velocity. 请注意,这仅考虑方向,而不考虑速度。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM