У меня есть оверлей для моего приложения, 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 порождается?