0

我的应用程序 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 子按钮菜单。

这一直运行良好,直到我开始更新应用程序以针对 Android 的 API 27 (Oreo)。作为所需更改的一部分,我不得不将两个叠加层的参数类型都更改为 WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,因此我失去了赋予 OV1 更高优先级以确保它保持在 OV2 之上的能力。是否有替代方法来复制此行为,确保 OV1 保持在最顶层,或者在生成 OV2 时将其强制到前台?

4

1 回答 1

0

虽然我从未找到解决方案,但一种解决方法是通过调用 removeViewImmediate 以预期的顺序将叠加层重新附加到窗口管理器(当将 TYPE_APPLICATION_OVERLAY 类型的多个视图添加到窗口管理器时,最新的视图位于顶部) () 后跟 addView() 以获得您想要位于顶部的视图。

这并不漂亮,因为用户可以看到覆盖在一瞬间消失,但​​在有更好的方法之前,它必须这样做。

于 2018-06-16T01:54:07.297 回答