Intereting Posts
Android ListView с CursorAdapter имеет неправильную позицию прокрутки после вызова Requery при добавлении новых элементов InflateException: двоичная строка XML-файла # 1: ошибка раздувания класса <unknown>, вызванная OutOfMemoryError Не может избавиться от ошибки "/ usr / bin / ld: не удается найти -lncurses" Как имитировать общую потерю сети в Android Emulator Получить ширину родительского макета Как передать текст в WhatsApp из моего приложения? Как выбрать видео из галереи в телефоне? Как установить / обновить / удалить APK с помощью класса PackageInstaller в Android L? Где хранятся чертежи или клипарт из файла android.R.drawable? Android Google MapView показывает только пустые фрагменты Управление текущими объектами View и Class <?> Получение имени пользователя Android в телефоне Что такое эквивалент ярлыка Eclipse Ctrl + O в Android Studio? Драйвер не смог установить безопасное соединение с SQL Server с использованием шифрования Secure Sockets Layer (SSL) Где можно найти AndroidObservable.fromBroadcast?

Android: Multi touch и TYPE_SYSTEM_OVERLAY

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

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

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

Solutions Collecting From Web of "Android: Multi touch и TYPE_SYSTEM_OVERLAY"

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

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

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

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

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

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

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

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

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


Обновление для Android 4.0 – 1/3/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+.