实战总结 Android 悬浮窗适配方案

背景

游戏内的悬浮窗通常情况下只出现在游戏内,用做切换账号、客服中心等功能的快速入口。本文将介绍几种实现方案,以及我们踩过的坑

方案一:应用外悬浮窗+栈顶权限/生命周期回调

通常实现悬浮窗,首先考虑到的会是要使用悬浮窗权限,用 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 哈,实际使用还需要考虑刘海屏的问题,本文暂未涉及

如果觉得不错,素质三连、或者点个「赞」「在看」都是对笔者莫大的支持,谢谢各位大佬啦~

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20210310A09OCO00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券