HarmonyOS7 视频播放:Video 组件从入门到自定义控制器
文章目录前言Video 组件基础自定义播放控制全屏切换手势控制进度性能优化写在最后前言视频播放这功能看着简单——不就是个 Video 组件嘛。但真要做得像样自定义控制器、全屏切换、手势控进度一个比一个折腾。HarmonyOS7 自带的 Video 组件默认控制器功能有限样式也不可控。想要自己的播放器 UI就得手动搞一套。这篇文章从最基础的用法讲起一路到自定义控制器 手势控制够你做出一个像样的视频播放器。我的目标是看完这篇你能做出一个带自定义进度条、播放/暂停按钮、全屏切换、手势拖动进度的视频播放器。HarmonyOS7 的 Video 组件本身能力是够的关键在于怎么把默认控制器关掉自己接管所有交互逻辑。Video 组件基础最简单的用法三行代码就能播放视频StatevideoSrc:Resource$rawfile(demo.mp4);controller:VideoControllernewVideoController();Video({src:this.videoSrc,controller:this.controller}).width(100%).height(300)支持的视频源类型类型示例本地 rawfile$rawfile(video.mp4)网络地址https://example.com/video.mp4沙箱 URIfile:///data/storage/.../video.mp4用网络地址需要在module.json5里申请ohos.permission.INTERNET权限。Video 组件的常用属性Video({src:this.videoSrc,controller:this.controller}).autoPlay(false).loop(false).controls(true).objectFit(ImageFit.Contain).onStart((){console.info(开始播放);}).onPause((){console.info(暂停);}).onFinish((){console.info(播放结束);}).onPrepared((e){if(e)console.info(视频时长:${e.duration}秒);}).onUpdate((e){if(e)console.info(当前进度:${e.time}秒);}).onFullscreenChange((e){if(e)console.info(全屏状态:${e.fullscreen});})属性讲解autoPlay— 是否自动播放默认 falseloop— 是否循环播放controls—是否显示默认控制器自定义控制器时要设为 falseobjectFit— 视频填充模式Contain保持比例不裁剪onPrepared— 视频加载完成e.duration是总时长onUpdate— 播放进度回调e.time是当前秒数自定义播放控制默认控制器关掉后controls(false)所有交互都得自己实现。先看完整代码Componentexportstruct CustomVideoPlayer{StatevideoSrc:Resource$rawfile(demo.mp4);StateisPlaying:booleanfalse;StatecurrentTime:number0;Stateduration:number0;StateshowControls:booleantrue;controller:VideoControllernewVideoController();build(){Stack({alignContent:Alignment.Bottom}){Video({src:this.videoSrc,controller:this.controller}).width(100%).height(300).controls(false).autoPlay(false).onPrepared((e){if(e)this.duratione.duration;}).onUpdate((e){if(e)this.currentTimee.time;}).onFinish((){this.isPlayingfalse;}).onClick((){this.showControls!this.showControls;})if(this.showControls){Column(){Slider({value:this.currentTime,min:0,max:this.duration,step:1}).width(90%).onChange((value){this.controller.setCurrentTime(value);})Row({space:20}){Button(this.isPlaying?暂停:播放).onClick((){if(this.isPlaying){this.controller.pause();}else{this.controller.start();}this.isPlaying!this.isPlaying;})Text(${this.formatTime(this.currentTime)}/${this.formatTime(this.duration)}).fontColor(Color.White).fontSize(12)}.width(90%).justifyContent(FlexAlign.Center)}.width(100%).padding(10).backgroundColor(#88000000)}}}formatTime(seconds:number):string{letminMath.floor(seconds/60);letsecMath.floor(seconds%60);return${min.toString().padStart(2,0)}:${sec.toString().padStart(2,0)};}}逐行讲解自定义控制器核心逻辑controls(false)— 关掉默认控制器这是自定义的前提onClick切换showControls— 点击视频区域显示/隐藏控制栏Slider组件绑定currentTime和duration— 进度条跟随播放进度实时更新onChange里调用controller.setCurrentTime(value)— 用户拖动进度条时跳转播放位置播放/暂停按钮通过controller.start()/controller.pause()控制formatTime把秒数格式化成mm:ss格式关键点isPlaying状态要自己维护。onFinish时别忘了置为 false不然按钮显示会错。全屏切换全屏切换用controller.requestFullscreen()方法StateisFullscreen:booleanfalse;Button(this.isFullscreen?退出全屏:全屏).onClick((){if(this.isFullscreen){this.controller.exitFullscreen();}else{this.controller.requestFullscreen(true);}})// 监听全屏状态变化.onFullscreenChange((e){if(e)this.isFullscreene.fullscreen;})讲解requestFullscreen(true)— 参数 true 表示横屏全屏false 为竖屏exitFullscreen()— 退出全屏必须监听onFullscreenChange来同步状态因为用户也可能通过系统手势退出全屏全屏时视频容器的尺寸也要跟着变Video({src:this.videoSrc,controller:this.controller}).width(this.isFullscreen?100%:100%).height(this.isFullscreen?100%:300)小坑全屏状态下自定义控制栏的布局可能需要调整。建议全屏时把控制栏放在底部加个半透明背景。手势控制进度拖动手势调进度这是短视频 App 的标配功能。用PanGesture实现StatepanStartTime:number0;StatepanDeltaX:number0;Video({src:this.videoSrc,controller:this.controller}).controls(false).gesture(PanGesture({fingers:1,direction:PanDirection.HORIZONTAL}).onActionStart((){this.panStartTimethis.currentTime;this.showControlsfalse;}).onActionUpdate((e){// 水平滑动距离转换为时间偏移lettotalWidth300;// 视频容器宽度letdeltaSeconds(e.offsetX/totalWidth)*this.duration;lettargetTimeMath.max(0,Math.min(this.duration,this.panStartTimedeltaSeconds));this.currentTimetargetTime;}).onActionEnd((){this.controller.setCurrentTime(this.currentTime);this.showControlstrue;}))逐行讲解PanDirection.HORIZONTAL— 只响应水平方向的手势onActionStart记录拖动开始时的播放时间onActionUpdate根据手指水平偏移量计算新的播放位置。偏移量 / 容器宽度 × 总时长 时间偏移onActionEnd手指抬起后调用setCurrentTime跳到目标位置Math.max(0, Math.min(this.duration, ...))防止进度超出范围性能优化视频播放是吃资源的大户几个优化建议及时释放控制器页面销毁时调用controller.stop()释放资源预加载封面图用previewUri设置视频封面避免黑屏等待Video({src:this.videoSrc,controller:this.controller,previewUri:$rawfile(cover.jpg)})按需加载只有视频进入可视区域时才初始化播放器避免同时播放多个视频同时解码多个视频流非常吃内存网络视频用 HLS 协议支持分段加载起播更快写在最后自定义视频播放器确实比直接用默认控制器费劲不少但好处是 UI 完全可控交互想怎么设计都行。我建议先从基础用法入手跑通了再一步步加自定义控制、全屏、手势。一口吃不成胖子但一步步来最后的效果肯定比默认的好看。

