Получение вида, который получает все сенсорные события - PullRequest
7 голосов
/ 19 июля 2011

У меня есть системный оверлей, который выше всех Activities и Windows. Единственная проблема заключается в том, что он может обнаруживать MotionEvents только тогда, когда пользователь помещает его / ее вниз на экран (он не может отслеживать движения пальца или обнаруживает, когда палец поднят). В качестве возможного решения я реализовал второе представление (назовем его представлением отслеживания), которое способно обрабатывать все события касания, но остается скрытым до тех пор, пока касание системы не будет обнаружено в оверлейной системе; в этом случае появится окно отслеживания. Единственная проблема заключается в том, что представление отслеживания не начинает обнаруживать сенсорные события, пока пользователь не опустит палец вниз на экран. Поэтому, чтобы решить эту проблему, я хочу перехватить представление, получающее события касания (то есть представление под наложением системы), и переслать все его события касания в представление отслеживания для обработки.

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

Этот вопрос относится к примерам, используемым в этом вопросе .

1 Ответ

6 голосов
/ 08 января 2013

Вы не можете сделать именно то, что вы просите.Система ввода очень осторожна, чтобы ограничить какие окна могут получать какие события;он намеренно не похож на другие системы, такие как Microsoft Windows, где вы можете участвовать в низкоуровневой диспетчеризации событий и видеть все происходящее.Допускаются только следующие вещи:

  • Окно, которое может принимать все события, которые будут идти к нему, или любые окна позади него (без возможности получения этих событий окнами позади него).Это называется «сенсорный модальный режим».
  • Окно, которое может получать все события в пределах своего прямоугольника, не позволяя тем из них перейти в окна позади него, но события вне прямоугольника могут переходить в соответствующее окно позади него безбыть увиденным этим.Это называется «не сенсорный модал».
  • Вариант «не сенсорный модал», который позволяет ему сообщать только о событии сбоя, происходящем за пределами его окна.Однако он не будет получать никаких других дальнейших событий и доставляется в виде кода специального действия: http://developer.android.com/reference/android/view/MotionEvent.html#ACTION_OUTSIDE

Еще одно основное правило отправки событий в окна состоит в том, что после выбора окна в качествецель сенсорного события, он будет продолжать получать поток событий до финала.Традиционно в Android это применяется ко всем дальнейшим пальцам жеста касания (он получает все пальцы, независимо от того, где они появляются, пока последний палец не поднимется).Более поздние версии платформы позволяют вам изменять это поведение, чтобы оно поддерживало работу с несколькими касаниями: http://developer.android.com/reference/android/view/WindowManager.LayoutParams.html#FLAG_SPLIT_TOUCH

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

...