2011-03-03 8 views
0

2D 그래픽 튜토리얼 (관심이있는 사람들, 그 중 하나는 @http://droidnova.com/)을 따라 갔고, 저는 상수를 경험했습니다. 내 onTouchEvent() 콜백에서 충돌이 발생합니다. 여전히 버그를 추적하려고하지만 문제를 디버깅하는 동안 onTouchEvent 콜백이 각 이벤트에 대해 두 번 호출되는 것을 발견했습니다. rerference를 들어Android 2.2 SurfaceView # 각 이벤트마다 onTouchEvent()가 두 번 호출됩니다.

내가 첫 번째 줄에 중단 점을 넣어 디버그 모드에서 실행

@Override 
    public boolean onTouchEvent(MotionEvent event) 
    { 
     int action = event.getAction(); 
     synchronized (getHolder()) { 
      if (action == MotionEvent.ACTION_DOWN) { 
       if (gameObjects.size() < 2) { 
        currentlySelected = new GameObject(BitmapFactory.decodeResource(getResources(), R.drawable.icon)); 
        currentlySelected.getCoordinates().setX((int) event.getX()); 
        currentlySelected.getCoordinates().setY((int) event.getY()); 
       } else { 
        for (GameObject gameObject: gameObjects) { 
         if (gameObject.inBoundingBox(event.getX(), event.getY())) { 
          currentlySelected = gameObject; 
          break; 
         } 
        } 

        if (currentlySelected != null) { 
         // Remember to remove it from the list so that we don't waste time updating it in updatePhysics twice. 
         gameObjects.remove(currentlySelected); 
        } 
       } 
      } else if (action == MotionEvent.ACTION_UP && (currentlySelected != null)) { 
       gameObjects.add(currentlySelected); 
       currentlySelected = null; 
      } else if (action == MotionEvent.ACTION_MOVE) { 
       currentlySelected.getCoordinates().setX((int) event.getX()); 
       currentlySelected.getCoordinates().setY((int) event.getY()); 
      } 
     } 

아니, 콜백은 다음과 액션의 호출됩니다 화면을 터치 할 때 ...

  1. 조치 = 0 (MotionEvent.ACTION_DOWN)
  2. 조치 = 0 (MotionEvent.ACTION_DOWN)
  3. 조치 = 1 (MotionEvent.ACTION_MOVE)
  4. 0,123,
  5. 조치 = 1 (MotionEvent.ACTION_MOVE)는
  6. 조치 = 2 (MotionEvent.ACTION_UP)
  7. 조치 = 2 (MotionEvent.ACTION_UP) 각각의 액션

는 두 번째의 동기화에서 나와서 요구. 누구든지이 행동의 이유를 알고 있습니까?

답변

1

는, 문제는 정말 나를 위해 그것을 해결하기 위해 듯

SurfaceHolder h = getHolder() 
syncronized(h) { 

를해야 라인

synchronized (getHolder()) { 

로했다.

0

우선, 나는 스스로 총 앤드 로이드 신입생이다.

개발자 설명서에 따르면 onTouchEvent 메서드를 사용하면 메서드를 사용자 지정 구현으로 재정의해야합니다. touchevent를 사용하여 액션을 원하는 모든 뷰 객체를 확장해야하므로 오히려 비실용적입니다.

내가 정확히 the android documentation for event handling에서 이해한다면; onTouchEvent 메서드를 구현하는 대신 다양한 이벤트 리스너 중 하나를 구현해야합니다 (필요에 따라). 내 생각에, onTouchEvent를 재정의하는 경우 메서드는 해당 이벤트 핸들러 중 어떤 것이 해당 작업에 적합한 지 스스로 검색해야합니다. 따라서이 이벤트 리스너에게 동일한 정보를 다시 전달해야하므로 동일한 이벤트가 두 번 발생합니다 ...

이것은 단지 내 멍청한 추측입니다. 누군가가 실제로 이것을 증명할 수 있기를 바랍니다. .

나는 동일한 상황에 있으며 여기에 언급 된 문서 페이지에 설명 된 지침을 시험해 볼 것입니다. 이 내용이 변경되면 알려 드리겠습니다. 그것이 나오는 것에 따라

+0

P.S. : 설명대로 추측했지만 더 많은 문제가 발생했습니다 ... 그게 나를위한 막 다른 길인 것 같아요. –

+0

BUMP for interest –

관련 문제