2010-06-30 12 views

Odpowiedz

38

Wdrożenie onTouchEvent() i obliczyć dx i dy przy którym użytkownik naciska i podnosi. Możesz użyć tych wartości, aby określić kierunek ruchu.

float x1, x2, y1, y2, dx, dy; 
String direction; 
switch(event.getAction()) { 
    case(MotionEvent.ACTION_DOWN): 
     x1 = event.getX(); 
     y1 = event.getY(); 
     break; 

    case(MotionEvent.ACTION_UP): { 
     x2 = event.getX(); 
     y2 = event.getY(); 
     dx = x2-x1; 
     dy = y2-y1; 

     // Use dx and dy to determine the direction of the move 
     if(Math.abs(dx) > Math.abs(dy)) { 
      if(dx>0) 
       direction = "right"; 
      else 
       direction = "left"; 
     } else { 
      if(dy>0) 
       direction = "down"; 
      else 
       direction = "up"; 
     } 
    } 
} 
+4

Dobra odpowiedź, ale znalazłem kilka literówek i musiałem przenieść niektóre z tych zmiennych do wyższego zakresu, aby można je było zmieniać z poziomu przełącznika. –

+1

W przypadku drugiego przypadku przełącznika użyłem ACTION_MOVE zamiast ACTION_UP, ponieważ w widokach ViewPager można wywoływać bez ACTION_UP. Mam ScrollView z orientacją pionową przechowywaną przez ViewGroup i jest to strona ViewPager. Swipe na ScrollView zmienia stronę zamiast nie odpowiadać. case MotionEvent.ACTION_MOVE: float dx = event.getX() - x1; float dy = event.getY() - y1; if (Math.abs (dx) <= Math.abs (dy)) {// pionowy scroll v.getParent(). RequestDisallowInterceptTouchEvent (true); } else {v.getParent(). RequestDisallowInterceptTouchEvent (false);} break; –

+0

ScrollView z orientacją pionową zagnieżdżoną w innym ScrollView, przechowywanym przez grupę ViewGroup, którą miałem na myśli. –

8

Najlepiej będzie poradzić sobie z MotionEvent, który otrzymujesz z wywołania View.OnTouchListener(). Zdarzenia związane z ruchem śledzą bieżącą interakcję z widokiem według właściwości działania.

Wyobrażam sobie, że można obliczyć, w którym kierunku ktoś przesuwa palec, badając właściwość akcji MotionEvents i wartości x/y miejsca zdarzenia ruchu.

switch (event.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      oldX= event.getX(); 
      oldY= event.getY(); 
      break; 
     case MotionEvent.ACTION_MOVE: 
      int newX = motionEvent.getX(); 
      int newY = motionEvent.getY(); 

      int deltaX = oldX - newX; 
      int deltaY = oldY - newY; 

      if(Math.abs(deltaY)>Math.abs(deltaX)) 
       //Motion in Y direction. 
      else 
       // Motion in X direction. 
      break; 
     } 

Istnieje wiele innych metod dostępnych w obiekcie MotionEvent do użytku, a także: http://developer.android.com/reference/android/view/MotionEvent.html

+0

dno powinno być 'check if (Math.abs (deltaY)> Math.abs (deltaX))' – tibbi

+0

@tibbi stałe, dzięki! –

Powiązane problemy