Skip to content

Android免权限悬浮窗,支持全局(App内部)、局部悬浮(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.

License

Petterpx/FloatingX

main
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Code

Files

Permalink
Failed to load latest commit information.
Type
Name
Latest commit message
Commit time
October 16, 2022 23:03
November 9, 2021 11:33
app
January 1, 2023 09:33
October 14, 2021 15:00
January 1, 2023 09:54
August 24, 2021 09:30
January 10, 2023 11:25
January 10, 2023 11:25
November 21, 2022 10:25
May 31, 2021 19:46
May 31, 2021 19:46
May 31, 2021 19:46
October 30, 2021 12:34

FloatingX

image-20210810161316095

ktlint

FloatingX 一个灵活且强大的 免权限 悬浮窗解决方案。

English Introduction

具体使用文档见这里

👏 特性

  • 支持 自定义隐藏显示动画;
  • 支持 多指触摸,精准决策触摸手势;
  • 支持 自定义是否保存历史位置及还原;
  • 支持 越界回弹边缘悬停边界设置;
  • 支持 以 layout, View 的方式设置浮窗内容;
  • 支持 自定义浮窗显示位置,支持辅助定位;
  • 支持 黑名单与白名单 功能,指定页面禁止显示浮窗等;
  • 支持 kotlin 构建扩展, 及对 Java 的友好兼容;
  • 支持显示位置[强行修复],应对特殊机型(需要单独开启)
  • 支持 局部浮窗,可在ViewGroup , Fragment , Activity 中进行显示;
  • 完善的日志系统,打开即可看到不同级别的Fx运行过程,更利于发现问题

👨‍💻‍ 依赖方式

添加jitpack仓库

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' }
 }
}

Gradle

dependencies {
	  implementation 'com.github.Petterpx:FloatingX:1.1.7'
}

🏄‍♀️ 效果图

全屏,activity,fragment,单view 小屏展示 非正常比例缩放屏幕
效果-展示1 演示-小屏 非正常比例缩放
屏幕旋转 功能演示
演示-旋转 演示-局部功能

完善的日志-查看器

开启日志查看器,将看到Fx整个运行轨迹,更便于发现问题以及追踪解决。同时支持自定义日志tag

App Activity ViewGroup
image-20210808123000851 image-20210808123414921 image-20210808123553402

👨‍🔧‍ 使用方式

全局悬浮窗管理

kt

FloatingX.init {
        setLayout(R.layout.item_floating_new)
  	//只有调用了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)

对kt的扩展支持

activity创建悬浮窗
private val scopeFx by createFx {
    setLayout(R.layout.item_floating)
    build().toControl(this/Activity)
}
fragment创建悬浮窗
private val activityFx by createFx {
    setLayout(R.layout.item_floating)
    build().toControl(this/Fragment)
}
viewGroup创建悬浮窗
private val activityFx by createFx {
    setLayout(R.layout.item_floating)
    build().toControl(this/Viewgroup)
}

🤔 技术实现

App 级别悬浮窗 基于 DecorView 的的实现方案,全局持有一个单独的悬浮窗 View ,通过 AppLifecycle 监听 Activity 生命周期,并在相应时机 插入到 DecorView 上 ;

View 级别悬浮窗,基于给定的 ViewGroup ;

Fragment 级别,基于其对应的 rootView ;

Acrtivity 级别,基于 DecorView 内部的 R.id.content ;

具体如下:

Activity-setContentView

具体见我的博客:源码分析 | Activity-setContentView

Ps: 为什么App级别悬浮窗 要插入到 DecorView ,而不是 R.id.content -> FrameLayout ?

插入到 DecorView 可以最大程度控制悬浮窗的自由度,即悬浮窗可以真正意义上[全屏]拖动。

插入到 content 中,其拖动范围其实为 应用视图范围 ,即摆放位置 受到 状态栏底部导航栏 以及 默认的 AppBar 影响, 比如当用户隐藏了状态栏或者导航栏,相对应的视图大小会发生改变,将影响悬浮窗的位置摆放。

👍 感谢

基础 悬浮窗View 的思想源自 EnFloatingViewFloatingMagnetView 实现方式,并在其之上重新梳理手势事件、动画、及大部分功能。

对于导航栏的测量部分代码来自,wenlu,并在其之上增加了更多适配,已覆盖市场95%机型,可以说是目前能搜到的唯一可以准确测量的工具。

About

Android免权限悬浮窗,支持全局(App内部)、局部悬浮(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.

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published