FloatingX ,一个强大的免权限悬浮窗组件,支持全局,以及局部悬浮窗。
在前几个月的业务开发中,我们 app
需要对悬浮窗进行更改,常见的悬浮窗实现方式分为两种:
WindowManager
实现DecorView
实现的插入悬浮窗选用怎样的方案,主要根据业务的定向, 因为我们的业务不是视频通话类,而是菜谱工具类,所以我们不愿意让用户为此去设置中授予权限,这是一件成本较大的事,故采用了后者的方案,业内知乎也使用的这种方案。
在之前的版本中,我们已经采用了后者的方案,先前的同学使用了插入到 content
中实现,但没有经过太多封装,代码直接插入到了 base
层,对于当下而言,基本符合使用,但扩展成本太高,对于未来而言,这显然不满足要求。
于是我希望有这样一个组件,它必须具备以下基本要求:
这是最开始的功能,但随着封装过程,以及对比知乎等其他悬浮窗,我发现可能可以让这个东西更有意思,而不只是一个工具类。
经过了十几个版本的优化与测试,终于,FloatingX 迎来了rc版本,api已相对固定👏,目前已在线上运行3个月+(beta开始),已通过测试市场常见近百款机型。
Github: https://github.com/Petterpx/FloatingX。
FloatingX 具备以下功能:
ViewGroup
, Fragment
, Activity
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
dependencies {
implementation 'com.github.Petterpx:FloatingX:1.0-rc02'
}
开启日志查看器,将看到Fx整个运行轨迹,更便于发现问题以及追踪解决。同时支持自定义日志tag
kt
FloatingX.init {
setContext(this@CustomApplication)
setLayout(R.layout.item_floating_new)
addBlackClass(
MainActivity::class.java,
NewActivity::class.java,
ImmersedActivity::class.java
)
//只有调用了show,才会监听app-lifecycle,后续会自动插入activity中
show()
}
Java
AppHelper helper = AppHelper.builder()
.setContext(application)
.setLayout(R.layout.item_floating)
.build();
FloatingX.init(helper);
kt
ScopeHelper.builder {
setLayout(R.layout.item_floating)
}.toControl(activity)
kt && java
ScopeHelper.builder()
.setLayout(R.layout.item_floating)
.build()
.toControl(activity)
.toControl(fragment)
.toControl(viewgroup)
private val activityFx by activityToFx(activity) {
setLayout(R.layout.item_floating)
}
private val fragment by fragmentToFx(fragment) {
setLayout(R.layout.item_floating)
}
private val viewFx by createFx({
init(viewGroup)
}) {
setLayout(R.layout.item_floating)
setEnableLog(true, "main_fx")
}
private val customCreateFx by createFx {
setLayout(R.layout.item_floating)
build().toControl(activity)
build().toControl(fragment)
build().toControl(viewgroup)
}
App 级别悬浮窗 基于
DecorView
的的实现方案,全局持有一个单独的悬浮窗View
,通过AppLifecycle
监听Activity
生命周期,并在相应时机 插入到DecorView
上 ; View 级别悬浮窗,基于给定的ViewGroup
; Fragment 级别,基于其对应的rootView
; Acrtivity 级别,基于DecorView
内部的R.id.content
;
具体如下:
具体见我的博客:源码分析 | Activity-setContentView
Ps: 为什么App级别悬浮窗 要插入到 DecorView
,而不是 R.id.content -> FrameLayout
?
插入到
DecorView
可以最大程度控制悬浮窗的自由度,即悬浮窗可以真正意义上[全屏
]拖动。 插入到content
中,其拖动范围其实为 应用视图范围 ,即摆放位置 受到 状态栏 和 底部导航栏 以及 默认的AppBar
影响, 比如当用户隐藏了状态栏或者导航栏,相对应的视图大小会发生改变,将影响悬浮窗的位置摆放。
基础 悬浮窗View 源自 EnFloatingView 的 FloatingMagnetView 实现方式,并在其基础上增加了一些改进。
对于导航栏的测量部分代码来自,wenlu@掘金 ,并在其之上增加了更多适配,已覆盖市场大部分机型。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有