HarmonyOS NEXT应用开发边学边玩系列:从零实现一影视APP (二、首页轮播图懒加载的实现)

server/2025/1/16 5:54:05/

在开发一款影视APP时,首页的轮播图是一个非常重要的部分。它不仅能够吸引用户的注意力,还能有效地推广重点内容。为了提升应用的性能和用户体验,可以实现轮播图的懒加载功能。本文将详细介绍如何在HarmonyOS NEXT应用开发中实现这一功能。

1. 数据源设计

开源仓库地址:https://atomgit.com/csdn-qq8864/hmmovie

好的作品是需要不断打磨,在你的学习和体验过程中有任何问题,欢迎到我的开源项目代码仓下面提交issue,持续优化。
在这里插入图片描述

首先,需要设计一个数据源类 BasicDataSource,该类会实现 IDataSource 接口,用于管理轮播图数据。以下是 BasicDataSource 的代码:

class BasicDataSource<T> implements IDataSource {private listeners: DataChangeListener[] = [];private originDataArray: T[] = [];totalCount(): number {return this.originDataArray.length;}getData(index: number): T {return this.originDataArray[index];}registerDataChangeListener(listener: DataChangeListener): void {if (this.listeners.indexOf(listener) < 0) {this.listeners.push(listener);}}unregisterDataChangeListener(listener: DataChangeListener): void {const pos = this.listeners.indexOf(listener);if (pos >= 0) {this.listeners.slice(pos, 1);}}// 通知LazyForEach组件需要重新重载所有子组件notifyDataReload(): void {this.listeners.forEach(listener => {listener.onDataReloaded();})}// 通知LazyForEach组件需要在index对应索引处添加子组件notifyDataAdd(index: number): void {this.listeners.forEach(listener => {listener.onDataAdd(index);})}
}

代码解释

  • private listeners: 用于存储数据变化的监听器。
  • private originDataArray: 存储原始数据的数组。
  • totalCount: 返回数据源中数据的总数。
  • getData: 根据索引获取数据。
  • registerDataChangeListener: 注册数据变化监听器。
  • unregisterDataChangeListener: 移除数据变化监听器。
  • notifyDataReload: 通知所有监听器数据需要重新加载。
  • notifyDataAdd: 通知所有监听器在指定索引处添加了新数据。

2. 扩展数据源以支持懒加载

接下来,需要扩展 BasicDataSource 类来实现轮播图数据的懒加载。这里创建一个 SwiperDataSource 类继承自 BasicDataSource,并添加了一些懒加载相关的功能:

class SwiperDataSource<T> extends BasicDataSource<T> {private dataArray: T[] = [];totalCount(): number {return this.dataArray.length;}getData(index: number): T {return this.dataArray[index];}// 在列表末尾添加数据并通知监听器pushData(data: T): void {this.dataArray.push(data);this.notifyDataAdd(this.dataArray.length - 1);}// 重载数据reloadData(): void {// 不会引起状态变化this.dataArray = [];// 必须通过DataChangeListener来更新this.notifyDataReload();}
}

代码解释

  • private dataArray: 存储懒加载后的数据。
  • pushData: 向数据数组中添加新数据,并通知监听器有新数据添加。
  • reloadData: 重置数据数组,并通知监听器数据需要重新加载。

3. 实现轮播图懒加载

在设计好数据源后,可以开始实现轮播图。使用 SwiperLazyForEach 组件来实现懒加载。以下是首页轮播图的代码:

