2013-02-14 4 views
3

내 응용 프로그램에서 나는 아마도 여러 개의 터치 위치에서 방출되는 입자를 가지고 노력하고있어. 새로운 터치 MotionEvent.ACTION_POINTER_DOWN의 경우, I 예를 onTouchEvent 내부안드로이드 타이머 유출

private static class Touch 
{ 
    public Timer timer = new Timer(); 
    public vec position = new vec(); 
} 

:

Touch t = new Touch(); 
t.position = new vec(event.getX(id), event.getY(id)); 
t.timer.scheduleAtFixedRate(new TimeredTouchTask(t.position, id), 0, SHOOTING_INTERVAL); 

및 보관

나는 점과 관련 타이머를 저장하는 클래스가 지도 내에서 터치 ID를 키로 사용합니다.

MotionEvent.ACTION_POINTER_UP가 실행되면 타이머에서 cancel()을 호출하고지도에서 제거하여 터치를 제거합니다.

마지막으로 이벤트의 유형이 MotionEvent.ACTION_MOVE 인 경우 간단히지도 내부의 모든 Touch 인스턴스를 반복하고 벡터 좌표를 업데이트합니다.

이 기능은 작동하지만 때로는 타이머가 제대로 제거되지 않고, 아무 것도하지 않고 살아있을 때가 있습니다. 그리고 때때로 화면을 만지지도 입자를 실제로 쏘고 있습니다.

어떻게이 코드를보다 견고하게 만들 수있어 항상 올바르게 동작할까요?

EDIT1 : ACTION_POINTER_UP

내가

private void removeTouch(int id) 
{ 
    Touch t = _touch.get(id); 

    if(t != null) 
    { 
     if(t.timer != null) 
     { 
      t.timer.cancel(); 
      t.timer = null; 
     } 

     t = null; 
     _touch.remove(id); 
    } 
} 

EDIT2이 방법을 호출

의 코드 : 일부 로그를 검사하여 전체 목록 LINK

나는 발견 그 예를 들어 : 터치 손가락 # 1 손가래 # 2 손가래 # 3 해제 손가락 # 3 해제 손가락 # 2 출시 손가락 # 1

는 확인 만하고 있습니다 :

터치 손가락 # 1 터치 손가락 # 2 터치 손가락 # 3 출시 손가락 # 1 출시 손가락 # 2 릴리스 손가락 # 3

은 마지막 타이머를 유출합니다. ID와 인덱스를 확실히 망치고 있다고 생각합니다. 등 getX(id)의 사용에서 판단

+0

ACTION_POINTER_UP을 처리하고 타이머를 취소 할 때 코드를 게시 할 수 있습니까? – Matthieu

+0

업데이트 됨 ... 아마도 잘 수행되지 않았을 수 있습니다. –

+0

그게 나에게 잘 어울리는 군 ... 아마도 가장 좋은 것은 당신이 디버그 프린트 (id로)를 추가하고 어쩌면 테스트가 실패했는지 (! = null), 또는 콜 취소 할 수는 있지만 실제로는 효과가 없습니다 ... – Matthieu

답변

1

, 내가 id을 추측하고있어 포인터 인덱스이 아닌 포인터 ID입니다. 포인터 인덱스는 터치 이벤트에서 지속되도록 보장되지 않으므로 이후 이벤트에 사용할 때 동일한 타이머를 찾지 못할 수 있습니다.

어느 것이 어느 것을 추적하려면 포인터 ID를 사용해야합니다. getPointerId()은 각 색인에 대해 알려줍니다.

아직 읽지 않았다면 Android 블로그에서 Making Sense of Multitouch을 읽는 것이 좋습니다.

+0

제가 생각하는 올바른 가치를 사용하고 있습니다. 먼저 event.getActionIndex()를 사용하여 인덱스를 얻은 다음 id 변수를 event.getPointerId (index)에 할당합니다. –

+0

정말입니까? 왜냐하면'getX()'는 id가 아닌 포인터 인덱스를 취하고 거기에'id'를 사용하고'TimeredTouchTask()'를 만들 때 다음 줄에 동일한'id'를 사용하기 때문입니다. 둘 중 하나가 옳지 않은 것 같습니다. – Geobits

+0

설명서에 색인이 나와 있지만 분명히 ID를 언급하고 있습니까? getX >> "주어진 포인터 인덱스에 대해이 이벤트의 X 좌표를 반환합니다 (이 인덱스의 포인터 식별자를 찾기 위해 getPointerId (int) 사용). 전체 숫자는 픽셀이며, 값은 하위 인 입력 장치의 분수를 가질 수 있습니다 픽셀 정확한. " 나는 잘 모르겠지만 나의 좌표는 정확합니다. –