Android: мультитач и TYPE_SYSTEM_OVERLAY - PullRequest
9 голосов
/ 10 ноября 2011

Я пытаюсь получить несколько событий касания в режиме наложения системы, но получаю только событие MotionEvent.ACTION_OUTSIDE.

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

Любые примеры или ссылки были бы очень полезны.

Ответы [ 2 ]

25 голосов
/ 28 ноября 2011

Чтобы создать вид наложения, при настройке LayoutParams необходимо установить тип на TYPE_SYSTEM_OVERLAY и использовать флаг FLAG_WATCH_OUTSIDE_TOUCH.Это создает проблему, поскольку, как гласит документация Android:

, вы не получите полный жест вниз / перемещение / вверх, только расположение первого вниз как ACTION_OUTSIDE.

Чтобы получить полный массив событий касания, вам нужно использовать тип TYPE_SYSTEM_ALERT, но это приводит к тому, что наложение захватывает экран и останавливает взаимодействие с другими элементами.Решение состоит в том, чтобы использовать TYPE_SYSTEM_OVERLAY и TYPE_SYSTEM_ALERT и переключаться между ними, изменяя тип LayoutParams при необходимости.

Это достигается с помощью:

  1. Смотретьдля события движения ACTION_OUTSIDE.
  2. Когда это происходит, проверьте, не произошло ли это в оверлее.
  3. Если это произошло, переключите тип LayoutParams на TYPE_SYSTEM_ALERT
  4. Как только взаимодействие с оверлеем завершено, переключитесь обратно на TYPE_SYSTEM_OVERLAY
  5. Repeat

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

Также убедитесь, что вы добавили разрешение SYSTEM_ALERT_WINDOW кфайл mainifest.

Я разместил полное решение здесь:
http://www.jawsware.mobi/code_OverlayView/ (ОБНОВЛЕНО)

Включает в себявесь исходный код и ссылку для загрузки всего примера проекта.


Обновление для Android 4.0 - 1/3/2013


Для созданияпредставление наложения, при настройке LayoutParams DON'T установите тип TYPE_SYSTEM_OVERLAY.

Вместо этого установите его на TYPE_PHONE.

Используйте следующие флаги:

FLAG_NOT_TOUCH_MODAL

FLAG_WATCH_OUTSIDE_TOUCH

FLAG_NOT_TOUCH_MODAL << Я нашел это очень важным.Без этого основное внимание уделяется наложению и нажатие программируемых клавиш (домой, меню и т. Д.) Не передается для действия ниже. </p>

Кроме того, предыдущая ссылка (выше)был обновлен, чтобы отразить это обновление.

10 голосов
/ 27 февраля 2012

Начиная с Android 4.x, команда Android из команды Android исправила потенциальную проблему безопасности, добавив новую функцию AdjustWindowParamsLw (), в которую будут добавлены FLAG_NOT_FOCUSABLE, FLAG_NOT_TOUCHABLE и удалены флаги FLAG_WATCH_OUTSIDE_TOUCH для окна TYPE_SYSTEM_OVERLAY. Это 100 *.

.Окно TYPE_SYSTEM_OVERLAY не получит никакого сенсорного события на платформе ICS.

Обновлено: 2016/5/4 TYPE_TOAST не может получать сенсорные события на Android 4.0 ~ 4.3.Это так же, как TYPE_SYSTEM_OVERLAY.В Android 4.4+ TYPE_TOAST удаляется из списка исключенных, поэтому вы можете использовать TYPE_TOAST для получения сенсорных событий на устройствах Android 4.4+.

...