基于jetpackCompose实现最简单的悬浮窗效果

news2024/11/15 12:31:04

最近在研究使用compose框架实现悬浮窗效果,期间遇到很多问题,各种搜索结果琳琅满目,不是插件就是非常复杂的代码,只能潜心研究,最后得出了这个几行代码就能实现悬浮窗的方案。
为了技术人的脑力能得到应有的回报,核心代码决定付费,相关思想及其他代码在此贴出。

桌面悬浮效果

文章目录

  • 一、 申请悬浮窗权限
  • 二、设计悬浮窗要显示的内容
  • 三、悬浮窗响应式
  • 四、核心算法

一、 申请悬浮窗权限

  1. 静态权限
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
  1. 动态权限
val requestPermission = rememberLauncherForActivityResult(
    ActivityResultContracts.StartActivityForResult()
) {
    Log.d(TAG, "requestPermission: $it")
}
var hasOverlayPermission by remember{ mutableStateOf(Settings.canDrawOverlays(context)) }
Button(onClick = {
    if (hasOverlayPermission) {
        // 移除权限
        try {
            Settings.canDrawOverlays(context).not()
        } catch (e: Exception) {
            Log.e(TAG, "requestPermission: ", e)
        }
        hasOverlayPermission = Settings.canDrawOverlays(context)
    }else{
        requestPermission.launch(Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION))
}
}){
    Text(if(hasOverlayPermission) "取消悬浮权限" else "申请悬浮权限")
}

二、设计悬浮窗要显示的内容

此处实现的是一个计数按钮,一个退出悬浮窗的按钮

@OptIn(ExperimentalFoundationApi::class)
@Composable
private fun FloatContent(view: ComposeView, layoutParams: LayoutParams, onClose: () -> Unit) {
    val drag2dState = rememberDraggable2DState {
        layoutParams.x += it.x.toInt()
        layoutParams.y += it.y.toInt()
        windowManager.updateViewLayout(view, layoutParams)
    }
    Column(
        Modifier
            .wrapContentSize()
            .background(Color(0xf0ffffff), RoundedCornerShape(10.dp))
            .padding(10.dp)
            .draggable2D(drag2dState),
        horizontalAlignment = Alignment.CenterHorizontally
    ) {
        var count by remember{ mutableIntStateOf(0) }
        Text("Count $count")
        Button({
            count++
        }){
            Text(text = "Click")
        }
        Button(onClick = {
                onClose()
            },
            colors = ButtonDefaults.buttonColors(containerColor = Color(0xffa00000))
        ){
            Text(text = "Close")
        }
    }
}

三、悬浮窗响应式

private var displayFloatingView by mutableStateOf(true)
if(displayFloatingView){
    FloatingView{
        displayFloatingView = false
    }
}


Button(onClick = {
    displayFloatingView = !displayFloatingView
}) {
    Text(if (displayFloatingView) "关闭悬浮窗" else "显示悬浮窗")
}

四、核心算法

@Composable
fun FloatingView(onClose: () -> Unit) {    val context = LocalContext.current
    val windowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
    val layoutParams by remember {
        mutableStateOf(
            LayoutParams(
                LayoutParams.WRAP_CONTENT,
                LayoutParams.WRAP_CONTENT,
                LayoutParams.TYPE_APPLICATION_OVERLAY,
                LayoutParams.FLAG_NOT_FOCUSABLE,
                PixelFormat.TRANSLUCENT
            )
        )
    }
    DisposableEffect(Unit) {
        val view = ComposeView(context)
        view.setContent {
            FloatContent(view, layoutParams, onClose)
        }
        windowManager.addView(view, layoutParams)
        onDispose {
            windowManager.removeView(view)
        }
    }
}

这是都能想到的核心算法,但是运行起来之后会报各种错误,比如:

ViewTreeLifecycleOwner not found from androidx.compose.ui.platform.ComposeView

或者

Composed into the View which doesn’t propagateViewTreeSavedStateRegistryOwner!

所以本文需要付费的内容是解决这两个错误的解决方案
一共四行代码,却是其中的精华,你可以自行决定是否付费,也可以去查找其他解决方案

