2013-12-18 11 views
0

내 앱에 멀티 터치 기능을 추가 할 때 코드에 나타나는 문제를 해결하려고합니다. 문제는 ACTION_POINTER_DOWN에서 온 것 같다 내가 ACTION_POINTER_DOWN에서 getPointerCount() 조건없이 사용할 때, 나는 범위 부족 오류가멀티 터치 - PointerIndex 범위를 벗어났습니다.

private float oldDist = 0; 
backCard.setOnTouchListener(new OnTouchListener() { 
@Override 
     public boolean onTouch(View v, MotionEvent me) { 

      switch(me.getAction()){ 
      case MotionEvent.ACTION_DOWN: 
        firstX = (int) me.getX(); 
      case MotionEvent.ACTION_POINTER_DOWN: 
       if(me.getPointerCount() >= 2){ 
        oldDist = getSpacing(me); 
        System.out.println(oldDist); 
       }      
       break; 
      case MotionEvent.ACTION_MOVE: 
        float newDist = getSpacing(me); 
        if(newDist - oldDist > 200 && oldDist != 0){ 
         System.out.println("Enabled"); 
        } 
       break; 
      case MotionEvent.ACTION_UP:   
      case MotionEvent.ACTION_POINTER_UP: 
       break; 
      } 
      return true; 

     } 
private float getSpacing(MotionEvent me){ 
      float difx = me.getX(0) - me.getX(1); 
      float dify = me.getY(0) - me.getY(1); 
      float spacing = (float) Math.sqrt(difx*difx + dify*dify); 
      return spacing; 
     } 
}); 

. 그러나 조건을 사용하면 로그에 코드에 인쇄 된 내용이 표시되지 않습니다. (물론 두 손가락을 사용합니다! :)), 여러 손가락이 동시에 화면을 터치하더라도 조건은 사실이 아닙니다.

어떻게 해결할 수 있습니까? 고맙습니다.

내 장치는 GS3입니다. 나는 ACTION_DOWN 모든 손가락에 대해 한 번 전달 생각하지 않습니다

+1

. 서로의 밀리 초 내로 손가락을 똑같은 순간에 정확하게내는 것은 거의 불가능합니다. ACTION_MOVE에 중점을 두는 것이 좋습니다. – 323go

답변

1

사용 me.getActionMasked() 대신 me.getAction()

+0

답장을 보내 주셔서 감사합니다. 완벽하게 작동합니다! ;) 그러나 나는 사이트의 다른 답변에서 getAction과 getActionMasked의 차이점을 이해하려고 시도했지만 여전히 회의론자입니다. 나 한테 설명해 줄래 ? 다시 감사합니다. – mickaelb91

+0

문제 없음 :) getAction()은 관련된 포인터에 대한 정보와 함께 발생한 액션을 반환합니다. getActionMasked()는 포인터 정보를 마스킹하고 발생한 동작 만 반환합니다. 'getAction() & MotionEvent.ACTION_MASK'와 비슷합니다. 또한, getAction()은 ACTION_DOWN 등을 제공 할 것이지만, ACTION_POINTER_DOWN과 같은 포인터는 절대 사용하지 않습니다. 이것이 대문자와 소문자가 혼재하기 때문에 if 문을 사용하지 않고 처음 작동 한 이유입니다. :) – Badgerati