Android: мультитач и TYPE_SYSTEM_OVERLAY
Я пытаюсь получить несколько событий касания в режиме наложения системы, но получаю только MotionEvent.ACTION_OUTSIDE
событие.
Есть ли какой-нибудь возможный способ получения нескольких событий касания на системном оверлее?
Любые примеры или ссылки будут очень полезны.
2 ответа
Чтобы создать вид наложения, при настройке 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
- Повторение
Нужно иметь в виду, что ACTION_OUTSIDE
Событие движения всегда передается остальным элементам на экране. Так, например, если наложение находится над кнопкой, эта кнопка также получит событие движения, и ее невозможно остановить.
Также убедитесь, что вы добавляете SYSTEM_ALERT_WINDOW
разрешение на основной файл.
Я разместил полное решение здесь:
http://www.jawsware.mobi/code_OverlayView/ (ОБНОВЛЕНО)
Он включает в себя весь исходный код и ссылку для загрузки всего примера проекта.
Обновление для Android 4.0 - 03.01.2013
Чтобы создать вид наложения, при настройке LayoutParams НЕ устанавливайте тип TYPE_SYSTEM_OVERLAY
,
Вместо этого установите его TYPE_PHONE
,
Используйте следующие флаги:
FLAG_NOT_TOUCH_MODAL
FLAG_WATCH_OUTSIDE_TOUCH
FLAG_NOT_TOUCH_MODAL
<< Я нашел это очень важным. Без этого основное внимание уделяется наложению, а нажатие программных клавиш (домой, меню и т. Д.) Не передается в упражнении ниже.
Кроме того, предыдущая ссылка (выше) была обновлена, чтобы отразить это обновление.
Начиная с Android 4.x, команда Android из команды Android исправила потенциальную проблему безопасности, добавив новую функцию AdjustWindowParamsLw(), в которую будут добавлены FLAG_NOT_FOCUSABLE, FLAG_NOT_TOUCHABLE и удалены флаги FLAG_WATCH_OUTSIDE_TOUCH для окна TYPE_SYSTEM_OVERLAY.
Это окно 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+.