鸿蒙开发:自定义切换动画实现Swiper层叠滑动效果

article/2025/8/21 22:51:27

前言

本文基于Api13

Swiper组件默认情况下是无论是从左往右,还是从右往左,都是平移滑动,效果如下:

以上的效果是最常见的,基本上都够满足大部分的场景需求,也是很多主流App首选效果,但是,仍然有一部分需求,会不按常理出牌,这不,让实现一个层叠滑动的效果就来了,所谓的层叠,就是,在滑动条目的时候,上一个不动,下一个覆盖到上一个的上面进行滑动,为了更好的便于大家理解,简单的做一个小动画,模拟演示一下。

正常的平移滑动效果,两个条目会一起进行平移。

层叠效果滑动,可以看到,上一个条目是不会跟随移动的。

那么如何实现上一个条目不随着手势进行移动呢?这里就需要用到自定义页面切换动画了,也就是在手势滑动的时候,保持当前条目不动,让下一个条目进行移动,还有一点需要注意的是,那就是需要设置组件的堆叠顺序,使其要滑动的组件层级高于前一个组件。

实现之前,我们先了解一下自定义Swiper页面切换动画customContentTransition。

 

customContentTransition

customContentTransition是Swiper组件中的一个属性,主要用于页面切换动画,接收一个SwiperContentAnimatedTransition参数;它的作用,主要在于,在页面随着手势进行切换动画的过程中,会对视窗内所有页面进行逐帧触发回调,在这个回调中,我们就可以针对条目进行设置透明度、缩放比例、位移等属性来自定义切换动画。

 /*** Custom swiper content transition animation.** @param { SwiperContentAnimatedTransition } transition - custom content transition animation.* @returns { SwiperAttribute } the attribute of the swiper.* @syscap SystemCapability.ArkUI.ArkUI.Full* @crossplatform* @atomicservice* @since 12*/customContentTransition(transition: SwiperContentAnimatedTransition): SwiperAttribute;

有一点需要注意的是,customContentTransition是自定义切换动画,但不会取消原有的动画,也就是说,我们在自定义动画的时候,原有的动画也是同步的执行的,为了让原有的动画不执行,我们可以设置主轴方向上负的位移(translate属性)来抵消页面滑动,这也是我们这个需求的主要实现方式。

准备数据

通过前边,我们已经知道,要实现前言中的需求,我们需要做的有两个动作,动作一,动态修改子元素的位移,我们可以通过translate属性来控制,动作二,动态改变子元素的层级权重,通过属性zIndex来设置。

基本UI如下,当然了,这只是一个简单的Demo案例,实际开发中,属性以及数据设置,要根据实际情况而定。

Swiper() {ForEach(this.backgroundColors, (backgroundColor: Color, index: number) => {Text(index.toString()).width("100%").height("100%").backgroundColor(backgroundColor).textAlign(TextAlign.Center).translate({ x: this.translateList[index] }).zIndex(this.zIndexList[index])})}.height(200)

以上的案例,我简单定义了三个数组,一个用于数据加载的backgroundColors,一个用于位移的translateList,最后一个是用于设置层级权重的zIndexList。

实现自定义切换动画

实现这个层叠滑动,实现customContentTransition方法之前,有一点需要知道,那就是我们目前是往左滑动还是往右滑动,因为在最后一个条目节点需要做特殊的逻辑判断,往左还是往右,我们可以通过onGestureSwipe方法中偏移量进行判断。

extraInfo.currentOffset小于0,往左,否则往右。

.onGestureSwipe((_: number, extraInfo: SwiperAnimationEvent) => {let currentOffset = extraInfo.currentOffsetthis.isScrollLeft = currentOffset < 0})

在customContentTransition方法中,我们正常执行滑动抵消即可,首先是在同组页面往左滑或往右完全滑出视窗外时,我们需要重置属性值,这是非常重要的。

如何把当前的滑动进行抵消呢,很简单,当往左滑动时,使用页面在主轴方向上的长度减去移动比例乘以主轴长度即可,代码如下:viewIndex是当前的索引。

  this.translateList[viewIndex] = proxy.mainAxisLength - proxy.position * proxy.mainAxisLength

往右滑动,直接负的移动比例乘以主轴长度,代码如下:

this.translateList[proxy.index] = -(proxy.position) * proxy.mainAxisLength

整个切换动画代码如下,在往左滑动的过程中,由于最后一个,需要动态切换为第一个索引,所以这里做了单独的逻辑处理。

