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

news2024/12/26 11:53:44

系列文章目录

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.7
              this.scaleList[index] = this.cloneScaleList[index] + this.scaleRatio
              //每个圆透明度-0.1
              this.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.scaleRatio
              this.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.coloradmin.cn/o/2179855.html

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

相关文章

基于ssm+vue的在线家用电器销售系统

摘要 本文介绍了一个基于SSM(SpringSpring MVCMyBatis)框架与Vue.js技术的在线家用电器销售系统。该系统旨在为用户提供便捷的家用电器购买体验,同时为商家提供一个高效的销售管理平台。系统前端采用Vue.js框架开发,实现了响应式布…

【制作自解压程序】使用7Z制作自解压程序

文章目录 1.前言2.准备压缩包3.准备7zSD.sfx文件4.准备config.txt5.合并文件6.完成 1.前言 自解压程序是利用压缩包制作一个类似于下载程序样式的文件,可以让用户直接点击使用,而不是解压以后去文件中找哪个是启动程序。 2.准备压缩包 首先&#xff0…

【U8+】安装用友U8+16.5后,应用服务管理中缺少加密服务。

【问题描述】 安装用友U8+后,应用服务管理中,没有加密服务。 导致软件无法登录到加密服务器。 【解决方法】 此问题多为CPU所影响: 1、深信服和霆智虚拟机需要开启HOST CPU选项。不开启此选项无法发挥CPU的全部功能,对U8和SQL Server的性能影响很大,所以在U8V16.5中要求开…

SOMEIP_ETS_142: SD_Request_non_existing_Major_Version

测试目的: 验证DUT能够拒绝一个请求不存在的主版本号的SubscribeEventgroup消息,并以SubscribeEventgroupNAck作为响应。 描述 本测试用例旨在确保DUT遵循SOME/IP协议,当接收到一个请求不存在主版本号的SubscribeEventgroup消息时&#xf…

828华为云征文|部署个人文档管理系统 Docspell

828华为云征文|部署个人文档管理系统 Docspell 一、Flexus云服务器X实例介绍二、Flexus云服务器X实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置2.4 Docker 环境搭建 三、Flexus云服务器X实例部署 Docspell3.1 Docspell 介绍3.2 Docspell 部署3.3 Docspell 使用…

PostgreSQL的学习心得和知识总结(一百五十二)|transaction_timeout:达到事务超时时终止会话

目录结构 注:提前言明 本文借鉴了以下博主、书籍或网站的内容,其列表如下: 1、参考书籍:《PostgreSQL数据库内核分析》 2、参考书籍:《数据库事务处理的艺术:事务管理与并发控制》 3、PostgreSQL数据库仓库…

影刀---如何进行自动化操作

本文不是广告,没有人给我宣传费,只是单纯的觉得这个软件很好用 感谢大家的多多支持哦 本文 1.基本概念与操作(非标准下拉框和上传下载)非标准对话框的操作上传对话框、下载的对话框、提示的对话框 2.综合案例3.找不到元素怎么办&a…

从AR眼镜到智能巡检:XR技术的演变与未来潜力

XR,即扩展现实(Extended Reality),是一个涵盖了增强现实(AR)、虚拟现实(VR)和混合现实(MR)的广泛概念。 从我们最初接触到的手机应用到Hololens,…

(作业)第三期书生·浦语大模型实战营(十一卷王场)--书生入门岛通关第1关Linux 基础知识

关卡任务 闯关任务需要在关键步骤中截图: 任务描述 完成所需时间 闯关任务 完成SSH连接与端口映射并运行hello_world.py 10min 可选任务 1 将Linux基础命令在开发机上完成一遍 10min 可选任务 2 使用 VSCODE 远程连接开发机并创建一个conda环境 10min 可选任务 3 创…

图片体积在线压缩神器 可自由设置图片的压缩大小 带完整的安装代码包以及搭建部署教程

系统概述 随着互联网的快速发展,图片作为网页内容的重要组成部分,其优化需求日益迫切。传统的图片压缩方法往往需要在牺牲一定质量的前提下减小体积,而“图片体积在线压缩神器”则致力于在保持图片质量的同时,实现体积的最小化。…

