HarmonyOs开发:轮播图Banner组件封装与使用

前言

轮播图在每个项目中都很常见,鸿蒙中在容器组件中也提供了Swiper组件,用于子组件滑动轮播显示,和前端的使用起来也是异曲同工,我们先看下基本的用法。

Swiper() {ForEach(["1", "2", "3", "4", "5", "6"], (item: string) => {Text(item.toString()).width('90%').height(160).backgroundColor(0xAFEEEE).textAlign(TextAlign.Center).fontSize(30)}, (item: string) => item)}

以上的代码便轻松的实现了一个轮播图效果,当然了,只是一个简单的案例,很多属性并没有设置,按照正常的使用而言,确实没必要再搞什么封装,但是,有一个潜在的问题是需要封装的,比如使用懒加载数据的时候,不封装的话,每实现一个轮播图就需要重复大量的代码,这显然是冗余的;还有一种场景,那就是,系统的轮播无法满足我们的需求,这种情况下,是不得不进行封装的。

本文的大致内容如下:

1、简单封装之后的代码及效果展示

2、基于Swiper进行懒加载数据和普通数据封装

3、开源地址

4、相关总结

一、简单封装之后的代码及效果展示

封装的Banner已经上传到了远程仓库,使用起来也是非常的简单

方式一:在Terminal窗口中,执行如下命令安装三方包,DevEco Studio会自动在工程的oh-package.json5中自动添加三方包依赖。

ohpm install @abner/banner

方式二:在工程的oh-package.json5中设置三方包依赖,配置示例如下:

"dependencies": { "@abner/banner": "^1.0.0"}

效果没什么好说的,都是用Swiper组件所封装的。

代码实现上,毕竟采取了封装,简化了大量的代码,简单的案例如下:

Banner({data: ["1", "2", "3", "4", "5", "6"],itemPage: this.itemPage})

更多的案例,就不贴了,直接去看第3项中的开源地址即可。

相关属性配置

属性

类型

概述

data

Array<Object>

数据源

itemPage

(index: number, item: Object)

banner对应的页面

onChange

回调函数

条目切换监听

bannerHeight

Length

banner高度

bannerWidth

Length

banner宽度

autoPlay

boolean

是否自动播放,默认false

interval

number

默认3秒轮播一次

disableSwipe

boolean

是否禁止滑动

itemSpace

number

子组件之间的间隙

currentIndex

number

选中,默认第0个

indicator

DotIndicator | DigitIndicator | boolean

指示器

isLineIndicator

boolean

是否是自定义的线条指示器

indicatorType

IndicatorType

指示器位置

lineIndicatorWidth

number

线条指示器宽度

lineIndicatorHeight

number

线条指示器高度

lineIndicatorBgColor

ResourceColor

线条指示器背景

lineMargin

Margin | Length

线条指示器边距

isLoop

boolean

是否开启循环,默认是循环

indicatorRules

Record<string, Record<string, string | VerticalAlign | HorizontalAlign>>

线条指示器位置

isLazyData

boolean

是否使用数据懒加载

lazyCachedCount

number

缓存条目数量,默认是1

onLazyDataSource

(dataSource: BannerDataSource)

回调函数,用于控制数据的增删

二、基于Swiper进行懒加载数据和普通数据封装

首先Swiper的子组件是支持ForEach和LazyForEach进行渲染数据的,LazyForEach也就是数据懒加载模式,也是官方案例中默认推荐的模式,当组件滑出可视区域外时,框架会进行组件销毁回收以降低内存占用,但是两种渲染数据,在代码逻辑上是完全不同的。

ForEach就比较的简单,数据源是一个数组,在封装上也是非常的简洁:

Swiper(this.swiperController) {ForEach(this.data, (item: Object, index: number) => {this.itemPage(index, item)})}

LazyForEach模式,使用起来相对复杂,组件的创建包括两种情况:LazyForEach首次渲染和LazyForEach非首次渲染,这些都是需要考虑的。

