Android 2.2 SurfaceView # onTouchEvent () вызывается дважды для каждого события - PullRequest
0 голосов
/ 03 марта 2011

Итак, я следовал учебному пособию по 2D-графике (кому интересно, это тот самый @ http://droidnova.com/),), и я дошел до того, что у меня постоянно возникали сбои в моем обратном вызове onTouchEvent ().Я все еще пытаюсь отследить ошибку, но, пытаясь отладить проблему, я заметил, что мой обратный вызов 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. action = 0 (MotionEvent.ACTION_DOWN)
  2. action = 0 (MotionEvent.ACTION_DOWN)
  3. action = 1 (MotionEvent.ACTION_MOVE)
  4. action = 1 (MotionEvent.ACTION_MOVE)
  5. action = 2 (MotionEvent.ACTION_UP)
  6. action = 2 (MotionEvent.ACTION_UP)

для каждого действия, второе выводится при синхронизированном вызове. Кто-нибудь знает причину такого поведения?

Ответы [ 2 ]

1 голос
/ 06 июня 2011

Как оказалось, проблема была со строкой

synchronized (getHolder()) {

Это действительно должно быть

SurfaceHolder h = getHolder()
syncronized(h) {

Это, похоже, решило ее для меня.

0 голосов
/ 04 июня 2011

Во-первых, я сам совершенно новый андроид.

Согласно документации разработчика, метод onTouchEvent требует, чтобы вы переопределили метод своей собственной реализацией. Это кажется довольно непрактичным, так как вам нужно расширить каждый объект просмотра, где бы вы хотели действие с помощью touchevent.

Если я правильно понял из документации Android для обработки событий ; необходимо реализовать один из различных прослушивателей событий (в соответствии с вашими потребностями), а не реализовывать метод onTouchEvent. Мое предположение, что если вы переопределяете onTouchEvent, метод должен сам искать, какой из обработчиков событий подходит для работы. поэтому он должен снова передать ту же информацию этому слушателю события, и поэтому мы имеем «дважды» одно и то же событие, называемое ...

Это всего лишь мое предположение, надеюсь, кто-то действительно сможет это доказать.

Я нахожусь в той же ситуации, и я попробую руководящие принципы, написанные на упомянутой странице документации. Если это изменит вещи, я дам вам знать!

...