推荐使用 FloatWindow 库实现悬浮窗,功能全面,链式调用,简洁清爽。
地址 : https://github.com/yhaolpz/FloatWindow
2017/12/30 更新:
FloatWindow 库已尽量去适配各国产机型,如果你想帮助此库,评论告诉我列表中没有的机型,尤其是适配出现问题的机型,谢谢,以下为目前测试通过的机型:
8.0:
一加 三代
华为 Mate9Pro
小米 6
7.1.1:
小米 6
小米 红米5Plus
OPPO R9s
7.0:
小米 5 V8
小米 Note2 V9
华为 Mate9
华为 荣耀V9
三星 S7Edge
一加 3T
6.0.1
小米 5
小米 红米note3
OPPO A57
6.0:
小米 5
小米 红米4A V8
小米 红米Pro V7
小米 红米Note4 V8
华为 麦芒5
5.1.1:
VIVO X7Plus
OPPO R9Plusm A
小米 红米3
5.1:
美图 V4
5.0.2:
小米 红米Note3 V8
华为 荣耀7
5.0.1:
三星 Note4
5.0:
三星 Note3
三星 GALAXYNote3
VIVO Y33
OPPO R7Plus
4.4.4:
小米 红米note
小米 4
小米 红米2A
OPPO R7s
VIVO Y23L
4.4.2:
华为 畅玩4C
华为 Mate7
原文:
在工作中遇到一个需求,需要在整个应用的上层悬浮显示控件,目标效果如下图:
这样就解决了切换 Activity 时悬浮控件短暂消失一下这个问题,然后在添加悬浮控件时,初始化旋转角度就可以实现文章开头的效果了。但是这种方式存在很大的缺陷,首先就是它不兼容 Andorid 5.0 以下,看看 4.4 那百分之十几的小伙伴,嗯~ 缺陷很大,其次还有一个致命缺陷,不管把悬浮控件设为 INVISIBLE 还是透明,只要已经添加了此控件,在切换时它都会先显示一下,这应该是共享元素动画本身的一个 BUG .
OK~ 放弃共享元素方案, 真的绕不过申请权限了吗再考虑一下 TYPE_TOAST 方案, 为什么它失效了呢应该是系统对此类型的控件加了限制, 对待 TYPE_TOAST 不再跳过检查权限步骤, 而是像 TYPE_PHONE 之类一视同仁, 那为什么我们的 toast 却可以跳过呢toast 不就是 TYPE_TOAST 类型的视图吗不管如何, 反正 toast 是不需要权限的, 那就尝试从 toast 入手. OK~ ,现在的关键词是 自定义 toast .
查看 Toast 类源码, 有一个方法眼前一亮:
Toast 是可以自定义视图的, 这为自定义 toast 提供了可能性, 但是显示时长只能设置为 LENGTH_SHORT 或 LENGTH_LONG ,我们需要的是无限时长, 没有方法实现, 除非反射之类的怪招了~ 嗯~ 下面奉上通过反射实现无限时长 toast 的完整代码 :
有了这个自定义 toast , 跳过权限显示悬浮窗就非常容易了, 理论上可以兼容任意版本,任意机型, 因为这只是一个普通的 toast , 系统没理由不允许一个 toast 显示的~ 然而… 亲测在 Nexus7.1.1 及以上不显示 , 在 Android 4.4 以下无法接受触摸事件, 在小米部分机型上无法改变位置.
OK~ 对比一下这些方案 :
方案1: 申请权限
方案2: 每个界面添加,共享元素过渡
方案3: TYPE_TOAST
方案4:自定义 toast
结合我的需求, 我的悬浮控件并不需要改变位置, 所以最终选择方案为:
最终方案 : 7.0 以下采用自定义 toast, 7.1 及以上引导用户申请权限
如果你的需求也适合此方案的话, 告诉你个好消息, 我已经将此方案封装为可直接调用的库 : FixedFloatWindow , 即 fixed (位置固定的) float(悬浮) Window (窗), 可以很方便的使用 :
最后还有一个问题要解决, 我们要实现的是应用内悬浮控件 , 此方案应用退到后台后仍然可以在桌面显示 , 怎么控制呢我们可以记录当前 start 的 Activity 数量, 每当有 Activity stop 时, 便将此数量减 1 , 当此数量为 0 时表示应用退到后台 , 这时隐藏悬浮窗即可 , 类似于这样:
参考文章:
Android应用内悬浮窗的实现方案
Android 悬浮窗权限各机型各系统适配大全
Android无需权限显示悬浮窗, 兼谈逆向分析app
突破小米悬浮窗权限控制–不需要权限的悬浮窗

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!