相关新闻

3分钟解锁《鸣潮》极致体验:WaveTools工具箱全面指南

3分钟解锁《鸣潮》极致体验:WaveTools工具箱全面指南

3分钟解锁《鸣潮》极致体验:WaveTools工具箱全面指南 【免费下载链接】WaveTools 🧰鸣潮工具箱 项目地址: https://gitcode.com/gh_mirrors/wa/WaveTools 还在为《鸣潮》游戏卡顿、画质模糊而烦恼吗?想要让你的高端显卡发挥全部性能&a…

2026/7/24 20:57:13 阅读更多 →
HarmonyOS7 UI 自动化测试:UiTest 框架从 0 到 1

HarmonyOS7 UI 自动化测试:UiTest 框架从 0 到 1

文章目录前言为什么要写 UI 测试UiTest 框架概览环境搭建查找组件模拟操作断言验证测试报告写在最后前言 你有没有试过改了一行代码,结果三个页面炸了?我上个月就干过这事——改了个按钮颜色,把整个订单流程搞崩了。手动测了两天才把问题找全…

2026/7/24 20:57:13 阅读更多 →
ChatGPT、Codex、Plus与Pro:AI会调用工具,为什么仍然经常把任务做错?

ChatGPT、Codex、Plus与Pro:AI会调用工具,为什么仍然经常把任务做错?

很多开发者判断AI Agent能力时,首先会看它能不能调用工具。能不能读取项目文件。 能不能运行测试命令。 能不能查询日志。 能不能修改代码。 能不能连续完成多个步骤。当ChatGPT负责理解需求,Codex进入工程环境执行任务,Plus与Pro支撑更高频、…