Arthas perfcounter(查看当前 JVM 的 Perf Counter 信息)

文章目录 二、命令列表2.1 jvm相关命令2.1.13 perfcounter(查看当前 JVM 的 Perf Counter 信息)举例1:查看当前 JVM 的 Perf Counter 信息举例2:可以用-d参数打印更多信息 本人其他相关文章链接 二、命令列表 2.1 jvm相关命令 2…

SpringCloud-pom创建Eureka

<?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 https://…

通过Ideal和gitbash共同实现分支合并

文章目录 背景描述&#xff1a;演示jy_20240704_develop分支同步到jy_dev分支方式一方式二 背景描述&#xff1a; 目前项目里有四个分支&#xff0c;分别是master、jy_20240704_develop、jy_dev、jy_qas。 其中master是主分支&#xff0c;其他三个分支都是根据master来创建的…

海陆钻井自动化作业机器人比例阀放大器

海陆钻井自动化作业机器人是现代海洋石油勘探与钻井领域的关键装备&#xff0c;它通过自动化和无人化技术显著提高了钻井效率和安全性。海陆钻井自动化作业机器人主要用于在海上和陆地的钻井平台上进行自动化、无人化的一体化作业。这种设备能够自动切换钻杆&#xff0c;极大地…

解决Ubuntu无法找到python3.7的包的问题 E: Couldn‘t find any package by glob ‘python3.7‘

该问题可能是由于默认的 Ubuntu 存储库中没有 Python 3.7 相关的包或系统配置的问题。可以尝试以下方法解决问题&#xff1a; 1. 使用 deadsnakes PPA 添加 Python 3.7 支持 deadsnakes PPA 是一个第三方存储库&#xff0c;提供多版本的 Python 支持&#xff0c;包括 Python …

外卖点餐小程序源码系统 单店多门店自助切换 带完整的安装代码包以及搭建部署教程

系统概述 本外卖点餐小程序源码系统旨在帮助餐饮企业和商家快速搭建一个功能完善的在线外卖平台。系统支持单店与多门店的灵活切换&#xff0c;方便商家根据自身业务需求进行管理和运营。同时&#xff0c;系统还提供了丰富的营销工具和数据分析功能&#xff0c;助力商家实现精…

管理层“建行化”弊端显现?增收不增利,海外业务亦“不争气”

撰稿|芋圆 曾经&#xff0c;上海银行&#xff08;SH:601229&#xff09;在城商行中无论是规模还是盈利均排在前位&#xff0c;仅次于北京银行&#xff08;SH:601169&#xff09;。而近些年&#xff0c;该行的增长态势大不如前&#xff0c;在城商行中的排位持续下滑&#xff0c…

unity3D雨雪等粒子特效不穿透房屋效果实现(粒子不穿透模型)

做项目有时候会做天气模拟,模拟雨雪天气等等。但是容易忽略一个问题,就是房屋内不应该下雨或者下雪,这样不就穿帮了嘛。 下面就粒子穿透物体问题做一个demo。 正常下雨下雪在室内的话,你可以看到,粒子是穿透建筑的。 那要怎么模拟真实的雨雪天气,不让粒子穿透房屋建筑呢…

pdf文档翻译成英文很简单?搞定复杂的外语文献文档就靠它

转眼间又是一年国庆&#xff0c;怎么样&#xff0c;大一新生们适应得还好吗&#xff1f; 没事&#xff0c;刚到陌生的校园环境中&#xff0c;分分钟都在想家&#xff0c;还没适应集体宿舍生活很正常的...... 什么&#xff1f;已经有同学在着手准备写论文了&#xff1f;而且需要…

诗画紫砂壶

大家详细解答一首网络上流传的顺口溜&#xff0c;其中包含了很多的紫砂壶型。 // 紫砂壶型 // 秦权汉瓦唐羽仙&#xff0c;西施文旦美人肩。 逸公德钟对却月&#xff0c;仿鼓虚扁望方山。东坡提梁卧井栏&#xff0c;供春提璧看柿圆。荷花海棠吹松段。掇只君乐奏合欢&#xff…