当前位置: 首页 > news >正文

HarmonyOS开发实战( Beta5.0)滑动视频自动播放案例实践

鸿蒙HarmonyOS开发往期文章必看:

HarmonyOS NEXT应用开发性能实践总结

最新版!“非常详细的” 鸿蒙HarmonyOS Next应用开发学习路线!(从零基础入门到精通)


介绍

本示例主要介绍视频列表滑动到屏幕中间自动播放场景,利用onScrollIndex获取List显示区域内中间子组件索引值的能力来判断播放,利用懒加载场景会预加载List显示区域外cachedCount的内容的能力来实现视频连续播放。

效果图预览

使用说明

  1. 等待视频加载完成,首页中间视频会自动播放。
  2. 滑动列表,视频达到中间位置会自动播放。
  3. 滑动列表返回上一个视频会继续播放。

实现思路

本例涉及的关键特性和实现方案如下:

  1. 使用List渲染视频列表,LazyForEach实现视频列表懒加载。将每个视频模块存放在ListItem中,LazyForEach懒加载可以通过设置cachedCount来指定缓存数量,使用onScrollIndex获取List显示区域内中间位置子组件的索引值,源码参考VideoListAutoplay.ets。
List() {LazyForEach(this.newsList, (news: NewsItem, index: number) => {ListItem() {XComponentVideo({centerIndex: this.centerIndex,news: news,index: index})}.backgroundColor("#fff6f6f6").borderRadius(30).margin({ bottom: 20 })}, (item: string) => item)
}
.cachedCount(CACHE_COUNT) // TODO:知识点:LazyForEach懒加载可以通过设置cachedCount来指定缓存数量,在设置cachedCount后,除屏幕内显示的ListItem组件外,还会预先将屏幕可视区外指定数量的列表项数据缓存。
.onScrollIndex((firstIndex: number, lastIndex: number, centerIndex: number) => {this.centerIndex = centerIndex; // 获取List显示区域内中间子组件索引值
})
  1. 视频渲染部分可使用XComponent+AVPlayer实现,也可用Video实现,因XComponent+AVPlayer可对视频进行更多操作,因此本案例使用XComponent+AVPlayer进行开发。

  2. 通过监听centerIndex值,实时调整视频播放状态。实时监听centerIndex,使得centerIndex改变可及时调整视频播放状态,源码参考XComponentVideo.ets。

