Как контролировать приоритет наложения WindowManager в Oreo? - PullRequest
0 голосов
/ 31 мая 2018

У меня есть оверлей для моего приложения, OV1, который представляет собой кнопку, которую пользователь может перемещать по своему экрану.Когда этот оверлей нажимается, он порождает второй оверлей, OV2, который содержит несколько вспомогательных кнопок, расположенных вокруг текущего местоположения OV1.OV2 также затемняет остальную часть экрана, пока присутствует, используя флаг WindowManager.LayoutParams.FLAG_DIM_BEHIND.

Одна проблема, с которой я столкнулся при первоначальной реализации вышеизложенного, заключается в том, что эффект затемнения был применен ко всему, что не '• OV2, включая OV1, затемняет и делает его не щелкающим, что предотвращает закрытие OV2, поскольку OV1 является кнопкой переключения.Решением, которое я нашел, было задание параметров макета по-разному для каждого наложения:

OV1 получает:

params.type = WindowManager.LayoutParams.TYPE_PRIORITY_PHONE;

Принимая во внимание, что OV2 получает:

params.type = WindowManager.LayoutParams.TYPE_PHONE

Поскольку OV1 имеет более высокий приоритет,он всегда оставался поверх OV2, поэтому FLAG_DIM_BEHIND не влиял на него, и пользователь мог нормально взаимодействовать с OV1, чтобы закрыть меню подкнопок OV2.

Это всегда работало нормально, пока я не началобновление приложения для целевой API Android 27 (Oreo).Как часть необходимых изменений, мне пришлось изменить оба типа параметров оверлеев на WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY, поэтому я утратил способность отдавать OV1 более высокий приоритет, чтобы он оставался поверх OV2.Есть ли альтернативный способ воспроизвести это поведение, гарантируя, что OV1 остается самым верхним наложением, или вытесняя его на передний план всякий раз, когда OV2 порождается?

1 Ответ

0 голосов
/ 16 июня 2018

Хотя я никогда не находил решения для этого, один из обходных путей состоит в том, чтобы заново прикрепить оверлеи к оконному менеджеру в заданном порядке (когда несколько окон типа TYPE_APPLICATION_OVERLAY добавляются в оконный менеджер, самые последние из них идут сверху),вызывая removeViewImmediate (), а затем addView () для представления, которое вы хотите видеть сверху.

Это не красиво, так как пользователь может видеть, что наложение мигает в течение доли секунды, но пока не найдется лучший способ, это придется делать.

...