如何在Oreo中控制WindowManager重叠优先级?

时间:2018-05-31 17:58:28

标签: android overlay android-8.0-oreo android-windowmanager android-overlay

我的应用程序OV1有一个叠加层,它基本上是一个用户可以在屏幕上移动的按钮。当按下此叠加层时,它会产生第二个叠加层OV2,其中包含位于OV1当前位置周围的多个子按钮。通过使用标志WindowManager.LayoutParams.FLAG_DIM_BEHIND,OV2还会在屏幕的其余部分变暗。

我在最初实现上述操作时遇到的一个问题是,调光效果是针对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子按钮菜单。

这一直很好,直到我开始更新应用程序以定位Android的API 27(Oreo)。作为所需更改的一部分,我不得不将两个叠加的参数类型更改为WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,因此我失去了为OV1提供更高优先级以确保它保持在OV2之上的能力。是否有另一种方法可以复制此行为,确保OV1仍然是最顶层的叠加层,或者在OV2生成时将其强制转移到前台?

1 个答案:

答案 0 :(得分:0)

虽然我从未找到过这方面的解决方案,但有一种解决方法是按预期的顺序将叠加层重新附加到窗口管理器(当窗口管理器中添加了几个TYPE_APPLICATION_OVERLAY类型的视图时,最新的视图会显示在上面),通过调用removeViewImmediate(),然后调用addView()作为您想要位于顶部的视图。

它并不漂亮,因为用户可以看到叠加层瞬间闪烁,但是直到有更好的方式,它必须要做。

相关问题