Чтобы создать вид наложения, при настройке LayoutParams
необходимо установить тип на TYPE_SYSTEM_OVERLAY
и использовать флаг FLAG_WATCH_OUTSIDE_TOUCH
.Это создает проблему, поскольку, как гласит документация Android:
, вы не получите полный жест вниз / перемещение / вверх, только расположение первого вниз как ACTION_OUTSIDE
.
Чтобы получить полный массив событий касания, вам нужно использовать тип TYPE_SYSTEM_ALERT
, но это приводит к тому, что наложение захватывает экран и останавливает взаимодействие с другими элементами.Решение состоит в том, чтобы использовать TYPE_SYSTEM_OVERLAY
и TYPE_SYSTEM_ALERT
и переключаться между ними, изменяя тип LayoutParams
при необходимости.
Это достигается с помощью:
- Смотретьдля события движения
ACTION_OUTSIDE
. - Когда это происходит, проверьте, не произошло ли это в оверлее.
- Если это произошло, переключите тип
LayoutParams
на TYPE_SYSTEM_ALERT
- Как только взаимодействие с оверлеем завершено, переключитесь обратно на
TYPE_SYSTEM_OVERLAY
- 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>
Кроме того, предыдущая ссылка (выше)был обновлен, чтобы отразить это обновление.