2014-12-24 2 views
0

이 책의 코드는 Programming Android, 2nd Edition입니다. 처음에는 두 손가락으로 화면을 터치합니다. 그러면 한 손가락으로 터치 스크린 - java.lang.IllegalArgumentException가 : pointerIndex 범위Android 멀티 터치 포인터 인덱스 범위 외

public boolean onTouch(View v, MotionEvent event) { 
    int action = event.getActionMasked(); 
    int idx; 
    int n; 
    switch (action) { 
     case MotionEvent.ACTION_DOWN: 
     case MotionEvent.ACTION_POINTER_DOWN: 
      idx = MotionEventCompat.getActionIndex(event); 
      tracks.add(event.getPointerId(idx)); 
      break; 
     case MotionEvent.ACTION_POINTER_UP: 
      idx = MotionEventCompat.getActionIndex(event); 
      tracks.remove(event.getPointerId(idx)); 
      break; 
     case MotionEvent.ACTION_MOVE: 
      n = event.getHistorySize(); 
      for (Integer i : tracks) { 
       idx = event.findPointerIndex(i.intValue()); 
       for (int j = 0; j < n; j++) { 
        addDot(
          dots, 
          event.getHistoricalX(idx, j), 
          event.getHistoricalY(idx, j), 
          event.getHistoricalPressure(idx, j), 
          event.getHistoricalSize(idx, j) 
        ); 
       } 
      } 
      break; 
     default: 
      return false; 
    } 
    for (Integer i: tracks){ 
     idx = event.findPointerIndex(i.intValue()); 
     addDot(
       dots, 
       event.getX(idx), 
       event.getY(idx), 
       event.getPressure(idx), 
       event.getSize(idx) 
     ); 
    } 
    return true; 
} 

답변

0

있어서 findPointerIndex()로부터 반환 될 수 -1. 내가 경험 한 것으로부터 2 손가락 (또는 그 이상)으로 만져 첫 번째로 누른 손가락을 놓을 때 일어날 것입니다. 이것은 'pointerIndex가 범위를 벗어난'오류의 원인이라고 생각합니다. -1은 유효한 색인이 아니기 때문에 :-)

ACTION_MOVE의 경우 getPointerCount()와 함께 루프를 사용하는 것이 좋습니다. 즉 0에서 getPointerCount() - 1 이 방법을 사용하면 getX (손가락) 및 getY (손가락)로 터치 위치를 가져올 수 있습니다. 여기서 'finger'는 루프 카운트입니다. 이 방법을 사용하면 손가락에 어떤 ID가 있는지 추적 할 수 없습니다. 즉, 두 손가락으로 누르고 첫 번째 손가락 (ID = 0)을 놓으면 두 번째 손가락이 첫 번째 손가락으로 계산됩니다. 눌렀다)

희망이 도움이! /리차드

관련 문제