付费方法参考博文: https://mp.weixin.qq.com/s/NtcnF7sg8UevwrMRgoohEQ

你也可以私信我其他的付费方案

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2097552.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PTA - C语言接口题集

目录 6-1 计算两个复数之积&#xff08;结构体函数&#xff09;6-2 字符定位&#xff08;返回字符的地址&#xff0c;指针&#xff09;6-3 求结构体平均成绩&#xff08;变量名(数组名)用.;指针(带有*)用->&#xff09;6-4 删除字符串中数字字符6-5 使用函数找出数组中的最大…

系统更新报“更新失败“

系统更新报"更新失败" 本章只针对统信UOS系统 系统检查更新失败&#xff0c;或者系统更新的过程中失败&#xff0c;或者提示依赖错误&#xff0c;检测更新失败。 故障处理&#xff1a; 检查下网络是否正常&#xff0c;系统时间是否正常&#xff1b;开启开发者&…

MOS管驱动电路阻值如何选取?以及为什么要有下拉电阻

开通时&#xff0c;电源为高电平&#xff0c;会通过Rg1给MOS的Cgs充电&#xff0c;关断时&#xff0c;Cgs通过Rg2放电.实现慢开快关的过程 如果驱动阻值太大&#xff0c;开关会很慢&#xff0c;会让MOS管的损耗增加&#xff0c;降低了效率&#xff0c;dv/dt&#xff0c;di/dt也…

电路基础 ---- 运放里的虚短虚断

令人稀里糊涂的虚短虚断 想必好多人在学习硬件电路分析时&#xff0c;都会听到虚短虚断这个专业术语&#xff0c;但是对于新手玩家&#xff0c;这个术语不好理解&#xff0c;比如我自己&#xff0c;经常将这两个概念混淆。最近刷到大佬的视频&#xff0c;讲解的非常简洁易懂&a…

蓝卓与用友、中控签署全面战略合作协议

8月9日&#xff0c;蓝卓数字科技有限公司&#xff08;以下简称“蓝卓”&#xff09;与用友网络科技股份有限公司&#xff08;以下简称“用友网络”&#xff09;与中控技术股份有限公司&#xff08;以下简称“中控技术”&#xff09;签署全面战略合作协议。三方将在平台产品融合…

MySQL5.7版本实现数据库审计功能

一、基本介绍 MySQL 数据库审计&#xff08;MySQL Database Auditing&#xff09;主要将用户对数据库的各类操作行为记录审计日志&#xff0c;以便日后进行跟踪、查询、分析&#xff0c;以实现对用户操作的监控和审计。审计是一项非常重要的工作&#xff0c;也是企业数据安全体…

1412312

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话&#xff1a; 知不足而奋进&#xff0c;望远山而前行&am…

BugKu练习记录:你喜欢下棋吗

题目&#xff1a; 密码全为小写&#xff0c;格式bugku{} 解压密码&#xff1a; 你喜欢下棋吗&#xff1f; 解压密码为小写 4423244324433534315412244543棋盘密码解密&#xff1a; thisispolybius用这个密码解压&#xff0c;打开flag.txt文件 一种5bit的编码 bugku里面的内…

Transformer 动画揭秘:数据处理的四大关键技术

0背景 Transformer 大模型&#xff0c;一种基于自注意力机制的神经网络架构&#xff0c;已被广泛应用于各种自然语言处理任务&#xff0c;比如&#xff1a;机器翻译、文本摘要、生成问答等。 从端到端的角度来看&#xff0c;Transformer 大模型中数据的处理流程主要包括四个阶…

基于matlab的行人和车辆检测系统

基于matlab的行人和车辆检测系统 【目标检测】基于计算机视觉&#xff0c;含GUI界面 算法&#xff1a;二帧差分法&#xff0c;三帧差分法&#xff0c;混合高斯建模&#xff0c;ViBe算法。 功能&#xff1a;对视频中出现的动态目标进行逐帧作差分析或ViBe算法检测&#xff0c;使…

[线程] 定时器 及 实现定时器

