2012-01-27 10 views
19

El siguiente código es lo que he intentado usar para multitouch. El dedo uno está configurado correctamente y se mueve cuando arrastro mi dedo. El dedo dos aparece y desaparece cuando toco y suelto mi dedo, pero nunca se mueve. ¿Alguna idea de lo que está mal?Android Multitouch - Segundo dedo ACTION.MOVE Ignorado

He leído developers blog Todavía no entiendo cuáles son los problemas.

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

Respuesta

31

Nevermind this. Lo arreglé. El evento ACTION.MOVE siempre obtiene cero como puntero por alguna extraña razón. Debido a esto, siempre debe volver a calcular el punteroId dentro del evento como se ve a continuación:

 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

¿Esto es un error? Tengo el mismo comportamiento extraño. Busqué en Google y otras personas también tienen esto. –

+0

No sé si es un error, pero esta es una preocupación documentada y la iteración a través de los punteros lo resuelve. En todo caso, podría ser una decisión de diseño extraña. –

+0

¡Gracias, fue muy útil! – Jbecwar