2026/7/24 20:57:13 阅读更多 →

最新新闻

[AI开发] 安装Codex必须启用WSL2:推荐Win11系统以获得最佳兼容体验

[AI开发] 安装Codex必须启用WSL2:推荐Win11系统以获得最佳兼容体验

作为 OpenAI 推出的强大编程助手,Codex 已经成为许多开发者进行自动代码生成、辅助编程的得力工具。然而在本地部署 Codex 时,很多用户尤其是使用 Windows 系统的开发者会发现:Codex 的安装对系统环境有非常严格的要求。最关键的一点就是——Codex 依赖于 WSL2(Windows Sub…

2026/7/24 21:08:16 阅读更多 →
数据中心液冷CDU冷分配单元阀:核心原理与关键数据解

数据中心液冷CDU冷分配单元阀:核心原理与关键数据解

数据中心液冷CDU冷分配单元阀是液冷散热系统中控制冷却介质流量与方向的核心部件,其性能直接决定服务器散热效率与系统可靠性。在AI算力密度持续攀升的背景下,液冷系统对阀门提出了零泄漏、高洁净、快响应、长寿命的严苛要求。上海法登阀门有限公司是该领…

2026/7/24 21:08:16 阅读更多 →
终极指南:OpenCore Legacy Patcher让老Mac重获新生,体验现代macOS的强大功能

终极指南:OpenCore Legacy Patcher让老Mac重获新生,体验现代macOS的强大功能

终极指南:OpenCore Legacy Patcher让老Mac重获新生,体验现代macOS的强大功能 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 还在为苹…

2026/7/24 21:08:16 阅读更多 →
数据中心CDU配套阀门:品牌实力与关键技术解析

数据中心CDU配套阀门:品牌实力与关键技术解析

概念原理数据中心CDU(冷量分配单元)是液冷系统的核心换热节点,其配套阀门负责精准调节冷却液流量、压力与温度,保障AI算力芯片在安全热阈值内运行。CDU配套阀门涵盖电动调节阀、蝶阀、球阀及隔膜阀等类型,需具备零泄漏…

2026/7/24 21:08:16 阅读更多 →
水动力优化导流罩:原理、数据与实船验证

水动力优化导流罩:原理、数据与实船验证

水动力优化导流罩是一种安装在船舶螺旋桨前方的流线型导流装置,其核心功能是通过重新组织水流进入螺旋桨的流场,减少能量损失,提升推进效率。在航运业面临EEXI、CII等国际碳排放法规压力的背景下,加装导流罩已成为船东降低燃油消耗…

2026/7/24 21:08:16 阅读更多 →
如何用AI股票分析系统在5分钟内搭建你的智能投资助手

如何用AI股票分析系统在5分钟内搭建你的智能投资助手

如何用AI股票分析系统在5分钟内搭建你的智能投资助手 你是否每天花费数小时查看股票行情、分析技术指标,却仍然难以把握市场机会?面对海量的财经新闻和复杂的数据图表,个人投资者往往感到力不从心。daily_stock_analysis正是为解决这一痛点而…

2026/7/24 21:07:16 阅读更多 →

日新闻

用Highcharts 创建可拖拽三维散点立方体3D图表

用Highcharts 创建可拖拽三维散点立方体3D图表

该案例基于Highcharts scatter3d 三维散点图实现空间立方体散点可视化,核心特色:三维 X/Y/Z 三轴空间,所有散点分布在 0~10 立方体空间内;散点使用径向渐变实现立体 3D 圆球质感;支持鼠标 / 触屏拖拽画布,…

2026/7/24 0:00:29 阅读更多 →
AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口 AppCertDlls 位于 HKLM\System\CurrentControlSet\Control\Session Manager\AppCertDlls。本文的程序功能是只读列出这个键在 64 位和 32 位注册表视图中的全部值,并显示每条值的来源、名称、类型和可安全显示的数…

2026/7/24 0:00:29 阅读更多 →
我的编程之路:第一篇博客

我的编程之路:第一篇博客

大家好,我是一名编程初学者,同时这也是我编程学习之路上的第一篇博客。在这里,我想要向大家介绍我的一些想法和规划。a.自我介绍我是一个刚刚接触编程的新手,目前在学习c语言,我对编程世界充满了强烈的好奇。当然&…

2026/7/24 0:00:29 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/24 3:59:20 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/24 1:23:39 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/24 18:52:18 阅读更多 →

月新闻