2012-01-27 24 views
19

Il seguente codice è quello che stavo cercando di usare per il multitouch. Il dito uno è impostato correttamente e si muove quando trascino il dito. Il dito due appare e scompare quando tocco e rilasci il dito, ma non si muove mai. Qualche idea di cosa c'è che non va?Android Multitouch - Second Finger ACTION.MOVE Ignorato

Ho letto developers blog Ancora non capisco quali sono i problemi.

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

risposta

31

Non importa. L'ho riparato. L'evento ACTION.MOVE ottiene sempre zero come pointerId per qualche strana ragione. Per questo motivo, è sempre necessario ricalcolare il puntatoreId all'interno dell'evento come illustrato di seguito:

 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

Si tratta di un errore? Ho lo stesso strano comportamento. Ho cercato su Google e alcune altre persone hanno anche questo. –

+0

Non so se si tratta di un bug, ma questa è una preoccupazione documentata e l'iterazione tramite pointerId lo risolve. Se mai, potrebbe essere solo una strana decisione di progettazione. –

+0

Grazie, è stato molto utile !!! – Jbecwar