背景
游戏内的悬浮窗通常情况下只出现在游戏内,用做切换账号、客服中心等功能的快速入口。本文将介绍几种实现方案,以及我们踩过的坑
方案一:应用外悬浮窗+栈顶权限/生命周期回调
通常实现悬浮窗,首先考虑到的会是要使用悬浮窗权限,用 WindowManager 在设备界面上 addView 实现( UI 层级较高,应用外显示)
1、弹出悬浮窗需要用到悬浮窗权限
2、判断悬浮窗游戏内外显示
方式一:使用栈顶权限获取当前
这里考虑到这种方案网上有很多具体案例,在这里就不实现了。但是这种方案有如下缺点:
适配问题,悬浮窗权限在不同设备上由于不同产商实现不同,适配难
向用户申请权限,打开率较低,体验较差
方案二:addContentView实现
原理:Activity 的接口中除了我们常用的 setContentView 接口外,还有addContentView接口。利用该接口可以在 Activity 上添加 View。
这里你可能会问:
1、那只能在一个 Activity 上添加吧?
没错,是只能在当前 Activity 上添加,但是由于游戏通常也就在一个 Activity 跑,因此基本上是可以接受的。
2、只 add 一个 view,那拖动怎么实现?
通过更新 LayoutParams 调整子 View 在父 View 中的位置就能实现
具体代码如下:
在 Activity 中使用
方案三:WindowManager+应用内层级实现
WindowManger 中的层级有如下两个(其实是一样的~)可以实现在 Activity 上增加 View
具体实现时,WindowManger 相关的核心代码如下:
添加完 view 如何更新位置?
使用 WindowManager 的 updateViewLayout 方法
完整代码如下:
DragViewLayout:
悬浮窗View
使用:
小结
1、方案一需要用到多个权限,显然是不合适的。
2、方案二简单方便,但是用到了 Activity 的 addContentView 方法,在某些游戏引擎上使用会有问题。因为有些游戏引擎不是在 Activity 上跑的,而是在NativeActivity 上跑
3、方案三是我们当前采用的方案,目前还暂未发现有显示不出来之类的问题~
4、本文讲述的方案只是 Demo 哈,实际使用还需要考虑刘海屏的问题,本文暂未涉及
如果觉得不错,素质三连、或者点个「赞」、「在看」都是对笔者莫大的支持,谢谢各位大佬啦~
领取专属 10元无门槛券
私享最新 技术干货