2012-01-27 18 views
19

Aşağıdaki kod, multitouch için kullanmaya çalıştığım şeydir. Bir parmak doğru ayarlanmış ve parmağımı sürüklediğimde hareket ediyor. Parmağım dokunduğumda ve bıraktığımda iki parmağım çıkar ve kaybolur, ama asla hareket etmez. Neyin var?Android Multitouch - İkinci Parmak ACTION.MOVE Yok Sayılan

developers blog'u okudum Sorunların ne olduğunu hala anlamadım.

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

cevap

31

Nevermind this. Onardım. ACTION.MOVE olayı her zaman garip bir nedenle pointerId olarak sıfır olur. Bu nedenle, her zaman aşağıdaki gibi olay içinde pointerId yeniden hesaplamak zorunda:

 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

Bu bir hata mı? Aynı garip davranışlarım var. Google'da arama yaptım ve diğer bazı insanlar da buna sahip. –

+0

Bir hata olup olmadığını bilmiyorum, ancak bu belgelenmiş bir endişe ve iþaretçi ile yinelemek onu çözüyor. Bir şey varsa, bu sadece garip bir tasarım kararı olabilir. –

+0

Teşekkür ederim, çok yardımcı oldu! – Jbecwar