2011-05-08 6 views
7

보기에서 멀티 터치를 처리하는 Android 애플리케이션을 개발했습니다. 나는 기본적으로 ACTION_UP, ACTION_MOVE 같은 발생할 수있는 여러 MotionEvents을 추적, ... View 클래스에서 내 덮어 onTouch 방법은 다음과 같습니다 : 내 휴대 전화 (삼성 갤럭시 S)에Android 멀티 터치 : ACTION_UP이 항상 호출되지는 않습니까?

public boolean onTouch(View view, MotionEvent event) 
{ 
    int action = event.getAction() & MotionEvent.ACTION_MASK; 

    if (action == MotionEvent.ACTION_DOWN) { 
     float x = event.getX(); 
     handleTouchStart(view, x); 
    } else if (action == MotionEvent.ACTION_UP) { 
     float x = event.getX(); 
     handleTouchEnded(view, x); 
    } else if (action == MotionEvent.ACTION_POINTER_DOWN) { 
     int pointer = (event.getAction() & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT; 
     float x = event.getX(pointer); 
     handleTouchStart(view, x); 
    } else if (action == MotionEvent.ACTION_POINTER_UP) { 
     int pointer = (event.getAction() & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT; 
     float x = event.getX(pointer); 
     handleTouchEnded(view, x); 
    } else if (action == MotionEvent.ACTION_MOVE) { 
     int pointer = (event.getAction() & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT; 
     float x = event.getX(pointer); 
     handleTouchMoved(view, x); 
    } 

    return true; 
} 

이 완벽하게 작동합니다. 모든 handleTouchStart()에 대해 적절한 handleTouchEnded()가 호출됩니다. 이것은 내 애플 리케이션을 위해 중요합니다. 화면의 왼쪽 하단에 조향 영역이있는 2D sidescroller입니다. 어떤 이유로 사용자가 터치 스크린에서 손가락을 떼었을 때 handleTouchEnded() 메서드가 호출되지 않으면 플레이어의 문자가 계속 실행됩니다.

다른 기기 (HTC Desire와 같은)의 플레이어로부터 드물게 화면의 조정 영역에서 손가락을 떼어도 실제로 방향이 계속 돌아가는보고를 받았습니다. 나는 handleTouchEnded()가 호출되지 않았고, ACTION_UP (또는 ACTION_POINTER_UP) 이벤트가 생성되지 않는다는 것을 의미하는 경우에만 이것이 발생할 수 있다고 결론을 내렸다.

멀티 터치 지원 장치 별 구현이 있습니까? 각 ACTION_DOWN (또는 ACTION_POINTER_DOWN) MotionEvent에 대해 적절한 ACTION_UP (또는 ACTION_POINTER_UP) MotionEvent가 호출된다는 보장이 있습니까? 또는 나는 무엇인가 놓치고 있냐? 내 onTouch 구현이 정확합니까?

더 넓은 질문 : '액션'게임을위한 멀티 터치 터치 스크린 입력을 처리하는 더 좋은 방법이 있습니까? 저는 기본적으로 게임 패드의 조향 십자의 좌우 컨트롤을 모방하고 있습니다. 나는 onPress 및 onRelease 이벤트를 추적 할 수 없기 때문에 Android의 UI 버튼이 충분한 유연성을 제공하지 않는다는 사실을 발견했습니다. 그렇지 않습니까?

+0

우연히 발생하는 빈도를 알고 계십니까? –

답변

15

뭔가가 누락되었습니다. ;) 처리해야하는 작업 유형이 하나 더 있습니다 (ACTION_CANCEL). 진행중인 제스처가 더 높은 수준에서 중단 될 때 ACTION_CANCEL이 전송됩니다. 일부 높은 수준의 구성 요소가 제스처를 가로 채고이를 가져간 것일 수 있습니다.

+1

대단히 감사합니다! 내가 나 자신을 보지 못했다고는 믿을 수 없다. 그러나 이러한 제스처는 다른 하드웨어에서 다르게 작동한다는 것이 이상하게 보입니다. –

관련 문제