IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android免权限悬浮窗组件 - FloatingX -> 正文阅读

[移动开发]Android免权限悬浮窗组件 - FloatingX

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小屏展示非正常比例缩放屏幕
效果-展示1演示-小屏非正常比例缩放
屏幕旋转功能演示
演示-旋转演示-局部功能

如何使用

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

完善的日志-查看器

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

AppActivityViewGroup
image-20210808123000851image-20210808123414921image-20210808123553402

全局悬浮窗管理

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 ;

具体如下:

Activity-setContentView

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

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

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

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

感谢

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

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

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-08-12 16:42:49  更:2021-08-12 16:45:51 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 1:05:36-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码