// centerIndex状态变化时调用
onIndexChange() {if (this.isLoadingVideo) {// centerIndex是List显示区域内中间子组件索引值,index值是List当前索引值。当二者相等时,代表视频滑动到屏幕中间。if (this.centerIndex === this.index) {this.isPlaying = true;this.getPlay();} else {this.isPlaying = false;this.getPause();}}
}
  1. XComponent和AVPlayer渲染视频。在资源初始化时,将XComponent和AVPlayer通过surfaceId绑定,并进入准备状态,在准备状态中将对当前视频是否是List显示区域内中间子组件做判断,如果是则进入播放阶段,源码参考XComponentVideo.ets。
...
// 资源初始化,avplayer设置播放源后触发该状态上报
case 'initialized':logger.info('state initialized called');this.setSurfaceID(); // 设置显示画面,当播放的资源为纯音频时无需设置this.avPlayer.prepare(); // 进入准备状态break;
// 已准备状态
case 'prepared':logger.info('state prepared called');this.avPlayer.audioInterruptMode = audio.InterruptMode.INDEPENDENT_MODE; // 避免同时出现两个视频的声音this.avPlayer.loop = true; // 设置循环播放this.isLoadingVideo = true; // 视频加载完成// 在屏幕中间的视频开始播放if (this.centerIndex === this.index) {this.isPlaying = true;this.avPlayer.play();}break;
// 正在播放状态
case 'playing':this.flag = true; // 视频准备完毕this.isLoading = false; // 取消加载logger.info('state playing called');break;
...
  1. Image进入页面首次加载。进入应用首先加载图片,使用Stack将Image覆盖在XComponent上,并使用visibility来控制图片的显示,源码参考XComponentVideo.ets。
Stack(){XComponent({type: XComponentType.SURFACE,controller: this.xComponentController}).borderRadius(30).onLoad(() => {this.surfaceID = this.xComponentController.getXComponentSurfaceId();this.videoSrc = news.newsVideoSrc;this.init();})Image(news.newsImage).borderRadius(30).visibility(this.startOrEnd || !this.flag || this.imageChange ?Visibility.Visible :Visibility.None).zIndex(1)
}

高性能知识点

本示例使用了LazyForEach 进行数据懒加载优化,以降低内存占用和渲染开销。

工程结构&模块类型

videolistautoplay                            // har类型
|---model 
|   |---NewsItemModel.ets                    // 视频信息
|   |---NewsListDataSource.ets               // IDataSource处理数据监听的基本实现 
|   |---TabBarModel.ets                      // Tab组件信息   
|---view
|   |---CustomComponent.ets                  // 视图层-应用Tab页面
|   |---VideoListAutoplay.ets                // 视图层-应用主页面
|   |---XComponentVideo.ets                  // 视图层-应用视频渲染页面

模块依赖

  • 本实例依赖common模块来获取日志工具类logger。

最后

小编在之前的鸿蒙系统扫盲中,有很多朋友给我留言,不同的角度的问了一些问题,我明显感觉到一点,那就是许多人参与鸿蒙开发,但是又不知道从哪里下手,因为体系杂乱无章,教授的人也多,无从选择。有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以有一份实用的鸿蒙(HarmonyOS NEXT)路线、视频、文档用来跟着学习是非常有必要的。

如果你是一名有经验的资深Android移动开发、Java开发、前端开发、对鸿蒙感兴趣以及转行人员

鸿蒙 NEXT 全栈开发学习笔记 希望这一份鸿蒙学习文档能够给大家带来帮助~


 鸿蒙(HarmonyOS NEXT)最新学习路线

该路线图包含基础技能、就业必备技能、多媒体技术、六大电商APP、进阶高级技能、实战就业级设备开发,不仅补充了华为官网未涉及的解决方案

路线图适合人群:

IT开发人员:想要拓展职业边界
零基础小白:鸿蒙爱好者,希望从0到1学习,增加一项技能。
技术提升/进阶跳槽:发展瓶颈期,提升职场竞争力,快速掌握鸿蒙技术

2.视频教程+学习PDF文档

(鸿蒙语法ArkTS、TypeScript、ArkUI教程……)

 纯血版鸿蒙全套学习文档(面试、文档、全套视频等)

                   

鸿蒙APP开发必备

​​

总结

参与鸿蒙开发,你要先认清适合你的方向,如果是想从事鸿蒙应用开发方向的话,可以参考本文的学习路径,简单来说就是:为了确保高效学习,建议规划清晰的学习路线

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Caffenie配合Redis做两级缓存,Redis发布订阅实现缓存一致更新
  • 利士策分享,在延长退休背景下,应该如何合理的规划退休生活?
  • openstack之glance介绍
  • 数据库-基本操作(一)
  • c/c++面试100道
  • 单个 java 虚拟机 生产者消费者
  • 《OpenCV计算机视觉》—— 对图片进行旋转的两种方法
  • 3D云渲染农场为何怎么贵?主要消耗成本介绍
  • 什么是野指针和悬空指针?
  • NVIDIA驱动学习
  • 【即时通讯】轮询方式实现
  • Android 内置应用裁剪
  • 基于python实现Modis数据的检索与下载
  • React第三章(tsx语法入门 )
  • 移远通信高端5G智能模组SG560D-NA率先通过PTCRB认证
  • Google 是如何开发 Web 框架的
  • 【Leetcode】104. 二叉树的最大深度
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • egg(89)--egg之redis的发布和订阅
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • JavaScript设计模式之工厂模式
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • Ruby 2.x 源代码分析:扩展 概述
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • 从零开始的无人驾驶 1
  • 对象引论
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • ​决定德拉瓦州地区版图的关键历史事件
  • #window11设置系统变量#
  • (30)数组元素和与数字和的绝对差
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (二) 初入MySQL 【数据库管理】
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (函数)颠倒字符串顺序(C语言)
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (六)软件测试分工
  • (三分钟)速览传统边缘检测算子
  • (顺序)容器的好伴侣 --- 容器适配器
  • (一)RocketMQ初步认识
  • (转)菜鸟学数据库(三)——存储过程
  • .Net 8.0 新的变化
  • .NET C# 配置 Options
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .考试倒计时43天!来提分啦!
  • @manytomany 保存后数据被删除_[Windows] 数据恢复软件RStudio v8.14.179675 便携特别版...
  • [.net 面向对象程序设计进阶] (19) 异步(Asynchronous) 使用异步创建快速响应和可伸缩性的应用程序...
  • [20180129]bash显示path环境变量.txt
  • [7] CUDA之常量内存与纹理内存
  • [Angular 基础] - 数据绑定(databinding)
  • [C#]扩展方法