Android免权限悬浮窗组件 - FloatingX

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: FloatingX ,一个强大的免权限悬浮窗组件,支持全局,以及局部悬浮窗。

背景

在前几个月的业务开发中,我们 app 需要对悬浮窗进行更改,常见的悬浮窗实现方式分为两种:

  • 前者是获取权限后,利用 WindowManager 实现
  • 后者是基于 DecorView 实现的插入悬浮窗


    选用怎样的方案,主要根据业务的定向, 因为我们的业务不是视频通话类,而是菜谱工具类,所以我们不愿意让用户为此去设置中授予权限,这是一件成本较大的事,故采用了后者的方案,业内知乎也使用的这种方案。


    在之前的版本中,我们已经采用了后者的方案,先前的同学使用了插入到 content 中实现,但没有经过太多封装,代码直接插入到了 base 层,对于当下而言,基本符合使用,但扩展成本太高,对于未来而言,这显然不满足要求。


    于是我希望有这样一个组件,它必须具备以下基本要求:


  • 无感插入
  • 可拖动
  • 良好的分层设计


    这是最开始的功能,但随着封装过程,以及对比知乎等其他悬浮窗,我发现可能可以让这个东西更有意思,而不只是一个工具类。


    经过了十几个版本的优化与测试,终于,FloatingX 迎来了rc版本,api已相对固定👏,目前已在线上运行3个月+(beta开始),已通过测试市场常见近百款机型。


    Github: https://github.com/Petterpx/FloatingX

    特性


    FloatingX 具备以下功能:
  • 单例持有浮窗view
  • 支持各项回调监听
  • 链式调用,无感插入
  • 支持自定义是否保存历史位置及还原
  • 支持插入 ViewGroup , Fragment , Activity
  • 允许自定义悬浮窗各项指标,自定义隐藏显示动画
  • 支持 越界回弹,多指触摸,小屏适配,屏幕旋转
  • 支持自定义位置方向,自带辅助定位显示坐标
  • 完善kotlin构建扩展,及对Java的友好兼容
  • 支持显示位置[强行修复],应对特殊机型(需要单独开启)
  • 完善的日志系统,打开即可看到不同级别的Fx运行过程,更利于发现问题
  • 效果图

全屏,activity,fragment,单view 小屏展示 非正常比例缩放屏幕


屏幕旋转 功能演示

如何使用

allprojects {
    repositories {
      ...
      maven { url 'https://jitpack.io' }
    }
  }
dependencies {
      implementation 'com.github.Petterpx:FloatingX:1.0-rc02'
}

完善的日志-查看器

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


App Activity ViewGroup

全局悬浮窗管理

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)

对kt的扩展支持

activity创建悬浮窗
private val activityFx by activityToFx(activity) {
    setLayout(R.layout.item_floating)
}
fragment创建悬浮窗
private val fragment by fragmentToFx(fragment) {
    setLayout(R.layout.item_floating)
}
viewGroup创建悬浮窗
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 ;



具体如下:

网络异常,图片无法展示
|


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


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

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

感谢

基础 悬浮窗View 源自 EnFloatingViewFloatingMagnetView 实现方式,并在其基础上增加了一些改进。


对于导航栏的测量部分代码来自,wenlu@掘金 ,并在其之上增加了更多适配,已覆盖市场大部分机型。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
2月前
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。
|
3月前
|
存储 Android开发 开发者
深入理解安卓应用开发的核心组件
【10月更文挑战第8天】探索Android应用开发的精髓,本文带你了解安卓核心组件的奥秘,包括Activity、Service、BroadcastReceiver和ContentProvider。我们将通过代码示例,揭示这些组件如何协同工作,构建出功能强大且响应迅速的应用程序。无论你是初学者还是资深开发者,这篇文章都将为你提供新的视角和深度知识。
|
3月前
|
数据可视化 Android开发 开发者
安卓应用开发中的自定义View组件
【10月更文挑战第5天】在安卓应用开发中,自定义View组件是提升用户交互体验的利器。本篇将深入探讨如何从零开始创建自定义View,包括设计理念、实现步骤以及性能优化技巧,帮助开发者打造流畅且富有创意的用户界面。
133 0
|
22天前
|
存储 监控 API
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
|
1月前
|
XML 搜索推荐 前端开发
安卓开发中的自定义视图:打造个性化UI组件
在安卓应用开发中,自定义视图是一种强大的工具,它允许开发者创造独一无二的用户界面元素,从而提升应用的外观和用户体验。本文将通过一个简单的自定义视图示例,引导你了解如何在安卓项目中实现自定义组件,并探讨其背后的技术原理。我们将从基础的View类讲起,逐步深入到绘图、事件处理以及性能优化等方面。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和技巧。
|
5月前
|
存储 安全 Android开发
"解锁Android权限迷宫:一场惊心动魄的动态权限请求之旅,让你的应用从平凡跃升至用户心尖的宠儿!"
【8月更文挑战第13天】随着Android系统的更新,权限管理变得至关重要。尤其从Android 6.0起,引入了动态权限请求,增强了用户隐私保护并要求开发者实现更精细的权限控制。本文采用问答形式,深入探讨动态权限请求机制与最佳实践,并提供示例代码。首先解释了动态权限的概念及其重要性;接着详述实现步骤:定义、检查、请求权限及处理结果;最后总结了六大最佳实践,包括适时请求、解释原因、提供替代方案、妥善处理拒绝情况、适应权限变更及兼容旧版系统,帮助开发者打造安全易用的应用。
91 0
|
3月前
|
XML 前端开发 Java
安卓应用开发中的自定义View组件
【10月更文挑战第5天】自定义View是安卓应用开发的一块基石,它为开发者提供了无限的可能。通过掌握其原理和实现方法,可以创造出既美观又实用的用户界面。本文将引导你了解自定义View的创建过程,包括绘制技巧、事件处理以及性能优化等关键步骤。
|
3月前
|
测试技术 数据库 Android开发
深入解析Android架构组件——Jetpack的使用与实践
本文旨在探讨谷歌推出的Android架构组件——Jetpack,在现代Android开发中的应用。Jetpack作为一系列库和工具的集合,旨在帮助开发者更轻松地编写出健壮、可维护且性能优异的应用。通过详细解析各个组件如Lifecycle、ViewModel、LiveData等,我们将了解其原理和使用场景,并结合实例展示如何在实际项目中应用这些组件,提升开发效率和应用质量。
63 6
|
4月前
|
存储 开发框架 数据可视化
深入解析Android应用开发中的四大核心组件
本文将探讨Android开发中的四大核心组件——Activity、Service、BroadcastReceiver和ContentProvider。我们将深入了解每个组件的定义、作用、使用方法及它们之间的交互方式,以帮助开发者更好地理解和应用这些组件,提升Android应用开发的能力和效率。
356 5
|
4月前
|
存储 API Android开发
"解锁Android权限迷宫:一场惊心动魄的动态权限请求之旅,让你的应用从平凡跃升至用户心尖的宠儿!"
随着Android系统的更新,权限管理成为应用开发的关键。尤其在Android 6.0(API 级别 23)后,动态权限请求机制的引入提升了用户隐私保护,要求开发者进行更精细的权限管理。
87 2