HarmonyOS实战:实现任意拖动的应用悬浮窗口

boyanx3个月前技术教程11

前言

为了增加应用程序功能的丰富性和便利性,很多应用都会提供一个悬浮窗口实现多页面显示。特别是一些性能检测工具,比如 dokit 。在鸿蒙上怎么实现类似的全局悬浮窗口呢?阅读完本篇文章你将学会在鸿蒙上如何实现这一功能。

实现效果

需求分析

要想实现全局悬浮窗口,必须满足以下几个要求:

  1. 窗口可以悬浮在任意页面。
  2. 窗口可以跟随手势拖动。
  3. 边界处理。

技术实现

在 ArkUI 中,页面只有 Window 和 View 两种组成。View 通常都是显示在 Window 中,如果要想实现一个可以在任意页面都能停留显示的悬浮窗,只能通过 window 来实现。

  1. 通过 windowState 调用 createSubWIndow 来创建一个子 Window。
 this.windowState.createSubWindow("subWindow", (err: BusinessError, window) => {
     

    })
  1. 对于 windowState 的获取,一般都在 EntryAbility 中的 onWindowStateCreate 中提供,如果不想通过传递参数的方式获取 windowStage,系统也提供了工具类可以在任意地方获取。
//存储windowStage
WindowManager.setWindowStage(windowStage);
//获取windowstage
 this.windowState = WindowManager.getWindowStage()
  1. 初始化 Window。url 为 window 页面的路径。
     window.setWindowLayoutFullScreen(false) //设置window是否全屏显示
      window.setUIContent(url, (error) => {
        window.showWindow((error) => {
          window.setWindowBackgroundColor("#00000000") //设置window背景色
        })

      })

      window.resize(this.size, this.size)//设置window大小
      window.moveWindowTo(this.locationX, this.locationY) //设置window的初始位置
  1. 手势移动,通过调研 PanGesture()的 onActionUpdate 方法不断更新 window 的位置。

 .gesture(GestureGroup(
      GestureMode.Exclusive,
      PanGesture().onActionUpdate((event)=>{
        this.currentWindow?.moveWindowTo(event.offsetX,event.offsetY)
      })
    ))
  1. 边界处理,计算最小移动范围和最大移动范围。确保 window 不会移出当前页面。
 this.locationX = Math.min(Math.max(this.locationX + x, this.minX), this.maxX)
 this.locationY = Math.min(Math.max(this.locationY + y, this.minY), this.maxY)
  1. window 销毁。当退出应用时,需要将 window 关闭,调用 window 的 destroyWindow 方法销毁 window。
 this.contentWindow.destroyWindow(() => {
        this.contentWindow = undefined
      })

总结

通过 window 不仅能实现全局悬浮窗,还可以实现自定义弹窗,Poupwindow,toast 等一系列弹窗。使用 window 的好处在于可以彻底和当前页面分离,不依赖页面存在。可以实现在任意地方弹窗。快动手试试吧!

标签: 可拖动

相关文章

DeepSeek+Trae终于成功将课程表科目的拖动功能实现了!

只要功夫深,铁杵磨成针!经过一整晚的不断修改测试,再修改再测试...........终于能够随意拖动所有科目到表格的任意位置了,自己把自己感动到哭了。不过,成功后的喜悦,相信你们也是能够感同身受的,废...

iOS 18大揭秘!主屏幕随意拖拽,自定义图标更给力!

大家瞅瞅,苹果今天给咱们带来啥新鲜事儿了?嗨翻天的iOS 18啊!这次更新啊,亲手打造你想怎么玩儿就怎么玩儿的主屏幕,还有暗黑模式的威力升级咯!边听我说,你边儿数着是不是心动了呀?哎呦喂,苹果今天更新...

梦幻西游:8.27维护解读,战斗中可拖动对话框

梦幻西游:8.27维护解读,战斗中可拖动对话框本周的维护只有一个重点,那就是烦人的对话框,终于可以不影响战斗了。为了优化玩家的文本阅读体验,玩家可在战斗内拖动调整对话框的位置。之前的见面会上提过,策划...

19岁女大学生被网约车司机高速路上拖拽下车,致脚踝受伤!平台回应

转自 | 羊城晚报据羊城晚报消息,近日,有网友爆料称,自己在乘坐嘀嗒出行顺风车时,被司机在高速路上赶下车。该网友告诉记者,司机将她拖拽下车时致其脚踝受伤。对此,嘀嗒出行回应称,涉事司机已被永久封禁,平...

【品牌】vivo正式接入DeepSeek 你用上了吗

此前多家手机厂商接入或官宣即将接入DeepSeek-R1模型,vivo就属于后者,今日vivo宣布正式接入DeepSeek。如上图所见,vivo宣布正式上线满血版DeepSeek-R1,支持深度思考和...

小屏手机流畅度天花板?一加13T满血ColorOS 15超前体验

作为一加首款小屏旗舰,一加13T在性能硬件上堆料满满,在之后的全面评测中,我们将为大家详细介绍了这些特性的体验感受。但这次,我想给各位分享下一加 13T的系统体验,毕竟丰富的AI功能,以及流畅的动效、...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。