.customContentTransition({timeout: 0,transition: (proxy: SwiperContentTransitionProxy) => {if (proxy.position <= 0 || proxy.position >= 1) {if (this.isScrollLeft) {if (proxy.index != this.translateList.length - 1) {this.translateList[proxy.index+1] = 0.0this.zIndexList[proxy.index+1] = 0}} else {this.translateList[proxy.index] = 0.0this.zIndexList[proxy.index] = 0}} else {if (this.isScrollLeft) {let viewIndex = proxy.index - 1if (viewIndex == -1) {this.translateList[this.translateList.length-1] =proxy.mainAxisLength - proxy.position * proxy.mainAxisLengththis.translateList[0] = 0this.zIndexList[0] = 1} else {this.translateList[viewIndex] = proxy.mainAxisLength - proxy.position * proxy.mainAxisLengththis.zIndexList[viewIndex] = -1}} else {this.translateList[proxy.index] = -(proxy.position) * proxy.mainAxisLengththis.zIndexList[proxy.index] = -1}}}})

通过以上的代码,一个层叠滑动效果就实现了,我们一起来看下最终的效果:

相关总结

customContentTransition不仅仅可以实现平移上的改变,很多的效果,我们都可以实现,比如放大缩小,旋转等等。

本文标签:HarmonyOS/ArkUI


http://www.hkcw.cn/article/tuYnUKEpev.shtml

相关文章

宇树科技股改为IPO上市铺路,并新增北京国资董事 迈向资本市场新阶段

智能机器人公司宇树科技完成了股改,为IPO上市做准备。5月29日晚,宇树科技宣布因公司发展需要,杭州宇树科技有限公司名称变更为“杭州宇树科技股份有限公司”。原公司的所有业务和合同将继续由新公司名称经营并有效。国家企业信用信息公示系统显示,该变更在5月28日完成。此外…

NLP学习路线图(十一):词干提取与词形还原

引言&#xff1a;文本预处理的必要性 在自然语言处理&#xff08;NLP&#xff09;任务中&#xff0c;原始文本数据往往包含大量噪声和冗余信息。例如&#xff0c;单词的时态变化&#xff08;“running”与“ran”&#xff09;、复数形式&#xff08;“cats”与“cat”&#xf…

多人目击野猪闯进学校小区 意外访客引发关注

5月28日,杭州山水人家小区闯进了一只野猪。据网友称,这只野猪是从小区北门进入的,在小区里乱转了很久。中午时分,几名执勤的小区保安证实了这一情况。他们表示,早上8点多,确实有一头野猪从小区北门旁边的花坛窜出来,随后跑进了小区。物业办公室的工作人员也确认了此事,…

One Year~

入局 作为科班学生&#xff0c;没事就在CSDN闲逛&#xff0c;只作为旁观者的身份去体会别人的好文。当时也没想着说去自己写一些博客记录学习过程。相信大多数同学和我有一样的心理。 但在看鱼皮哥的课程时&#xff0c;发现他有着写文档和博客的习惯&#xff0c;整理自己的思路…

SL3038 宽耐压150V降压12V2.5A、5V2.5A降压恒压电源芯片

在工业自动化、智能交通和消费电子领域&#xff0c;电源管理的稳定性与效率始终是核心挑战。SL3038 作为一款专为高电压场景设计的开关降压型 DC-DC 控制器&#xff0c;凭借其150V 宽输入耐压、双路精准输出及多重安全防护特性&#xff0c;重新定义了电源芯片的性能标杆。 核心…

Docker 本地化部署FireCrawl

1.FireCrawl 本地化部署教程 &#xff08;1&#xff09;Step1&#xff1a;已经安装Docker 和 Docker Compose。 &#xff08;2&#xff09;Step2&#xff1a;克隆 FireCrawl 项目到本地指定目录下 git clone https://github.com/mendableai/firecrawl.gitcd firecrawlcd ap…

如何将图像插入 PDF:最佳工具比较

无论您是编辑营销材料、写报告还是改写原来的PDF文件&#xff0c;将图像插入 PDF 都至关重要。幸运的是&#xff0c;有多种在线和离线工具可以简化此任务。在本文中&#xff0c;我们将比较一些常用的 PDF 添加图像工具&#xff0c;并根据您的使用场景推荐最佳解决方案&#xff…

APM32微控制器键盘PCB设计实战教程

APM32微控制器键盘PCB设计实战教程&#xff08;第2期&#xff09; 一、APM32小系统介绍 使用apm32键盘小系统开源工程操作 APM32是一款与STM32兼容的微控制器&#xff0c;可以直接替代STM32进行使用。本教程基于之前开源的APM32小系统&#xff0c;链接将放在录播评论区中供大…

AI 工具赋能并列图制作:从数据输入到可视化的零门槛流程