ForEach数据加载,我们只考虑数据源的变化即可,但在LazyForEach中,必须使用DataChangeListener对象来进行更新,需要我们创建新的对象,实现IDataSource,进行数据的增删改查。

/*** AUTHOR:AbnerMing* DATE:2024/2/23* INTRODUCE:懒加载数据* */
export class BannerDataSource implements IDataSource {private listeners: DataChangeListener[] = []private originDataArray: Object[] = []/*** AUTHOR:AbnerMing* INTRODUCE:返回列表数量* */totalCount(): number {return this.originDataArray.length}/*** AUTHOR:AbnerMing* INTRODUCE:返回某一个对象* */getData(index: number): Object {return [this.originDataArray[index]]}/*** AUTHOR:AbnerMing* INTRODUCE:该方法为框架侧调用,为LazyForEach组件向其数据源处添加listener监听* */registerDataChangeListener(listener: DataChangeListener): void {if (this.listeners.indexOf(listener) < 0) {this.listeners.push(listener);}}/*** AUTHOR:AbnerMing* INTRODUCE:该方法为框架侧调用,为对应的LazyForEach组件在数据源处去除listener监听* */unregisterDataChangeListener(listener: DataChangeListener): void {const pos = this.listeners.indexOf(listener);if (pos >= 0) {this.listeners.splice(pos, 1);}}// 通知LazyForEach组件需要重载所有子组件notifyDataReload(): void {this.listeners.forEach(listener => {listener.onDataReloaded();})}// 通知LazyForEach组件需要在index对应索引处添加子组件notifyDataAdd(index: number): void {this.listeners.forEach(listener => {listener.onDataAdd(index);})}// 通知LazyForEach组件在index对应索引处数据有变化,需要重建该子组件notifyDataChange(index: number): void {this.listeners.forEach(listener => {listener.onDataChange(index);})}// 通知LazyForEach组件需要在index对应索引处删除该子组件notifyDataDelete(index: number): void {this.listeners.forEach(listener => {listener.onDataDelete(index);})}// 通知LazyForEach组件将from索引和to索引处的子组件进行交换notifyDataMove(from: number, to: number): void {this.listeners.forEach(listener => {listener.onDataMove(from, to);})}//初始化数据public addData(index: number, data: Object): void {this.originDataArray.splice(index, 0, data);this.notifyDataAdd(index);}//追加数据public pushData(data: Object): void {this.originDataArray.push(data);this.notifyDataAdd(this.originDataArray.length - 1);}//删除数据public deleteData(index: number): void {this.originDataArray.splice(index, 1);this.notifyDataDelete(index);}//交换数据public moveData(from: number, to: number): void {let temp: Object = this.originDataArray[from];this.originDataArray[from] = this.originDataArray[to];this.originDataArray[to] = temp;this.notifyDataMove(from, to);}/*** AUTHOR:AbnerMing* INTRODUCE:改变单个数据* */public changeData(index: number, data: Object): void {this.originDataArray.splice(index, 1, data);this.notifyDataChange(index);}//重置所有子组件的index索引public reloadData(): void {this.notifyDataReload();}}

对于以上封装之后,在使用上需要注意,也就是更新数据的时候:

声明变量:

