2012-01-27 2 views
19

Le code suivant est ce que j'ai essayé d'utiliser pour le multitouch. Doigt un est réglé correctement et se déplace lorsque je fais glisser mon doigt. Doigt deux apparaît et disparaît quand je touche et relâche mon doigt, mais il ne bouge jamais. Une idée de ce qui ne va pas? J'ai lu developers blog Je ne comprends toujours pas quels sont les problèmes.Android Multitouch - Deuxième doigt ACTION.MOVE ignoré

@Override 
    public boolean onTouchEvent(MotionEvent event) { 
     int action = event.getAction() & MotionEvent.ACTION_MASK; 
     int pointerIndex = (event.getAction() & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT; 
     int pointerId = event.getPointerId(pointerIndex); 
     switch (action) { 
     case MotionEvent.ACTION_DOWN: 
     case MotionEvent.ACTION_POINTER_DOWN: 
      if (pointerId == 0) 
      { 
       fingerOneDown = 1; 
       fingerOneX = event.getX(pointerIndex); 
       fingerOneY = event.getY(pointerIndex); 
      } 
      if (pointerId == 1) 
      { 
       fingerTwoDown = 1; 
       fingerTwoX = event.getX(pointerIndex); 
       fingerTwoY = event.getY(pointerIndex); 
      } 
      break; 

     case MotionEvent.ACTION_UP:   
     case MotionEvent.ACTION_POINTER_UP: 
     case MotionEvent.ACTION_CANCEL: 
      if (pointerId == 0) 
      { 
       fingerOneDown = 0; 
       fingerOneX = event.getX(pointerIndex); 
       fingerOneY = event.getY(pointerIndex); 
      } 
      if (pointerId == 1) 
      { 
       fingerTwoDown = 0; 
       fingerTwoX = event.getX(pointerIndex); 
       fingerTwoY = event.getY(pointerIndex); 
      } 
      break; 

     case MotionEvent.ACTION_MOVE: 
      if (pointerId == 0) 
      { 
       fingerOneDown = 1; 
       fingerOneX = event.getX(pointerIndex); 
       fingerOneY = event.getY(pointerIndex); 
      } 
      if (pointerId == 1) 
      { 
       fingerTwoDown = 1; 
       fingerTwoX = event.getX(pointerIndex); 
       fingerTwoY = event.getY(pointerIndex); 
      } 

      break; 
     } 
     return true; 
    } 

Répondre

31

Ne l'ignorez pas. Je l'ai corrigé. L'événement ACTION.MOVE obtient toujours zéro comme pointeur pour une raison étrange. Pour cette raison, vous devez toujours recalculer le pointeurId dans l'événement comme indiqué ci-dessous:

 case MotionEvent.ACTION_MOVE: 

     int pointerCount = event.getPointerCount(); 
     for(int i = 0; i < pointerCount; ++i) 
     { 
      pointerIndex = i; 
      pointerId = event.getPointerId(pointerIndex); 
      Log.d("pointer id - move",Integer.toString(pointerId)); 
      if(pointerId == 0) 
      { 
       fingerOneDown = 1; 
       fingerOneX = event.getX(pointerIndex); 
       fingerOneY = event.getY(pointerIndex); 
      } 
      if(pointerId == 1) 
      { 
       fingerTwoDown = 1; 
       fingerTwoX = event.getX(pointerIndex); 
       fingerTwoY = event.getY(pointerIndex); 
      } 
     } 
     break; 
+0

Est-ce un bug? J'ai le même comportement étrange. J'ai cherché dans Google et d'autres personnes l'ont aussi. –

+0

Je ne sais pas s'il s'agit d'un bug, mais ceci est une préoccupation documentée et l'itération à travers le pointerIds le résout. Si quelque chose, il pourrait juste être une décision de conception étrange. –

+0

Merci, c'était très utile !!! – Jbecwar