2010-06-30 11 views

Respuesta

38

Implementar onTouchEvent(), y calcular dx y dy por donde el usuario presiona hacia abajo y levanta. Puede usar estos valores para descubrir la dirección del movimiento.

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

Buena respuesta, pero encontré algunos errores tipográficos y tuve que llevar algunas de esas variables a un alcance mayor para hacerlas mutables desde el interior del interruptor. –

+1

Para la segunda caja del interruptor, utilicé ACTION_MOVE en lugar de ACTION_UP porque en un control deslizante de ViewPager se invoca sin ACTION_UP. Tengo una orientación ScrollView w/vertical sostenida por un ViewGroup y esa es una página de ViewPager. Deslizar en ScrollView cambia de página en lugar de no responder. caso MotionEvent.ACTION_MOVE: float dx = event.getX() - x1; float dy = event.getY() - y1; if (Math.abs (dx) <= Math.abs (dy)) {// desplazamiento vertical v.getParent(). RequestDisallowInterceptTouchEvent (true); } else {v.getParent(). RequestDisallowInterceptTouchEvent (false);} break; –

+0

ScrollView w/orientación vertical anidado dentro de otro ScrollView, que se celebró en un ViewGroup que quise decir. –

8

Su mejor opción sería lidiar con el MotionEvent que obtiene de una devolución de llamada de View.OnTouchListener(). Los eventos de movimiento realizan un seguimiento de cómo está interactuando actualmente con la Vista por su propiedad de acción.

Me imagino que puede calcular en qué dirección alguien desliza su dedo examinando la propiedad de acción de MotionEvents y los valores de x/y de donde ocurrió el evento de movimiento.

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

Hay un montón de otros métodos disponibles en el objeto MotionEvent para su uso, así: http://developer.android.com/reference/android/view/MotionEvent.html

+0

el cheque debe ser inferior si '(Math.abs (deltaY)> Math.abs (deltaX))' – tibbi

+0

@tibbi fijo, gracias! –

Cuestiones relacionadas