2010-06-30 5 views

Répondre

38

Mettre en oeuvre onTouchEvent(), et calculer dx et dy par où l'utilisateur appuie vers le bas et se soulève. Vous pouvez utiliser ces valeurs pour déterminer la direction du déplacement.

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

Bonne réponse, mais j'ai trouvé quelques fautes de frappe et j'ai dû amener certaines de ces variables à une plus grande portée pour les rendre mutables depuis l'intérieur du commutateur. –

+1

Pour le deuxième cas de commutation, j'ai utilisé ACTION_MOVE au lieu de ACTION_UP, car dans un aperçu ViewPager est appelé sans ACTION_UP. J'ai un ScrollView w/orientation verticale tenue par un ViewGroup et c'est une page ViewPager. Glisser sur ScrollView change la page au lieu de ne pas répondre. cas MotionEvent.ACTION_MOVE: float dx = événement.getX() - x1; float dy = événement.getY() - y1; si (Math.abs (dx) <= Math.abs (dy)) {// défilement vertical v.getParent(). RequestDisallowInterceptTouchEvent (true); } else {v.getParent(). RequestDisallowInterceptTouchEvent (false);} pause; –

+0

ScrollView w/orientation verticale imbriqué dans un autre ScrollView, détenu par un ViewGroup I signifiait. –

8

Votre meilleur pari serait de faire face aux MotionEvent que vous obtenez d'un rappel View.OnTouchListener(). Les événements de mouvement gardent une trace de la façon dont vous êtes en train d'interagir avec la vue par sa propriété d'action.

J'imagine que vous pouvez calculer dans quelle direction quelqu'un glisse son doigt en examinant la propriété d'action de MotionEvents et les valeurs x/y de l'endroit où l'événement de mouvement a eu lieu.

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

Il y a beaucoup d'autres méthodes disponibles sur l'objet MotionEvent pour une utilisation aussi bien: http://developer.android.com/reference/android/view/MotionEvent.html

+0

la vérification de fond doit être 'si (Math.abs (deltaY)> Math.abs (deltaX))' – tibbi

+0

@tibbi fixe, merci! –

Questions connexes