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 по мере необходимости.

Это достигается путем:

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

Нужно иметь в виду, что 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+.

Другие вопросы по тегам