2013-10-15 107 views
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; 
      } 
     } 

回答

0

條件if (Math.abs(diffX) > Math.abs(diffY) - 50)確定是否它是一個水平或垂直滑動。你可以做的第一件事是使50密度相關乘以DisplayMetrics.density

如果這樣不會產生您正在尋找的結果,請考慮使用三角函數來確定起點和終點之間的角度。考慮從e1e2的矢量,並找出它與x軸之間的角度。它應該是arccos(diffX/sqrt(diffX*diffX + diffY*diffY))(弄清楚如何使它在所有4個象限中都能正常工作)。

通過將該角度與特定的度數範圍(例如右滑動的-45至45)進行比較,您可以實現更直觀和可自定義的結果。

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