HarmonyOS Next系列之水波纹动画特效实现(十三)

系列文章目录

HarmonyOS Next 系列之省市区弹窗选择器实现(一)
HarmonyOS Next 系列之验证码输入组件实现(二)
HarmonyOS Next 系列之底部标签栏TabBar实现(三)
HarmonyOS Next 系列之HTTP请求封装和Token持久化存储(四)
HarmonyOS Next 系列之从手机选择图片或拍照上传功能实现(五)
HarmonyOS Next 系列之可移动悬浮按钮实现(六)
HarmonyOS Next 系列之沉浸式状态实现的多种方式(七)
HarmonyOS Next系列之Echarts图表组件(折线图、柱状图、饼图等)实现(八)
HarmonyOS Next系列之地图组件(Map Kit)使用(九)
HarmonyOS Next系列之半圆环进度条实现(十)
HarmonyOS Next 系列之列表下拉刷新和触底加载更多数据实现(十一)
HarmonyOS Next系列之实现一个左右露出中间大两边小带缩放动画的轮播图(十二)
HarmonyOS Next系列之水波纹动画特效实现(十三)


文章目录

  • 系列文章目录
  • 前言
  • 一、实现原理
  • 二、显式动画 (animateTo)使用回顾
    • 入参
  • 三、代码实现
    • 示例一:
    • 示例二:


前言

HarmonyOS Next(基于API12)实现水波纹动画特效。

请添加图片描述


一、实现原理

画3个等比例放大的圆形,通过显示动画animateTo动态改变圆形放大系数和透明度

二、显式动画 (animateTo)使用回顾

animateTo显式动画接口来指定由于闭包代码导致的状态变化插入过渡动效。同属性动画,布局类改变宽高的动画,内容都是直接到终点状态

入参

animateTo(value: AnimateParam, event: () => void): void
在这里插入图片描述
说明:
value 设置动画参数例如动画时长、动画速度、动画延迟等。
event:回调函数,指定组件最终状态,动画将从初始态到最终态自动插入过度动画


AnimateParam常用属性:

名称类型说明
durationnumber动画持续时长,单位ms
curveCurve Curve9+ string动画曲线默认值Curve.EaseInOut
delaynumber动画延迟执行时间单位ms
iterationsnumber动画播放次数,默认播放一次,设置为-1时表示无限次播放。设置为0时表示无动画效果
playModePlayMode动画播放模式,默认播放完成后重头开始播放

显示动画需要有个触发点去调用animateTo(),绑定在哪个组件上就需要在当前组件的事件下调用animateTo()动画才能生效。
常见使用场景放置点击事件,不符合我们当前要实现的。实现水波纹动画需要组件渲染完自动触发动画,所以我们可以考虑放在组件的onAppear事件上,onAppear为组件挂载显示后触发此回调。

更多显式动画 (animateTo)使用请看官方文档

三、代码实现

示例一:

图标水波纹动画特效:

@Entry
@Component
struct Demo {@State scaleList: number[] = [] //缩放比例数据@State opacityList: number[] = [] //透明度数据private cloneScaleList: number[] = [] //备份初始缩放比例数据private cloneOpacityList: number[] = [] //备份初始透明度数据private scaleRatio:number=0.7 //缩放增大比例aboutToAppear(): void {//初始化缩放比例和透明度,新建数组保存3个圆形对应数据 //缩放比例:[1,1.7,2.4]  透明度:[0.3,0.2,0.1]this.scaleList = new Array(3).fill('').map((item: string, index: number) => 1 + index * this.scaleRatio)this.opacityList = new Array(3).fill('').map((item: string, index: number) => (3 - index)/10 )this.cloneScaleList = this.scaleList.slice()this.cloneOpacityList = this.opacityList.slice()}build() {Column({ space: 50 }) {Stack() {ForEach(this.scaleList, (item: number, index: number) => {Column() {}.width(50).height(50).borderRadius(25).backgroundColor('#1463F4').opacity(this.opacityList[index]).scale({ x: this.scaleList[index], y: this.scaleList[index] }).onAppear(() => {animateTo({ duration: 1200, iterations: -1 }, () => {//每个圆缩放系数+0.7this.scaleList[index] = this.cloneScaleList[index] + this.scaleRatio//每个圆透明度-0.1this.opacityList[index] = this.cloneOpacityList[index] -  0.1})})}, (item: number, index: number) => index.toString())Image($r('app.media.app_icon')).width(50).borderRadius(25)}}.height('100%').width('100%').justifyContent(FlexAlign.Center).alignItems(HorizontalAlign.Center)}
}

运行效果:
请添加图片描述

