почему возвращаемое значение onTouchEvent либо вылетает из приложения, либо замораживает mapView? - PullRequest
0 голосов
/ 10 октября 2011

Я работаю над приложением Google Map, где пользователь может касаться карты и отмечать начальную и конечную точки на карте.Затем путь, соединяющий две точки, рисуется на карте.Для обработки сенсорных событий я реализовал метод onTouchEvent внутри класса MapOverlay.Я наблюдал странное поведение с картой.Когда пользователь получает путь, соединяющий две точки, карта зависает, т.е. я не могу перемещаться или масштабировать карту.Я обнаружил, что если возвращаемое значение истинно внутри onTouchEvent, который находится внутри метода MapOverlay, карта зависает в вышеупомянутых обстоятельствах.Если я верну false, карта не будет зависать.Однако, если я хочу снова пометить новые точки на карте, приложение вылетает ... Как это связано с возвращаемым значением onTouchEvent?

Ответы [ 2 ]

1 голос
/ 10 октября 2011

Способ onTouchEvent() даже работает, если вы вернете true, это означает, что событие касания было обработано, и Android не будет продолжать вниз иерархию представления для обработки события касания.Если вы вернете false, оно продолжится.

В этом случае, когда вы всегда возвращаете true, вы всегда говорите, что событие касания было обработано.Таким образом, любые ваши жесты никогда не будут обработаны, потому что вы говорите, что они уже обработаны.Таким образом, похоже, что карта зависает.Вместо этого поместите условие, подобное этому:

@Override
public boolean onTouchEvent(MotionEvent event){
   boolean wasHandled = false;
   if(/* condition where your touch event was handled */)
      wasHandled = true;
   else
      wasHandled = super.onTouchEvent(event);

   return wasHandled;
}

Причина сбоя при возврате false - либо проблема в вашей программе, либо переход в цикл, поскольку событие никогда не обрабатывается.

1 голос
/ 10 октября 2011

Если он возвращает true, обработчик сообщает системе, что он обработал onTouchEvent, и система не вызовет другой onTouchListener.Если вы вернете false, вы скажете системе, что вы не обработали событие touch, и он вызовет onTouchListener базового представления.Ваша карта не останавливается, но она не получает никаких событий касания, потому что ваш обработчик обрабатывает их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...