Android: Мультитач и TYPE_SYSTEM_OVERLAY

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

Это достигается с помощью:

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

Единственное, что следует иметь в виду, это то, что 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. Есть ли другой флаг, который следует реализовать вместо этого?