在数据驱动决策的时代&#xff0c;将复杂的数据转化为直观、易懂的可视化图表至关重要。并列图作为一种常用的数据可视化形式&#xff0c;能够清晰地对比多组数据&#xff0c;助力人们快速洞察数据差异与趋势。过去&#xff0c;制作并列图往往需要掌握专业软件&#xff0c;如 E…

高精度、高效率:正面吊箱号识别系统如何实现精准识别

在现代港口和物流管理中&#xff0c;集装箱号码的快速准确识别是提升运营效率的核心环节。基于先进的OCRAI技术的正面吊箱号识别系统&#xff0c;能够实现99%以上的识别准确率&#xff0c;平均识别时间仅需20毫秒&#xff0c;为港口自动化管理提供了强有力的技术支撑。那么&…

记者暗访神药骗局黑色产业链 揭露“包治百病”谎言

记者暗访神药骗局黑色产业链揭露“包治百病”谎言!近日,有网友反映一款名为“AKG”的产品被宣传为能治愈各种疾病,包括癌症和尿毒症等重症。该产品还承诺通过发展下线可实现年收入3000万元。有直肠癌晚期患者每天服用“AKG”6至8片。为了调查这一现象,记者前往青岛、南宁等…

嵌入式软件--stm32 DAY 8.5 基础复习总结

1.时钟树 在数据手册里面&#xff0c;有一张密密麻麻的图&#xff0c;正是时钟系统里的时钟树。 对于时钟&#xff0c;我们注意有两点。一个是系统时钟SYSCLK,一个是依赖外部晶振生成的RTC. RTC以外部低速晶振作为时钟源或者外部高速晶振128分频后作为时钟源&#xff0c;又或者…

Astra学习之-如何修改Header-logo和favicon图标

Astra学习之修改Header-logo 上傳網站圖示會使用佈景主題的訂定來設計&#xff0c;所以不同主題的「網站圖示」位置也會不同。 以下我使用「Astra 佈景主題」來做示範&#xff1a; 點選上方「自訂」點選「網站識別」Site identify點選「選取網站圖示」在選取圖片&#xff0c…

成都鼎讯雷达模拟器,重塑电磁对抗新生态

在现代战争中&#xff0c;雷达作为 “电磁之眼”&#xff0c;左右着战场态势的感知与攻防节奏。而如何构建逼真的雷达干扰与目标环境&#xff0c;成为检验雷达性能、锤炼作战能力的关键。成都鼎讯依托前沿技术&#xff0c;重磅推出雷达目标与干扰模拟器&#xff0c;凭借强大的功…

cf2059B

原题链接&#xff1a;https://codeforces.com/contest/2059/problem/B 题目背景&#xff1a; 将一个长度为 n 的数组 a 划分为 k 个数组&#xff0c;再将所有偶数索引的数组合并成 b 数组&#xff0c;定义代价为 的最小索引 i &#xff0c;可得到的最小代价为多少。 思路&am…

DMBOK对比知识点对比(1)

1.CDGP各章活动 章节一级

4060显卡什么水平 4060显卡参数介绍

NVIDIA的GeForce RTX 40系列显卡基于最新的Ada Lovelace架构&#xff0c;提供了前所未有的图形处理能力和效率。其中&#xff0c;RTX 4060定位中高端市场&#xff0c;针对那些寻求卓越性能同时又注重成本效益的用户群体。那么&#xff0c;4060显卡什么水平呢&#xff1f;本文将…

4. Qt对话框(2)

在上节中已经学习了对话框的确认和取消&#xff0c;本节内容继续接上节完成登录对话框实例并得到登录信息。 本文部分ppt、视频截图原链接&#xff1a;[萌马工作室的个人空间-萌马工作室个人主页-哔哩哔哩视频] 1 实现登录对话框 1.1 功能需要 得到登录信息&#xff0c;需要…

第三节 独立按键模块

目录 一、独立按键介绍 二、C语言知识 1.C51数据运算 2.C51基本语句 三、程序设计 1、独立按键控制LED灯 2、独立按键控制LED状态 3、独立按键控制LED显示二进制 4、独立按键控制LED位移 一、独立按键介绍 轻触按键&#xff1a;相当于是一种电子开关&#xff0c;按…

财管2 - 财务预测(内含增长率,可持续增长率)

1.内含增长率 概念&#xff1a;内含增长率是没有可动用的金融资产&#xff0c;且外部融资为零时的销售增长率。 计算方法&#xff1a;根据外部融资销售增长比的公式&#xff0c;令外部融资额占销售增长百分比为0&#xff0c;求销售增长率即可 a) 融资总需求 预计销售收入的…