 @State bannerDataSource: BannerDataSource = new BannerDataSource()

赋值变量:

Banner({data: ["1", "2", "3", "4", "5", "6"],itemPage: this.itemPage,onLazyDataSource: (dataSource: BannerDataSource) => {this.bannerDataSource=dataSource}})

行为操作:

this.bannerDataSource.pushData()//追加数据
this.bannerDataSource.deleteData()//删除数据

三、开源地址

在开源地址中,对各个案例的使用方式,也做了相信的介绍。

https://ohpm.openharmony.cn/#/cn/detail/@abner%2Fbanner

四、相关总结

目前的轮播图,仅仅对Swiper做了简单的封装,另外增加了一个线条指示器,这远远是不够的,毕竟日常的轮播图形式多种多样,指示器也是千奇百怪,后续也会在此基础之上进行不断的扩展。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/781863.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

每日一题(反转链表)

给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 206. 反转链表 - 力扣&#xff08;LeetCode&#xff09; 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1] 思路一 运用迭代的算法&#xff0c;把头指针…

【智能算法】晶体结构算法(CryStAl)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2021年&#xff0c;S Talatahari等人受到晶体自然结构启发&#xff0c;提出了晶体构造算法&#xff08;Crystal Structure Algorithm , CryStAl&#xff09;。 2.算法原理 2.1算法思想 CryStAl受…

Unity Mobile Notifications推送问题

1.在部分机型点击通知弹窗进不去游戏 把这里改成自己的Activity 2.推送的时候没有横幅跟icon红点 主要是第一句话 注册的时候选项可以选择 defaultNotificationChannel new AndroidNotificationChannel(“default_channel”, “Default Channel”, “For Generic notifica…

一文教你如何轻松领取阿里云优惠券

随着云计算技术的飞速发展&#xff0c;越来越多的企业和个人选择使用阿里云作为他们的云服务提供商。为了吸引更多的用户上云&#xff0c;阿里云推出了各种优惠券和促销活动。本文将教大家如何轻松领取阿里云优惠券&#xff0c;以便在购买阿里云产品和服务时享受更多优惠。 一、…

WinServer启用Hyper-V新建虚拟机没有网络、无法开启增强模式、开启远程连接功能

没有网络问题如下&#xff1a; 原因&#xff1a;没有在Hyper-V中新增交换机 操作—虚拟交换机管理器—新建虚拟网络交换机-外部-允许管理员操作系统共享此网络适配器 无法开启增强模式&#xff1a; 开启远程连接功能 或者&#xff1a;

C++:你真的了解匿名对象的生命周期吗?

初步了解匿名对象生命周期 1. 提出问题2. 模拟验证3. 得出结论 不知道有没有人和我一样&#xff0c;在vector的模拟实现部分对于resize接口的实现有一些疑问。 void resize(size_t n , const T& val T()) {if (n > size()){reserve(n);for (size_t i size(); i <…

Kafka开发实录

前言 最近我总是在做大胆的事情&#xff0c;莫不是少年也需要冲冲冲&#xff0c;明明我不是这样的人啊&#xff0c;难不成这就是命运&#xff0c;来自命运石之门的选择&#xff01;废话不多说&#xff0c;本次是Kafka的实战篇&#xff0c;为什么这篇这么快呢&#xff1f;看了开…

golang 在多线程中避免 CPU 指令重排

发布日期&#xff1a;2024-03-26 16:29:39 起因 golang 的发明初衷便是多线程&#xff0c;是一门专门用于多线程高并发的编程语言。其独创的 GMP 模型在多线程的开发上提供了很大的便利。 现代计算机基本上都是多核 CPU 的结构。CPU 在进行指令运行的时候&#xff0c;为了提高…

基于Python的Selenium详细教程

一、PyCharm安装配置Selenium 本文使用环境&#xff1a;windows11、Python 3.10.5、PyCharm 2022.1.3、Selenium 4.3.0 需要你懂的技术&#xff1a;Python、HTML、CSS、JavaScript 1.Seleium安装&#xff1a; 在PyCharm终端或window命令窗口输入以下命令 #查看已安装的Pytho…

EMD关于信号的重建,心率提取

关于EMD的俩个假设&#xff1a; IMF 有两个假设条件&#xff1a; 在整个数据段内&#xff0c;极值点的个数和过零点的个数必须相等或相差最多不能超过一 个&#xff1b;在任意时刻&#xff0c;由局部极大值点形成的上包络线和由局部极小值点形成的下包络线 的平均值为零&#x…

大话设计模式之工厂模式

工厂模式&#xff08;Factory Pattern&#xff09;是一种创建型设计模式&#xff0c;它提供了一种创建对象的最佳方式&#xff0c;而无需指定将要创建的对象的确切类。通过使用工厂模式&#xff0c;我们可以将对象的创建和使用分离&#xff0c;从而使代码更具灵活性和可维护性。…

酒店能源监测管理系统:实现节能减排与提升管理效率的利器

随着全球能源问题的日益突出和可持续发展理念的深入人心&#xff0c;酒店业也在积极探索节能减排的途径。在这一背景下&#xff0c;酒店能源监测管理系统应运而生&#xff0c;成为了酒店行业提升管理效率、降低能源消耗的重要工具。本文将从多个角度介绍酒店能源监测管理系统的…

第十五届蓝桥杯模拟考试II_物联网设计

反思&#xff1a; 本次模拟让我惊醒&#xff0c;写这个作品如同搭积木&#xff0c;在拼接的时候都要仔细检查这个积木是否出bug,确保没有问题再将其拼接到之前搭好的大模块之中&#xff0c;因为就是这样的题目我在处理过程中就遇到了BUG&#xff0c;原因竟出在输入模式要上拉&…

Android 自定义坐标曲线图(二)

Android 自定义坐标曲线图_android 自定义曲线图-CSDN博客 继上一篇文章&#xff0c;点击折线图上的点&#xff0c;显示提示信息进行修改&#xff0c;之前通过回调&#xff0c;调用外部方法&#xff0c;使用popupwindow或dialog来显示&#xff0c;但是这种方法对于弹框显示的位…

电子产品说明书是什么?要怎么才能制作?

电子产品令人着迷&#xff0c;尤其是最新的技术&#xff0c;这就是为什么市场上充斥着各式各样的电子产品。然而&#xff0c;随着电子产品变得越来越复杂&#xff0c;如何正确、安全地使用它们变得越来越重要。这就涉及到了电子产品说明书的具体内容和如何制作。 电子产品说明书…

Thread常用的方法及线程状态原因解析

温馨提示&#xff1a;PC端观看&#xff0c;效果更佳&#xff01; 本文两大部分&#xff1a;介绍一些Thread线程常用的方法&#xff0c;和解析线程的六大状态&#xff01; 目录 一、线程常用的方法 介绍Thread类 1.开启线程 2.获取线程引用 3.休眠线程 4.中断线程 3.等待…

【ERP原理与应用】用友U8实验

实验一、系统管理与基础设置 实验内容&#xff1a; 一、核算体系的建立 好友软件公司是一家软件制造和系统集成企业&#xff0c;其产品面向国内外市场&#xff0c;自 2019 年 3 月公司开始使用 ERP 软件管理业务。软件操作员有三位&#xff0c;黄红是账套 主管&#xff0c;张…

mysql进阶知识总结

1.存储引擎 1.1MySQL体系结构 1).连接层 最上层是一些客户端和链接服务&#xff0c;包含本地sock通信和大多数基于客户端/服务端工具实现的类似于TCP/IP的通信。主要完成一些类似于连接处理、授权认证、及相关的安全方案。在该层上引入了线程池的概念&#xff0c;为通过认证…

机器学习基础——模型评估与选择(部分)

目录 一、前言&#xff1a;误差与拟合 &#xff08;一&#xff09;经验误差 &#xff08;二&#xff09;过拟合、欠拟合 二、评估方法 &#xff08;一&#xff09;评估总体的思路 &#xff08;二&#xff09;如何划分训练集和测试集 1.留出法 2.k折交叉验证 3.自助法 …

代码学习记录31---动态规划开始

随想录日记part31 t i m e &#xff1a; time&#xff1a; time&#xff1a; 2024.03.29 主要内容&#xff1a;今天开始要学习动态规划的相关知识了&#xff0c;今天的内容主要涉及四个方面&#xff1a; 理论基础 ; 斐波那契数 ;爬楼梯 ;使用最小花费爬楼梯。 理论基础 509. 斐…