// 轮播图
Swiper(this.swiperController) {LazyForEach(this.swiperData, (item: SwiperItem) => {Stack({ alignContent: Alignment.Center }) {Image(item.imageUrl).width('100%').height(180).zIndex(1).onClick(() => {this.pageStack.pushDestinationByName("MovieDetailPage", { id:item.id }).catch((e:Error)=>{// 跳转失败,会返回错误码及错误信息console.log(`catch exception: ${JSON.stringify(e)}`)}).then(()=>{// 跳转成功});})// 显示轮播图标题Text(item.title).padding(5).margin({ top: 135 }).width('100%').height(60).textAlign(TextAlign.Center).maxLines(2).textOverflow({ overflow: TextOverflow.Clip }).fontSize(22).fontColor(Color.White).opacity(100)// 设置标题的透明度 不透明度设为100%,表示完全不透明.backgroundColor('#808080AA')// 背景颜色设为透明.zIndex(2).onClick(() => {this.pageStack.pushDestinationByName("MovieDetailPage", { id:item.id }).catch((e:Error)=>{// 跳转失败,会返回错误码及错误信息console.log(`catch exception: ${JSON.stringify(e)}`)}).then(()=>{// 跳转成功});})}}, (item: SwiperItem) => item.id)
}
.cachedCount(2)
.index(1)
.autoPlay(true)
.interval(4000)
.loop(true)
.indicatorInteractive(true)
.duration(1000)
.itemSpace(0)
.curve(Curve.Linear)
.onChange((index: number) => {console.info(index.toString())
})
.onGestureSwipe((index: number, extraInfo: SwiperAnimationEvent) => {console.info("index: " + index)console.info("current offset: " + extraInfo.currentOffset)
})
.height(180) // 设置高度

代码解释

  • Swiper: 轮播图组件,通过 this.swiperController 进行控制。
  • LazyForEach: 根据数据源动态渲染子组件。this.swiperData 是数据源实例,(item: SwiperItem) => item.id 是唯一标识符生成函数。
  • Stack: 容器组件,用于将图片和标题堆叠在一起。
  • Image: 显示轮播图的图片。
  • Text: 显示图片的标题,设置了最大行数、文字溢出处理、字体大小、颜色、背景颜色等属性。
  • cachedCount: 设置缓存的子组件数量。
  • index: 设置初始显示的图片索引。
  • autoPlay: 是否自动播放。
  • interval: 自动播放的时间间隔。
  • loop: 是否循环播放。
  • indicatorInteractive: 指示器是否可交互。
  • duration: 切换动画的持续时间。
  • itemSpace: 子组件之间的间距。
  • curve: 切换动画的曲线。
  • onChange: 当轮播图切换时触发的回调函数。
  • onGestureSwipe: 当用户进行滑动操作时触发的回调函数。

4. 总结

通过本文,学习了如何在HarmonyOS NEXT应用开发中实现轮播图的懒加载功能。这种方法不仅提升了应用的性能,还为用户提供了更好的使用体验。你可以根据实际需求对代码进行进一步的优化和扩展,以满足更多功能的实现。希望这篇文章对你有所帮助,欢迎在评论区交流和提问。

作者介绍

作者:csdn猫哥

原文链接:https://blog.csdn.net/yyz_1987

团队介绍

坚果派团队由坚果等人创建,团队拥有12个华为HDE带领热爱HarmonyOS/OpenHarmony的开发者,以及若干其他领域的三十余位万粉博主运营。专注于分享HarmonyOS/OpenHarmony、ArkUI-X、元服务、仓颉等相关内容,团队成员聚集在北京、上海、南京、深圳、广州、宁夏等地,目前已开发鸿蒙原生应用和三方库60+,欢迎交流。

版权声明

本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。


http://www.ppmy.cn/server/158749.html

相关文章

mysql概述

sql的定义&#xff1a; sql&#xff08;Structured Query Language&#xff09;&#xff1a;结构化查询语言 sql的分类&#xff1a; DDL&#xff08;Data Definition Language&#xff09;&#xff1a; 数据定义语言——定义对数据库对象&#xff08;库&#xff0c;表&…

jupyter ai 结合local llm 实现思路

参考链接&#xff1a; jupyter ai develop 开发文档 https://jupyter-ai.readthedocs.io/en/latest/developers/index.html langchain custom LLM 开发文档 https://python.langchain.com/v0.1/docs/modules/model_io/llms/custom_llm/ stackoverflow :intergrate Local LLM…

网管平台(进阶篇):路由器的管理实践

在当今数字化时代&#xff0c;路由器作为网络连接的核心设备&#xff0c;其管理对于确保网络的稳定、高效和安全至关重要。本文旨在深入探讨路由器管理的重要性、基本设置步骤、高级功能配置以及日常维护&#xff0c;帮助读者构建一个高效且安全的网络环境。 一、路由器管理的…

OpenCV基于均值漂移算法(pyrMeanShiftFiltering)的水彩画特效

1、均值漂移算法原理 pyrMeanShiftFiltering算法结合了均值迁移&#xff08;Mean Shift&#xff09;算法和图像金字塔&#xff08;Image Pyramid&#xff09;的概念&#xff0c;用于图像分割和平滑处理。以下是该算法的详细原理&#xff1a; 1.1 、均值迁移&#xff08;Mean …

代码随想录-训练营-day7

344. 反转字符串 - 力扣&#xff08;LeetCode&#xff09; 这个题更多的可能想展示一下基本的反转字符串的操作&#xff0c;好像没什么好说的&#xff0c;我们可以不用swap函数&#xff0c;也可以用&#xff0c;我们甚至可以直接使用reverse函数&#xff08;面试应该不可能考这…

Jenkins质量门禁设计方案的深入探讨

Jenkins作为一个开源的自动化服务器&#xff0c;它通过简化持续集成和持续交付流程&#xff0c;使得软件测试变得更加高效。质量门禁设计方案结合了Jenkins的以下几项核心功能&#xff1a; 持续集成&#xff08;CI&#xff09; &#xff1a;通过自动化构建和测试&#xff0c;提…

OSPF - 路由过滤的几种方法

&#x1f618;1. 路由引入时过滤 可以通过引入路由时使用路由策略来过滤掉不想要的路由 在ASBR上配置&#xff0c;能够直接不产生对应的5类LSA import [外部自治系统] route-policy [路由策略名] //引入时考虑路由策略例如我现在要过滤掉从ISIS区域引入的3.3.4.4 [ABSR的OSPF…

NGC容器中快速搭建Jupyter环境

本文将介绍如下内容&#xff1a; 一、搭建 Docker Container 环境二、配置 Jupyter三、访问 Jupyter 页面并后台运行服务 一、搭建 Docker Container 环境 1、拉取 Docker Image NVIDAI NGC CONTAINER # 1. 进入 NVIDAI NGC CONTAINER&#xff0c;检索。Eg: Pytorch Tag #…