FloatingX 一个灵活且强大的 免权限
悬浮窗解决方案。
- 单例持有浮窗view
- 支持各项回调监听
- 链式调用,无感插入
- 支持自定义是否保存历史位置及还原
- 支持插入
ViewGroup
,Fragment
,Activity
- 允许自定义悬浮窗各项指标,自定义隐藏显示动画
- 支持 越界回弹,多指触摸,小屏适配,屏幕旋转
- 支持自定义位置方向,自带辅助定位显示坐标
- 完善的
kotlin
构建扩展,及对Java
的友好兼容 - 支持显示位置[强行修复],应对特殊机型(需要单独开启)
- 完善的日志系统,打开即可看到不同级别的Fx运行过程,更利于发现问题
- ...
build.gradle
Gradle7.0 以下
allprojects {
repositories {
// ...
maven { url 'https://jitpack.io' }
}
}
AndroidStudio-Arctic Fox && Gradle7.0+,并且已经对依赖方式进行过调整,则可能需要添加到如下位置:
settings.gradle
dependencyResolutionManagement { repositories { // ... maven { url 'https://jitpack.io' } } }
dependencies {
implementation 'com.github.Petterpx:FloatingX:1.0-rc14'
}
全屏,activity,fragment,单view | 小屏展示 | 非正常比例缩放屏幕 |
---|---|---|
屏幕旋转 | 功能演示 | |
---|---|---|
开启日志查看器,将看到Fx整个运行轨迹,更便于发现问题以及追踪解决。同时支持自定义日志tag
App | Activity | ViewGroup |
---|---|---|
kt
FloatingX.init {
setLayout(R.layout.item_floating_new)
addBlackClass(
MainActivity::class.java,
NewActivity::class.java,
ImmersedActivity::class.java
)
//只有调用了enableFx(),后续才会自动插入activity中
enableFx()
}
Java
AppHelper helper = AppHelper.builder()
.setLayout(R.layout.item_floating)
.enableFx()
.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,并在其之上增加了更多适配,已覆盖市场95%机型,可以说是目前能搜到的唯一可以准确测量的工具。