2013-10-15 35 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)进行比较,您可以实现更直观和可自定义的结果。

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