簡體   English   中英

如何使左右手勢更自由?

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

我有這個代碼。 有用。 我可以左右滑動以取得所需的結果。 但是,問題是我必須嚴格地水平滑動才能使滑動動作起作用。 滑動時我希望有更多的自由。 我希望對角滑動時滑動也能起作用。 我應該如何更改此代碼?

這是代碼

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)條件確定是水平滑動還是垂直滑動。 您可以做的第一件事是,將其乘以DisplayMetrics.density使密度依賴於50

如果那不能產生您想要的結果,請考慮使用三角函數確定起點和終點之間的角度。 考慮從e1e2的向量,並找到它與x軸之間的角度。 它應該是arccos(diffX/sqrt(diffX*diffX + diffY*diffY)) (為讀者練習如何使它在所有四個象限中起作用)。

通過將該角度與特定的度數范圍(例如,向右滑動為-45到45度)進行比較,您可以獲得更加直觀和可自定義的結果。

請注意,這僅考慮方向,而不考慮速度。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM