2010-06-30 14 views

risposta

38

Implementare onTouchEvent(), e calcolare dx e dy da cui l'utente preme verso il basso e solleva. Puoi usare questi valori per capire la direzione del movimento.

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

Buona risposta, ma ho trovato alcuni errori di battitura e ho dovuto portare alcune di quelle variabili a un livello superiore per renderle mutabili dall'interno dello switch. –

+1

Per il secondo caso di commutazione ho utilizzato ACTION_MOVE anziché ACTION_UP perché in uno swap di ViewPager viene richiamato senza ACTION_UP. Ho una ScrollView con orientamento verticale detenuta da un ViewGroup e questa è una pagina ViewPager. Scorri su ScrollView cambia pagina invece di non rispondere. caso MotionEvent.ACTION_MOVE: float dx = event.getX() - x1; float dy = event.getY() - y1; if (Math.abs (dx) <= Math.abs (dy)) {// scroll verticale v.getParent(). RequestDisallowInterceptTouchEvent (true); } else {v.getParent(). RequestDisallowInterceptTouchEvent (false);} break; –

+0

ScrollView con orientamento verticale nidificato all'interno di un altro ScrollView, tenuto da un ViewGroup che intendevo. –

8

La soluzione migliore sarebbe occuparsi di MotionEvent che si ottiene da una richiamata di View.OnTouchListener(). Gli eventi di movimento tengono traccia di come stai interagendo attualmente con la Vista tramite la sua proprietà di azione.

Immagino che tu possa calcolare in quale direzione qualcuno fa scorrere il dito esaminando la proprietà di azione di MotionEvents e i valori x/y di dove si è verificato l'evento di movimento.

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

Ci sono molti altri metodi disponibili per l'oggetto MotionEvent per uso pure: http://developer.android.com/reference/android/view/MotionEvent.html

+0

l'assegno di fondo dovrebbe essere 'if (Math.abs (DeltaY)> Math.abs (deltaX))' – tibbi

+0

@tibbi fisso, grazie! –

Problemi correlati