ScaleGestureDetector и GestureDetector могут раздражать друг друга, если они используют одно и то же событие.Однако кажется, что вы можете предотвратить это взаимное раздражение, всегда вызывая детектор весов FIRST, а затем проверяя его метод isInProgress () перед запуском обычного детектора
Лично я не нашел никаких проблем, позволив им обоимобрабатывать одно и то же событие касания.
Андроид GestureDetector
имеет конструктор , который принимает логическое значение ignoreMultiTouch
.Если для ignoreMultiTouch
установлено значение true
, обработка событий прикосновения GestureDetector
будет игнорировать любые события касания.(Android фактически устанавливает ignoreMultiTouch
на true
, если целевой уровень API>> Froyo, поэтому вам, вероятно, не нужно будет явно устанавливать его.)
Если вы вызываете только mPrimaryDetector.onTouchEvent(event)
, когда mScaleDetector.isInProgress()
возвращает false, вы неправильно получите длинное событие нажатия.Причина в том, что GestureDetector
имеет следующий код в onTouchEvent(MotionEvent ev)
, чтобы гарантировать, что он не конфликтует с мультитач-жестами:
case MotionEvent.ACTION_POINTER_DOWN:
if (mIgnoreMultitouch) {
// Multitouch event - abort.
cancel();
}
break;
cancel()
сделает то, что говорит, и отменит любые жесты одним касанием.(Если вам действительно любопытно, вы можете взглянуть на этот код GestureDetector самостоятельно; на самом деле он использует обработчик для отправки / удаления сообщений).
Надеюсь, это поможет всем, у кого возникли такие же проблемыЯ был.