文章目录 一. 定时器二. 标准库中的定时器三. 实现定时器1. 创建MyTimerTask类2. 通过一定的数据结构, 保存多个任务3.MyTimer类的构造方法4. 实现schedule方法完整代码: 一. 定时器 定时器, 就是"闹钟"的效果 指定一个任务(Runnable), 并且指定一个时间, 此时这个任…

PMP核心知识点—之项目运行环境

知识点1&#xff1a;项目合规性 不合规的项目就不应该做。 知识点2&#xff1a;项目影响两大因素 组织过程资产、事业环境因素 知识点3&#xff1a;职能型以及项目型组织结构 知识点4&#xff1a;矩阵型组织结构 弱矩阵—平衡矩阵—强矩阵 (项目经理权力的强弱) 知识点5&am…

Oracle rac模式下undo表空间爆满的解决

文章目录 前言一、确认对应实例的undo表空间二、确认对应实例undo的文件位置三、确认回滚段使用情况四、检查undo segment状态五、创建新的undo表空间并进行切换六、等待原undo表空间segment状态变更为offline七、删除原undo表空间以及数据文件 前言 一、确认对应实例的undo表空…

如何把自动获取的ip地址固定

在大多数网络环境中&#xff0c;‌设备通常会自动从DHCP服务器获取IP地址。‌这种动态分配IP的方式虽然灵活方便&#xff0c;‌但在某些特定场景下&#xff0c;‌我们可能需要将设备的IP地址固定下来&#xff0c;‌以确保网络连接的稳定性和可访问性。‌本文将详细介绍如何把自…

C++知识点概述

C知识点概述 C是一种功能强大的编程语言&#xff0c;广泛应用于系统软件、游戏开发、高性能服务器和客户端应用等领域。在大学课程中&#xff0c;C通常作为计算机科学和软件工程学科的核心课程之一。以下是C的一些关键知识点&#xff0c;这些知识点构成了大学课程的基础。 1.…

CTF入门之奇怪的密码及图形编码总结篇(持续更新中ing)

CTF入门之奇怪的编码及图形编码(持续更新中ing UTF-8&#xff0c;unicode乱码社会主义核心价值观编码&#xff1a;在线解码&#xff1a; 与佛论禅&#xff1a;在线解密网站&#xff1a; 与熊论道&#xff1a;在线网站解密&#xff1a; 兽音&#xff1a;在线网站解密&#xff1a…

MySQL数据库(0)—— 云服务器安装MySQL

本篇主要介绍在Ubuntu环境下安装MySQL 一&#xff0c;查看系统版本 lsb_release -a二&#xff0c;添加MySQL APT 源 2.1 访问下载页面并下载发布包 传送门&#xff1a;MySQL :: Download MySQL APT Repository 下载之后&#xff0c;就可以通过 rz 命令上传到云服务器上&…

大牛荐书:美团王慧文清华大学产品经理课推荐阅读书单

美团网的王兴大家应该都很熟悉&#xff0c;作为美团的掌舵人和1号位&#xff0c;带领美团于2018年9月在港交所上市&#xff0c;公司市值在国内互联网大厂中排名第4&#xff0c;公司全职员工数11.5万人&#xff0c;2023年实现营业收入2767亿元&#xff0c;利润233亿元。 相比王兴…

MATLAB下的粒子滤波例程|三维非线性模型|组合导航|PF代码(无需下载,直接复制到MATLAB上即可运行)

文章目录 模型与程序概述PF介绍运行结果程序代码各部分模块的作用模型与程序概述 模拟INS、GPS组合导航的应用背景。在模型预处理的时候通过迭代计算三维位置的真值和滤波前(模拟纯INS计算)的值。 通过 P F PF PF(粒子滤波, p

WorkPlus安全即时通讯:端到端加密开启信息保密新时代

在数字化时代&#xff0c;信息的保密性和安全性变得越发重要。企业和个人需要确保他们的敏感信息和机密通讯不会落入黑客或第三方的手中。为了满足这一需求&#xff0c;WorkPlus安全即时通讯平台应运而生。作为一款拥有端到端加密功能的通讯平台&#xff0c;WorkPlus着重于保护…