我的应用程序 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 时将其强制到前台?