说明:初始化新建了3个圆形,通过变量scaleList保存了3个圆初始缩放比例为 [1,1.7,2.4],通过变量opacityList保存了初始透明度为[0.3,0.2,0.1],在每个圆的渲染完成回调函数onAppear中调用显示动画把每个圆增大0.7倍,变成[1.7,2.4,3.1],同时透明度减0.1,变成[0.2,0.1,0],动画属性设置iterations: -1循环播放,就形成了水波纹动画效果。

示例二:

按钮水波纹特效:

@Entry
@Component
struct Demo {@State scaleList: number[] = [] //缩放比例数据@State opacityList: number[] = [] //透明度数据private cloneScaleList: number[] = [] //备份初始缩放比例数据private cloneOpacityList: number[] = [] //备份初始透明度数据private scaleRatio: number = 0.3 //缩放增大比例aboutToAppear(): void {//初始化缩放比例和透明度this.scaleList = new Array(2).fill('').map((item: string, index: number) => 1 + index * this.scaleRatio)this.opacityList = new Array(2).fill('').map((item: string, index: number) => 0.3-index*0.15)this.cloneScaleList = this.scaleList.slice()this.cloneOpacityList = this.opacityList.slice()}build() {Column({ space: 50 }) {Stack() {ForEach(this.scaleList, (item: number, index: number) => {Column() {}.width(120).height(50).borderRadius(25).backgroundColor('#007DFE').opacity(this.opacityList[index]).scale({ x: this.scaleList[index], y: this.scaleList[index] }).onAppear(() => {animateTo({ duration: 1000, iterations: -1 }, () => {this.scaleList[index] = this.cloneScaleList[index] + this.scaleRatiothis.opacityList[index] = this.cloneOpacityList[index] - 0.15})})}, (item: number, index: number) => index.toString())Button('提交', { type: ButtonType.Capsule }).width(120).height(50).borderRadius(25)}}.height('100%').width('100%').justifyContent(FlexAlign.Center).alignItems(HorizontalAlign.Center)}
}

运行效果:
请添加图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Webpack 打包后文件过大,如何优化?

聚沙成塔每天进步一点点 本文回顾 ⭐ 专栏简介Webpack 打包后文件过大,如何优化?1. 代码分割(Code Splitting)1.1 概念1.2 Webpack 的 SplitChunksPlugin示例配置: 1.3 按需加载(Lazy Loading)示…

【无人机设计与技术】四旋翼无人机的建模

摘要 本项目的目标是通过 Simulink 建模和仿真,研究四旋翼无人机的建模、姿态控制、定点位置控制及航点规划功能。无人机建模包含了动力单元模型、控制效率模型和刚体模型,并运用这些模型实现了姿态控制和位置控制。姿态控制为无人机的平稳飞行提供基础…

字体文件压缩

技术点 npm、html、font-spider 实现原理 个人理解:先引入原先字体,然后重置字符为空,根据你自己填充文字、字符等重新生成字体文件,因此在引入的时候务必添加自己使用的文字、字符等!!! 实…

高校体育场小程序|高校体育场管理系统系统|体育场管理系统小程序设计与实现(源码+数据库+文档)

高校体育场管理系统小程序 目录 体育场管理系统小程序设计与实现 一、前言 二、系统功能设计 三、系统实现 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌️大厂码农|毕设布道…

ClickHouse入库时间与实际相差8小时问题

原因一&#xff1a;服务端未修改默认时区 解决方案&#xff1a; 1、找 ClickHouse 配置文件 config.xml&#xff0c;通常位于 /etc/clickhouse-server/ 目录。 2、编辑 config.xml 文件&#xff0c;找到 <timezone> 标签。如果标签不存在&#xff0c;需要手动添…

unity一键注释日志和反注释日志

开发背景&#xff1a;游戏中日志也是很大的开销&#xff0c;虽然有些日志不打印但是毕竟有字符串的开销&#xff0c;甚至有字符串拼接的开销&#xff0c;有些还有装箱和拆箱的开销&#xff0c;比如Debug.Log(1) 这种 因此需要注释掉&#xff0c;当然还需要提供反注释的功能&am…

避免学术欺诈!在ChatGPT帮助下实现严格引用并避免抄袭

学境思源&#xff0c;一键生成论文初稿&#xff1a; AcademicIdeas - 学境思源AI论文写作 当今的学术环境中&#xff0c;保持学术诚信至关重要。随着ChatGPT等技术的发展&#xff0c;写作变得更加高效&#xff0c;但也增加了不当使用的风险。严格的引用和避免抄袭不仅是学术道…

C++基础---类和对象(上)

1.类的定义 C程序设计允许程序员使用类&#xff08;class&#xff09;定义特定程序中的数据类型。这些数据类型的实例被称为对象 &#xff0c;这些实例可以包含程序员定义的成员变量、常量、成员函数&#xff0c;以及重载的运算符。语法上&#xff0c;类似C中结构体&#xff0…

Jmeter常用函数、逻辑控制器

