2010-06-30 2 views
19

Я хочу захватить направление движения пальцев на сенсорном телефоне Android. Если пользователь скользит пальцем в направлении вверх/вниз/влево/вправо, я хочу зафиксировать это направление. Как я могу найти это? Благодарю.Как захватить направление движения пальца в телефоне Android?

ответ

38

Реализовать onTouchEvent(), и вычислить дх и ду тем, где пользователь нажимает вниз и поднимается вверх. Эти значения можно использовать для определения направления движения.

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

Хороший ответ, но я нашел некоторые опечатки и должен был перенести некоторые из этих переменных в более высокую область, чтобы сделать их изменяемыми изнутри коммутатора. –

+1

Для второго случая переключения я использовал ACTION_MOVE вместо ACTION_UP, потому что в виджетах ViewPager вызывается без ACTION_UP. У меня есть ScrollView с вертикальной ориентацией, удерживаемой ViewGroup, и это страница ViewPager. Прокрутка на ScrollView меняет страницу вместо того, чтобы не отвечать. case MotionEvent.ACTION_MOVE: float dx = event.getX() - x1; float dy = event.getY() - y1; if (Math.abs (dx) <= Math.abs (dy)) {// вертикальная прокрутка v.getParent(). RequestDisallowInterceptTouchEvent (true); } else {v.getParent(). RequestDisallowInterceptTouchEvent (false);} break; –

+0

ScrollView с вертикальной ориентацией, вложенной в другой ScrollView, который я имел в виду в ViewGroup. –

8

Лучше всего иметь дело с MotionEvent, который вы получаете из обратного вызова View.OnTouchListener(). События движения отслеживают, как вы в настоящее время взаимодействуете с представлением по свойству action.

Я бы предположил, что вы можете рассчитать, в каком направлении кто-то скользит пальцем, исследуя свойство действия MotionEvents и значения x/y, где происходило событие движения.

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; 
     } 

Есть много другого метода, имеющихся на объекте MotionEvent для использования, а также: http://developer.android.com/reference/android/view/MotionEvent.html

+0

нижний чек должен быть 'если (Math.abs (deltaY)> Math.abs (DeltaX))' – tibbi

+0

@tibbi фиксированной, спасибо! –

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