uni-app利用原生子窗体解决悬浮窗口播放问题及踩坑记录

uniapp开发小程序如何实现全局悬浮按钮 看效果 这是一个全局的按钮,可以换成图片,自己写样式,每个页面都有; 须知: 1.uni.getSystemInfoSync()获取手机的信息接口 可以拿到手机屏幕的宽高 2.uni.createSelectorQuery().in(this) uniapp中式没有window对象,和dom元素的,但是有时我们需要获取页面上节点的一些几何信息; const query = uni.createSelectorQuery().in(this); query.select('#_drag_button' 阅读详情

实现效果如图:参考得到app交互,音频课程返回时,app下方展示悬浮窗口播放,可暂停、播放、关闭,点击可返回至音频文章查看文章。关闭app,再进入有缓存上次音频课程,可点击继续播放。上滑显示悬浮框,下滑隐藏悬浮框。

原生子窗体

subNVues 是 vue 页面的原生子窗体。用于解决App中 vue 页面中的层级覆盖和原生界面灵活自定义用的。它不是全屏页面,也不是组件,就是一个原生子窗体。它是一个 nvue 页面,使用 weex 引擎渲染,提供了比 cover-view、plus.nativeObj.view 更强大的原生排版能力,方便自定义原生导航或覆盖原生地图、视频等。

详细配置见这个:原生子窗体

请详读:subNVues 开发指南

如何获取原生子窗体实例及实例方法,见这篇:subNVue原生子窗体

请先熟读:如何配置 — 开发指南 — 实例及方法

解决方案

1、在需要展示的页面增加原生子窗体配置

{
    "path": "pages/course/course",
    "style":{
        "app-plus":{
            "subNVues":[{
                "id": "course-bgAudio",
                "path": "pages/subNVue/bgAudio",
                "style": {
                    "width": "710rpx",
                    "height": "100rpx",
                    "bottom": "30rpx",
                    "margin": "auto",
                    "background": "transparent"
                }
            }]
        }
    }
}, 

注意:

id 需唯一不能重复;

margin: auto; 代表左右居中。

path 代表子窗体页面路径。我们这个需求都是要一样的窗口展示,所以可以共用一个 nvue 页面。页面路径指南上有说,只要可以正确引入即可。

2、在 pages/subNVue/bgAudio.nvue 页面编写自己的页面样式及代码逻辑即可,这个就不多说了。

3、上滑滚动、下滑隐藏。这里我们接可以写一个 mixin - submixin.js

export const submixin = {data() {return {curTop: 0}},methods: {showSubOrNot(subId) {if(!uni.getStorageSync('curArticle')) {const _sub = uni.getSubNVueById(subId + '-bgAudio')_sub.hide()}else{const _sub = uni.getSubNVueById(subId + '-bgAudio')_sub.show()}},pageScroll(subId, top) {if(!uni.getStorageSync('curArticle')) returnconst _sub = uni.getSubNVueById(subId + '-bgAudio')top > this.curTop ? _sub.hide() : _sub.show()this.curTop = top}}
} 

4、那么如何使用呢?

// 1、引入submixin
import { submixin } from '@/mixins/submixin.js'

// 2、注册mixins
mixins:[submixin],

// 3、onShow的时候控制sub窗口展示与否的逻辑
// 4、onPageScroll的时候控制sub窗口滚动显示的逻辑
onShow() {this.showSubOrNot('course')
},
onPageScroll(top) {this.pageScroll('course', top.scrollTop)
}, 

业务逻辑处理,肯定是需要结合 vuex 状态管理了。

踩坑点

1、获取sub窗口实体的方法易踩坑:

  • uni.getSubNVueById(subNvueId):通过 ID 获取 subNVues 原生子窗体的实例。* uni.getCurrentSubNVue():在一个subnvue窗体的nvue页面代码中,获取当前 subNVues 原生子窗体的实例。我刚开始为了简便不写sub窗口的id,以为可以使用 uni.getCurrentSubNVue() 任意获取当前页面的子窗体实例,但是好像不是这样的,这样用的话,就很容易卡死不动。不知道为啥,后来认真看了官网上对 2 种获取实例的方法描述。uni.getCurrentSubNVue() 说的是在一个subnvue窗体的nvue页面代码中,获取当前 subNVues 原生子窗体的实例。所以猜到可能是这里的问题,然后换成 uni.getSubNVueById(subNVueId) 之后就 ok 了。具体原因不详,只能说是个踩坑点。

2、不知道是否有设置公共的子窗体的配置,查了一下,没找到。

目前我是需要悬浮窗体播放的几个页面,就加了 子窗体 的配置,不需要的不加即可。

不过也确实应该是这样,总不可能所有页面都放子窗体,对用户也不那么友好。看得到也是在个别与音频播放相关和tabbar列表的页面加了悬浮窗体播放,其他位置就没加。

通过这个原生子窗体感觉就可以做很多事情了,比如这篇博客说的这个:视频聊天,可以了解下:uniapp 使用原生子窗体进行视频聊天

PS:其实之前就想做这个东西,之前研究的是通过 Html5+ 的接口:plus.webview.create 去做这个事情,也可以实现置顶悬浮,但是那个悬浮窗口的样式包括业务逻辑就不好控制了,研究了一下也没有很好的解决方案。后来看到这个原生子窗体,感觉挺可以,一试确实可以,感觉还行。

最后

最近找到一个VUE的文档,它将VUE的各个知识点进行了总结,整理成了《Vue 开发必须知道的36个技巧》。内容比较详实,对各个知识点的讲解也十分到位。



有需要的小伙伴,可以点击下方卡片领取,无偿分享

APP内悬浮窗 立即下载

相关推荐

简单实现拖拽功能——悬浮窗效果

实现了布局拖拽,悬浮窗效果,实现简单,可自定义任何布局,方便使用。

uniapp 悬浮窗-任意界面 Ba-FloatWinWeb

Ba-FloatWinWeb 是一款支持自定义任意界面的悬浮窗插件。采用webview方式,同时支持本地、网络地址;自带几种界面,可直接使用。

三杯五岳 5760

噪声整形与过采样实战:从N-bit ADC到DSM的SQNR优化指南

本文深入探讨了噪声整形与过采样技术在DSM(Delta-Sigma调制器)中的应用,重点分析了量化器位数(N)、滤波器阶数(L)和过采样率(OSR)对SQNR优化的影响。通过实战案例和参数协同优化策略,帮助工程师在音频处理和通信系统设计中实现更优的信号质量。

weixin_42561040的博客 340

uniapp 悬浮窗插件(在其他应用上层显示) Ba-FloatWindow

Ba-FloatWindow 是一款在其他应用上层显示的 uniapp 悬浮窗插件。支持多种场景;支持拖动;支持多个。

三杯五岳 9188

SDM660电源部分配置:

SDM660电源部分配置: Panel power supplies 1、Reference power supplies Description Name Regulator Voltage (V) Panel power supply 0 vddio PMIC 660/L11 1.8 Panel power supply 1 Lab PMIC 660/lab 4.6 Panel power s...

weixin_41811215的博客 4729

Spring AI实现RAG(检索增强生成)详解与实践

支持多种文件格式的文档加载实现高效的向量存储和检索构建智能的问答系统提供可追溯的知识服务RAG技术为AI应用提供了强大的知识增强能力,使得模型能够基于实际文档生成准确、可靠的回答。

beiduofen2011的专栏 1238

uniapp 悬浮窗(应用内、无需授权) Ba-FloatWindow2

Ba-FloatWindow2 是一款应用内并且无需授权的悬浮窗插件。支持多种拖动;自定义位置、大小;支持动态修改。

三杯五岳 3133

智能测试策略优化:平衡覆盖率、时间和资源

在软件开发过程中,测试是确保软件质量的关键环节。然而,测试工作往往面临着诸多挑战,其中如何在保证测试覆盖率的前提下,合理分配时间和资源是一个核心问题。本文章的目的在于探讨智能测试策略的优化方法,帮助软件测试团队在有限的时间和资源条件下,实现尽可能高的测试覆盖率。文章的范围涵盖了智能测试策略的核心概念、算法原理、数学模型、实际应用案例以及相关工具和资源等方面。本文将按照以下结构进行组织:首先介绍智能测试策略优化的背景和相关概念,包括核心术语和缩略词的定义;

AIGC应用创新大全的博客 620

微信小程序获取悬浮窗授权怎么写吗,uniapp用到了 uni.showToast 但是魅族手机不能正常展示 需要开启悬浮窗权限才能 能正常展示,现在有个需求就是打开小程序的时候提示他开启悬浮窗授权。

【代码】微信小程序获取悬浮窗授权怎么写吗,uniapp用到了 uni.showToast 但是魅族手机不能正常展示 需要开启悬浮窗权限才能 能正常展示,现在有个需求就是打开小程序的时候提示他开启悬浮窗授权。

weixin_45881304的博客 1232

抖音 webmssdk 签名算法解析:X-Dynosaur / X-Gnarly / X-Bogus 生成原理

它只依赖设备指纹/环境编码与随机数,与 query 内容无关,因此可以独立于 Dynosaur/Gnarly 生成。

猫敷雪 198

【docker】--- 详解 WSL2 中的 Ubuntu 和 Docker Desktop 的区别和关系!

在编程的艺术世界里,代码和灵感需要寻找到最佳的交融点,才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里,我们将共同追寻这种完美结合,为未来的世界留下属于我们的独特印记。

秋知叶i 1314

uni-app实现悬浮窗口

2.通过链式调用translateX()、opacity()等方法进行所需要的css变换,通过step()结束一组动画,一组动画里的变换是同时进行的,在step()里可以配置本组动画的属性,比如变换时间、延迟等,一组动画结束下一组动画才会开始,通过export()导出动画,通过animation绑定变换的组件。1.通过uni.createAnimation()创建动画实例。

m0_73075579的博客 3265

ConvNeXt 系列改进:引入大核注意力(LKA)替换 7×7 深度卷积,涨点 2.1%

LSKA替换7×7深度卷积,在ImageNet分类任务上实现2.1%的显著提升,参数量仅增加1M。LSKA的四层1D分解将计算复杂度从O(k²)降至O(k),21×21大核的计算量仅相当于原版7×7的1.7倍,实现了感受野与计算成本的完美平衡。部署友好度极高:LSKA模块在TensorRT FP16量化后延迟仅1.2ms,精度损失<0.1%,远优于Transformer类模型。下游任务全面领先。

ZXSXJ的博客 700

uniapp安卓打开悬浮窗权限

有更好的办法也烦请提供~

kkkkkkk_7的博客 1340

自定义载板RK3588HDMI输入配置完整解决方案

✅ HDMI输入信号检测✅ 自动时序识别(支持1080p@60Hz等标准格式)✅ V4L2视频设备接口✅ 实时视频流捕获✅ H.264编码录制✅ HDCP内容保护支持问题根因识别:发现了hdmim1模块资源冲突的本质问题硬件设计理解:明确了Orange Pi 5 Plus的真实硬件设计意图功能实现:成功启用HDMI输入功能,替代了无法使用的HDMI1输出完整验证:建立了从硬件检测到视频录制的完整测试流程。

梁俊星的博客 1271

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

uniapp一篇教你怎么写悬浮窗可拖动

提示:下面是进行一个简单demo 需要的自行去处理进行导入就可以了 就可以进行使用了 , 简简单单!

科技是唯一动力,干就完了 2087

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

uniapp实现全局悬浮框

1,在components新建组件(省去了每个页面都要引用组件的麻烦)uniapp实现全局悬浮框(按钮,页面,图片自行设置) 可拖动。3,在每个需要用到悬浮框的页面引入。每个页面切换后都会更新最新位置。

iOS_MingXing的博客 4802

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

uni-app 实现置顶悬浮框功能

试了下,,,mu模拟器、安卓手机、iOS手机,基本兼容,,滑动也不卡顿。 第三方插件地址 详述App端的2种方案 使用nvue页面 app-nvue页面渲染在原生引擎下,支持sticky,不存在浏览器兼容问题,可直接使用。 本示例就是基于nvue的示例,全端可实现粘性布局。 对一个列表头设置position: sticky,并且设置距离顶部多少开始吸顶,即同时设置top值,即可实现滚动到距离...

wusejiege6的博客 6918

使用uniapp实现全局悬浮按钮(可拖动)

使用uniapp官方组件 movable-area和movable-view。组件生成后可mian.js全局挂载,后续不需要每个页面都进行引入。全局挂载后可在需要使用的页面使用。

乔的博客 4092

uniapp使用悬浮窗组件添加点击事件的处理方法以及拖拽出界的问题

使用该组件时调用< dragball : x = 300 : y = 300 image = "图片路径" @handleBall = "事件名" > < / dragball >在下面的methods中定义该方法。由于代码是在公司的云桌面里开发的,不能粘贴赋值到自己的电脑上,所以接下来的代码我用截图的形式来展示,自己手敲太浪费时间点击事件的原理主要就是组件之间的传值,如果这点不懂的童鞋可以去看下Vue官方文档,介绍还是挺详细的。

二三的博客 9199

uniapp 使用subNVue原生子窗体显示弹框或悬浮框

subNVue原生子窗体是uniapp提供的一种原生组件,可以在uniapp中嵌入原生页面,并且可以与uniapp页面进行通信。我们可以在原生页面中使用uniapp提供的API来与uniapp页面进行通信,从而实现弹框等功能。在uniapp中,我们可以使用subNVue原生子窗体来解决web-view等原生页面中弹框无法显示的问题。在页面目录下新建专门存放原生子窗体的文件夹,subNVue是使用原生子窗体的vue页面。效果如图,显示在右下角的专属福利弹窗,不挂载在当前页面,挂载在全局。

浮游的博客 3651

跨平台应用开发进阶(五十九):uni-app实现视屏播放小窗功能

在业务功能开发过程中,需要实现视频直播、播放小窗功能。鉴于目前通过接入火山webSDK实现视频直播、点播功能。需要火山协助配合改造实现小窗功能。uni-app插件市场也提供了若干插件,经试用效果并不友好。画中画悬浮窗(视频) Ba-VideoPip存在以下问题:其他的,例如画中画(全局)、支持为第三方播放器无缝添加、进度同步更新(andorid)原生系统自带播放器、支持为第三方播放器无缝添加画中画(全局) (ios)定价过高,且无任何用户提出使用效果,毕竟不是官方出品,实属不敢使用。

IT全栈 华强工作室 2724

uniapp 画中画悬浮窗(视频) Ba-VideoPip

Ba-VideoPip 是一款画中画方式的视频悬浮窗插件。支持点播、直播;支持官方、三方播放器无缝切换;支持动态刷新(如切换视频或进度)。

三杯五岳 3250

uniapp 悬浮窗(悬浮球、动态菜单、在其他应用上层显示) Ba-FloatBall

Ba-FloatBall 是一款在其他应用上层显示的悬浮球插件。支持展示菜单、拖动、自动贴边等;支持自定义样式。

三杯五岳 6168

uniapp (时长累计)全局悬浮窗实现

关键字 uniapp 全局可拖拽悬浮窗 30S无操作停止计时 需求 使用uniapp的一个H5项目中有一个全局的悬浮窗,记录用户的在线时长,如果30S用户没有任何操作就停止计时,在播放视频和播放音频时无30S限制。 方案 第一部分:实现全局可拖动的悬浮窗 在uniapp中不能再App.vue 中写任何的模板代码,所以说只能在每个page中添加,实现拖拽的时候先记录一下上次拖拽的位置,把位置作为一个全局的变量,在下一个页面进入后将位置的全局变量赋值,组件代码如下: <template> &l

m0_37593950的博客 4973

uniapp 使用subNVue原生子窗体解决web-view等原生页面中弹框无法显示的问题

问题: 使用web-view或者video组件时,h5端的编写的fixed布局或其他popup弹框页面无法显示 解决方案:使用subNVue这个原生子窗体的方法去解决APP端打开弹窗显示弹窗被覆盖 注意事项: 1、subNVue这个原生子窗体的后缀必须是.nue 2、样式不支持scss,只能一个个样式.className {} 不能嵌套 3、subNVue只支持在手机上运行 官方:uni-app subNVue 原生子窗体开发指南 一、创建一个shareSubNVue文件夹,文件夹下创建一个p.

theScoreONE的博客 4588
上一篇: typeScript 接口(interface)及其与类型别名(type)的区别
下一篇: vue 系列 -- vue 3.0 新特性
梅花十三儿
博客等级 码龄5年 1038粉丝 444原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值