目录 一、Jmeter常用函数 counter函数 machineName函数 machineIP函数 Random函数 RandomString函数 RandomDate函数 time函数 二、逻辑控制器 IF控制器 循环控制器 foreach控制器 仅一次控制器 事务控制器 聚合报告 随机控制器 随机顺序控制器 一、Jmeter常用…

趣味运动会分组记分指南

团队比赛时如何记分&#xff1f; 趣味运动会的组织过程中&#xff0c;分组和记分是两个关键环节。云分组小程序提供了一个高效的解决方案&#xff0c;无论是随机分组还是内定分组&#xff0c;都能轻松实现。系统还能自动统计积分和排名&#xff0c;极大简化了组织者的工作。 分…

如何在Python中计算移动平均值?

在这篇文章中&#xff0c;我们将看到如何在Python中计算移动平均值。移动平均是指总观测值集合中固定大小子集的一系列平均值。它也被称为滚动平均。 考虑n个观测值的集合&#xff0c;k是用于确定任何时间t的平均值的窗口的大小。然后&#xff0c;移动平均列表通过最初取当前窗…

Android Studio | 无法识别Icons.Default.Spa中的Spa

编写底部导航栏&#xff0c;涉及到Spa部分出现报红&#xff1a; 解决办法&#xff1a;在build.gradle.kts中引入图标依赖 dependencies {implementation "androidx.compose.material:material-icons-extended:<version>" }

Linux相关概念和重要知识点(9)(父进程、子进程、进程状态)

1.父进程、子进程 &#xff08;1&#xff09;父进程 CLI本质上是一款命令行界面的软件&#xff0c;是用户调用接口层面的程序&#xff08;上层&#xff0c;可以和系统调用接口做沟通&#xff09;&#xff0c;CLI和GUI是同级别的。用户的操作都是建立在CLI和GUI之上的。 但是…

SPI驱动OLED

OLED像素发光原理 OLED-有机发光半导体&#xff0c;在有机高分子聚合物的两端施加电压可发光,LED基于金属硅片发光&#xff0c;而OLED可以附于玻璃、塑料&#xff0c;可以用OLED做出曲面屏折叠屏&#xff0c;不同于LCD&#xff0c;OLED没有背光板&#xff0c;每个像素可以独立…

墙绘产品展示:基于SpringBoot的解决方案

5 系统实现 系统实现部分就是将系统分析&#xff0c;系统设计部分的内容通过编码进行功能实现&#xff0c;以一个实际应用系统的形式展示系统分析与系统设计的结果。前面提到的系统分析&#xff0c;系统设计最主要还是进行功能&#xff0c;系统操作逻辑的设计&#xff0c;也包括…

scrapy 爬取微博(五)【最新超详细解析】: 爬取微博文章

1 读取配置参数 爬取微博文章首先需要读取settings.py中的设置的配置变量&#xff0c;然后编写爬虫&#xff0c;读取的配置变量主要有爬取的关键词、时间范围、爬取区域等。 class WeiboSearchSpider(scrapy.Spider):name weibo_searchallowed_domains [weibo.com]settings…

记一次J1900主板短路报废

记一次J1900主板短路报废 一、主板样貌 J1900的CPU&#xff0c;板载4GB内存&#xff0c;64GB固态&#xff0c;双千M&#xff0c;又HDMI。就是这个电源线&#xff0c;右上角是用线连接的。 二、缘由 前两天接了一个转接板&#xff0c;为了给新增的机械硬盘供电。上午刚测试…

演讲干货整理:泛能网能碳产业智能平台基于 TDengine 的升级之路

在 7 月 26 日的 TDengine 用户大会上&#xff0c;新奥数能 / 物联和数据技术召集人袁文科进行了题为《基于新一代时序数据库 TDengine 助力泛能网能碳产业智能平台底座升级》的主题演讲。他从泛能网能碳产业智能平台的业务及架构痛点出发&#xff0c;详细分享了在数据库选型、…

【最新华为OD机试E卷-支持在线评测】字符串分割转换(100分)多语言题解-(Python/C/JavaScript/Java/Cpp)

🍭 大家好这里是春秋招笔试突围 ,一枚热爱算法的程序员 💻 ACM金牌🏅️团队 | 大厂实习经历 | 多年算法竞赛经历 ✨ 本系列打算持续跟新华为OD-E/D卷的多语言AC题解 🧩 大部分包含 Python / C / Javascript / Java / Cpp 多语言代码 👏 感谢大家的订阅➕ 和 喜欢�…

Flux 最新最快ControlNet模型现身:法线贴图详细测评

原文链接&#xff1a;Flux目前最快ControlNet模型现身&#xff01;法线贴图详细测评 (chinaz.com) Flux目前最快ControlNet模型现身&#xff01; 上周一个名叫JasperAI的团队开源了他们的 3 款Flux ControlNet&#xff0c;分别是法线贴图&#xff0c;深度&#xff0c;和升频器…