https://github.com/Petterpx/FloatingX
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.
https://github.com/Petterpx/FloatingX
android-lifecylce floating floating-window kotlin-android
Last synced: 4 months ago
JSON representation
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.
- Host: GitHub
- URL: https://github.com/Petterpx/FloatingX
- Owner: Petterpx
- License: mit
- Created: 2021-05-31T11:41:53.000Z (about 4 years ago)
- Default Branch: main
- Last Pushed: 2025-02-10T16:34:20.000Z (5 months ago)
- Last Synced: 2025-02-10T17:35:43.713Z (5 months ago)
- Topics: android-lifecylce, floating, floating-window, kotlin-android
- Language: Kotlin
- Homepage:
- Size: 27.5 MB
- Stars: 1,243
- Watchers: 18
- Forks: 143
- Open Issues: 5
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# FloatingX

[](https://app.codacy.com/gh/Petterpx/FloatingX?utm_source=github.com&utm_medium=referral&utm_content=Petterpx/FloatingX&utm_campaign=Badge_Grade_Settings)
[](https://search.maven.org/search?q=g:io.github.petterpx%20AND%20a:floatingx)
[](https://ktlint.github.io/)**FloatingX** 一个灵活且强大的悬浮窗解决方案。
[English Introduction](https://github.com/Petterpx/FloatingX/blob/main/README_EN.md)
[具体使用文档见这里](https://cskf7l0wab.feishu.cn/wiki/wikcnLLBCe3fIDUTAzrEg754tzc)
## 👏 特性
- 支持 **JetPack Compose**
- 支持 **浮窗半隐藏模式**
- 支持 **自定义隐藏显示动画**;
- 支持 **多指触摸**,精准决策触摸手势;
- 支持 自定义是否保存历史位置及还原;
- 支持 **系统浮窗**、**应用内浮窗**、**局部浮窗**;
- 支持 **越界回弹**,**边缘悬停**,**边界设置**;
- 支持 以 **layout**, **View** 的方式设置浮窗内容;
- 支持 自定义浮窗显示位置,**支持辅助定位**;
- 支持 **黑名单与白名单** 功能,指定页面禁止显示浮窗等;
- 支持 `kotlin` 构建扩展, 及对 `Java` 的友好兼容;
- 支持显示位置[强行修复],应对特殊机型(需要单独开启)
- 支持 **局部浮窗**,可在`ViewGroup` , `Fragment` , `Activity` 中进行显示;
- 完善的日志系统,打开即可看到不同级别的Fx运行过程,更利于发现问题## 👨💻 依赖方式
### Gradle
```groovy
dependencies {
implementation 'io.github.petterpx:floatingx:2.3.4'
// system浮窗&&compose时需要导入
// 记得AppHelper里调用 enableComposeSupport()
implementation 'io.github.petterpx:floatingx-compose:2.3.4'
}
```## 🏄♀️ 效果图
| 全屏,activity,fragment,单view | 小屏展示 | 非正常比例缩放屏幕 |
| ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ |
|  |  |  || 屏幕旋转 | 功能演示 | |
| ------------------------------------------------------------ | ------------------------------------------------------------ | ---- |
|  |  | |### 完善的日志-查看器
开启日志查看器,将看到Fx整个运行轨迹,更便于发现问题以及追踪解决。同时支持自定义日志tag
| App | Activity | ViewGroup |
| ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ |
|  |  |  |## 👨🔧 使用方式
### 全局悬浮窗管理
**AndroidManifest (非必须)**
```xml
// 如果不使用系统浮窗可以忽略此步骤(即FxScopeType.App时可跳过)```
**kt**
```kotlin
FloatingX.install {
setContext(context)
setLayout(R.layout.item_floating)
setScopeType(FxScopeType.SYSTEM_AUTO)
}.show()
```**Java**
```java
AppHelper helper = AppHelper.builder()
.setContext(context)
.setLayout(R.layout.item_floating)
.setScopeType(FxScopeType.SYSTEM_AUTO)
.build();
FloatingX.install(helper).show();
```### 局部悬浮窗管理
#### 通用创建方式
**kt**
```kotlin
ScopeHelper.builder {
setLayout(R.layout.item_floating)
}.toControl(activity)
```**kt && java**
```kotlin
ScopeHelper.builder()
.setLayout(R.layout.item_floating)
.build()
.toControl(activity)
.toControl(fragment)
.toControl(viewgroup)
```#### 对kt的扩展支持
##### activity创建悬浮窗
```kotlin
private val scopeFx by createFx {
setLayout(R.layout.item_floating)
build().toControl(this/Activity)
}```
##### fragment创建悬浮窗
```kotlin
private val activityFx by createFx {
setLayout(R.layout.item_floating)
build().toControl(this/Fragment)
}
```##### viewGroup创建悬浮窗
```kotlin
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](https://juejin.cn/post/6897453195342610445)
Ps: 为什么App级别悬浮窗 要插入到 `DecorView` ,而不是 **R.id.content** -> `FrameLayout` ?
> 插入到 `DecorView` 可以最大程度控制悬浮窗的自由度,即悬浮窗可以真正意义上[`全屏`]拖动。
>
> 插入到 `content` 中,其拖动范围其实为 **应用视图范围** ,即摆放位置 受到 **状态栏** 和 **底部导航栏** 以及 默认的 `AppBar` 影响, 比如当用户隐藏了状态栏或者导航栏,相对应的视图大小会发生改变,将影响悬浮窗的位置摆放。## 👍 感谢
基础 **悬浮窗View** 的 初版实现思想 源自 [EnFloatingView](https://github.com/leotyndale/EnFloatingView) 的 [FloatingMagnetView](https://github.com/leotyndale/EnFloatingView/blob/master/floatingview/src/main/java/com/imuxuan/floatingview/FloatingMagnetView.java) 实现方式,并在其之上进行了彻底的重构与演变。
对于导航栏的测量部分代码来自,wenlu,并在其之上增加了更多适配,已覆盖市场95%机型,可以说是目前能搜到的唯一可以准确测量的工具。
## 关于我
欢迎关注我的公众号,期待一同进步,如果有使用上的问题,也可以加我微信。
**微信**:**Petterpx**
