2013-10-15 2 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.

Если это не дает результат, который вы ищете, рассмотрите возможность использования тригонометрии для определения угла между начальной и конечной точкой. Рассмотрим вектор от e1 до e2 и найдите угол между ним и осью x. Это должно быть arccos(diffX/sqrt(diffX*diffX + diffY*diffY)) (выяснение того, как заставить его работать во всех четырех квадрантах, остается в качестве упражнения для читателя).

Сравнивая этот угол с определенным диапазоном градусов (например, от -45 до 45 для правого салфетки), вы можете получить гораздо более интуитивный и настраиваемый результат.

Обратите внимание, что это учитывает направление, а не скорость.

Смежные вопросы