Android上强大的悬浮窗组件,支持 系统浮窗(需要权限)、应用内浮窗(无权限)、局部悬浮(View),支持边缘吸附、回弹、自定义动画、位置保存、窗口化及分屏后位置修复等。Android without permission suspension window(App), support global(View), local suspension, support edge adsorption, rebound, custom animation, position saving, windowing and split-screen position repair.
FloatingX 一个灵活且强大的悬浮窗解决方案。
kotlin
构建扩展, 及对 Java
的友好兼容;ViewGroup
, Fragment
, Activity
中进行显示;dependencies {
implementation 'io.github.petterpx:floatingx:2.0.7'
}
全屏,activity,fragment,单view | 小屏展示 | 非正常比例缩放屏幕 |
---|---|---|
屏幕旋转 | 功能演示 | |
---|---|---|
开启日志查看器,将看到Fx整个运行轨迹,更便于发现问题以及追踪解决。同时支持自定义日志tag
App | Activity | ViewGroup |
---|---|---|
AndroidManifest (非必须)
// 如果不使用系统浮窗可以忽略此步骤(即FxScopeType.App时可跳过)
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" />
kt
FloatingX.install {
setContext(context)
setLayout(R.layout.item_floating)
setScopeType(FxScopeType.SYSTEM_AUTO)
}.show()
Java
AppHelper helper = AppHelper.builder()
.setContext(context)
.setLayout(R.layout.item_floating)
.setScopeType(FxScopeType.SYSTEM_AUTO)
.build();
FloatingX.install(helper).show();
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 scopeFx by createFx {
setLayout(R.layout.item_floating)
build().toControl(this/Activity)
}
private val activityFx by createFx {
setLayout(R.layout.item_floating)
build().toControl(this/Fragment)
}
private val activityFx by createFx {
setLayout(R.layout.item_floating)
build().toControl(this/Viewgroup)
}
System 级别悬浮窗 基于
WindowsManager
的实现方案,全局持有一个单独的悬浮窗View
,通过AppLifecycle
监听Activity
生命周期,并在相应时机 插入到WindowManager
上 ;
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%机型,可以说是目前能搜到的唯一可以准确测量的工具。
欢迎关注我的公众号,期待一同进步,如果有使用上的问题,也可以加我微信。
微信:Petterpx