#android #events #multi-touch
#Android #Мероприятия #мультитач
Вопрос:
Я пытаюсь получить события нескольких касаний в системном представлении наложения, но получаю только MotionEvent.ACTION_OUTSIDE
событие.
Есть ли какой-либо возможный способ получения событий нескольких касаний на системном оверлее?
Любые примеры или ссылки были бы очень полезны.
Ответ №1:
Чтобы создать вид наложения, при настройке 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
разрешение к файлу mainifest.
Я опубликовал полное решение здесь:
http://www.jawsware.mobi/code_OverlayView (ОБНОВЛЕНО)
Он включает в себя весь исходный код и ссылку для загрузки всего примера проекта.
Обновление для Android 4.0 — 1/3/2013
Чтобы создать вид наложения, при настройке параметров LAYOUT НЕ задавайте тип на TYPE_SYSTEM_OVERLAY
.
Вместо этого установите для него значение TYPE_PHONE
.
Используйте следующие флаги:
FLAG_NOT_TOUCH_MODAL
FLAG_WATCH_OUTSIDE_TOUCH
FLAG_NOT_TOUCH_MODAL
<< Я нашел это довольно важным. Без этого основное внимание уделяется наложению, а нажатия программных клавиш (home, menu и т.д.) Не передаются для выполнения действия ниже.
Кроме того, предыдущая ссылка (выше) была обновлена, чтобы отразить это обновление.
Комментарии:
1. Спасибо Jawsware за обновление. Но с вашей логикой я также не могу видеть события нескольких касаний на оверлее. Я имею в виду, что если вы держите первый палец на экране, а затем второй, а затем третий (не поднимая предыдущие), мы должны иметь возможность получать события касания (т. Е. Должна вызываться onTouch ()).). Возможно ли это в любом случае?
2. Вы не будете получать информацию о мультитач в
TYPE_SYSTEM_OVERLAY
состоянии. Как только вы переключитесь наTYPE_SYSTEM_ALERT
(т. Е. поднимете палец после нажатия внутри наложения), вы должны получать события мультитач. Я добавлялnPOINTERS: " event.getPointerCount()
к каждому изinfo.setText
вызовов в моем примере, и количество указателей увеличивалось уменьшалось по мере того, как я касался поднимал пальцы. После первого отключения я получал только события перемещения, но количество указателей все еще менялось.3. Но на самом деле я хочу получить мультитач с помощью TYPE_SYSTEM_OVERLAY. Возможно ли это в любом случае?
4. Я не понимаю, как, потому что вы получаете только
ACTION_OUTSIDE
. Вы не получите UP / DOWN / MOVE. Единственное решение, которое я смог придумать, — это активировать нажатием… Сделай что-нибудь… Жест / кнопка для деактивации.5. Да, вы правы, Jawsware. Мы можем получать ACTION_OUTSIDE только с помощью TYPE_SYSTEM_OVERLAY. Но есть ли какой-либо способ получить даже события типа «TYPE_SYSTEM_OVERLAY» ВВЕРХ / ВНИЗ / ПЕРЕМЕСТИТЬ и т.д.? События типа «TYPE_SYSTEM_OVERLAY»?
Ответ №2:
Начиная с Android 4.x, Android team Команда 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 .
Комментарии:
1. Это полезно! Итак, что вы предлагаете мне использовать вместо FLAG_WATCH_OUTSIDE_TOUCH для достижения той же функциональности до Android 4.0. Есть ли другой флаг, который следует реализовать вместо этого?