2013-10-22 2 views
4

손가락을 계속 누르고있을 때 멀티 터치 이벤트로 터치 색인이 해제되는 문제가 있습니다.Android 멀티 터치 이벤트 색인

내 Java 래퍼 코드가 아래에 붙여 넣어집니다. 이 함수는 activePointer 값을 배열 인덱스로 사용하여 배열에 위/아래 상태를 저장하는 C++ 함수에 activePointer 정수를 전달합니다. Down 이벤트는 배열 값을 true로 설정하고 up 이벤트는 배열 값을 false로 설정합니다. 다음

동작은 하나 개의 손가락이 가압

  • 경우, 인덱스 0에 해당하는 터치.
  • 손가락 두 개를 누르면 터치 인덱스 0과 1이 모두 참입니다.
  • 그런 다음 두 번째 손가락이 제거되면 터치 인덱스 0은 true이고 터치 인덱스 1은 false입니다 (예상대로).
  • 대신 첫 번째 손가락이 제거되고 두 번째 손가락이 계속 터치되는 경우 터치 색인 0과 1은 모두 거짓입니다. 터치 인덱스 0이 false가 될 것으로 예상하고 인덱스 1을 터치하면 여전히 true입니다.

이 내 자바 래퍼 코드 : 나는 문서 here을 읽고

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    Integer activePointer = (event.getAction() >> MotionEvent.ACTION_POINTER_ID_SHIFT); 
    Float x = event.getX(activePointer); 
    Float y = event.getY(activePointer); 

    switch (event.getAction() & MotionEvent.ACTION_MASK) { 
    case MotionEvent.ACTION_DOWN: 
    case MotionEvent.ACTION_POINTER_DOWN: 
     // Log.i("touchtest", "action_down " + activePointer.toString() + 
     // "(" + x + "," + y + ")"); 
     androidRenderer.touch(x, y, activePointer); 
     break; 
    case MotionEvent.ACTION_MOVE: 
     // Log.i("touchtest", "action_move " + activePointer.toString() + 
     // "(" + x + "," + y + ")"); 
     androidRenderer.move(x, y, activePointer); 
     break; 
    case MotionEvent.ACTION_UP: 
    case MotionEvent.ACTION_POINTER_UP: 
     // Log.i("touchtest", "action_up " + activePointer.toString() + "(" 
     // + x + "," + y + ")"); 
     androidRenderer.up(x, y, activePointer); 
     break; 
    } 
    return true; 
} 

하지만 매우 명확하지 않습니다.

나는 event.findPointerIndex 함수로 엉망이되었지만 실제로 무엇을했는지 패턴을 추론 할 수 없었다.

나는 이것이 드문 문제라고 상상할 수 없습니다. 이 경험이있는 사람이 조언을 해줄 수 있습니까? 고맙습니다.

답변

0

나는 멀티 터치 이벤트에서는별로 작동하지 않지만 switch 문에 기본 사례를 포함하면 도움이 될 수 있습니다.

0

(event.getAction() >> MotionEvent.ACTION_POINTER_ID_SHIFT) 당신에게만 포인터 인덱스를 제공합니다. 포인터 인덱스는 전체 멀티 터치 제스처 중에 변경 될 수 있습니다.

실제로 필요한 것은 포인터 ID입니다. MotionEvent.ACTION_POINTER_ID_SHIFT 포인터 이름 대신 포인터 인덱스를 반환하므로 이름이 약간 혼란 스럽습니다. 따라서 API 8 이후로 더 이상 사용되지 않고 MotionEvent.ACTION_POINTER_INDEX_SHIFT로 이름이 바뀌 었습니다. 포인터 ID는 포인터를 고유하게 식별합니다.

포인터 ID를 얻으려면 getPointerId(activePointer)을 사용하십시오.

포인터 ID를 androidRenderer.xxx(x, y, activePointerId);으로 전달하면 문제가 없습니다.