鸿蒙(HarmonyOS)ArkTS 实战: animateTo属性动画实现连续涟漪扩散

前言

前几日在使用华为手机和Mac传输文件时看到了鸿蒙星河互联的APP搜索动画觉得不错,正好这几日我一直在写动画相关的内容。不妨模仿一个试试。

星河互联动画效果

我做的动画效果

缺少有个好看的背景图+加上高斯模糊效果会更佳。

效果说明

  • 双光圈从中心平滑放大并逐渐淡出
  • 上一圈未消失,下一圈自动启动
  • 无限循环、无跳动、无断层、无闪烁
  • 原生属性动画,极低性能损耗
  • 圆角/居中/层叠布局

核心原理

整个涟漪动画分为 三层结构 + 双动画驱动

  1. 底层:Stack 层叠容器,保证所有元素居中
  2. 中层:两个相同的圆形波纹(负责扩散动画)
  3. 上层:提示文字(固定居中显示)

动画流程

  1. 波纹初始状态:缩放 0.0,透明度 1(完全显示)
  2. 执行动画:放大到 1.8 倍,同时透明度变为 0
  3. 第一个波纹动画立即启动,第二个波纹延迟延迟一半时间启动。这样就可以形成连续不间断的动画效果不会造成闪烁跳动。
  4. iterations: -1 无限循环
  5. Curve.EaseOut 缓动曲线,模拟真实物理扩散

完整代码实现

javascript 复制代码
@Entry
@Component
struct RippleAnimationPage {
  private  timeId:number|null = null

  @State scaleValue1: number = 0.0;
  @State opacityValue1: number = 1;

  @State scaleValue2: number = 0.0;
  @State opacityValue2: number = 1;
  
  aboutToDisappear(): void {
    if ( this.timeId !== null) {
      clearTimeout(this.timeId)
      this.timeId = null
    }
  }
  build() {
    Stack({ alignContent: Alignment.Center }) {
      // 波纹 1
      Circle()
        .stroke(Color.White)
        .strokeWidth(2)
        .fill('rgba(255,255,255,0.6)')
        .width(300)
        .height(300)
        .scale({ x: this.scaleValue1, y: this.scaleValue1 })
        .opacity(this.opacityValue1)

      // 波纹 2
      Circle()
        .stroke(Color.White)
        .strokeWidth(2)
        .fill('rgba(255,255,255,0.6)')
        .width(300)
        .height(300)
        .scale({ x: this.scaleValue2, y: this.scaleValue2 })
        .opacity(this.opacityValue2)

      Text("正在搜索设备...")
        .fontSize(18)
        .fontColor(Color.White)
    }
    .width('100%')
    .height('100%')
    .backgroundColor('#1F3A58')
    .onAppear(() => {
      // 第一个圈
    this.getUIContext()?.animateTo({
        duration: 2000,
        iterations: -1,
        curve: Curve.EaseOut
      }, () => {
        this.scaleValue1 = 1.8;
        this.opacityValue1 = 0;
      });

      // 第二个圈延迟一半形成连续交替
    this.timeId = setTimeout(() => {
        this.getUIContext()?.animateTo({
          duration: 2000,
          iterations: -1,
          curve: Curve.EaseOut
        }, () => {
          this.scaleValue2 = 1.8;
          this.opacityValue2 = 0;
        });
      }, 1000);
    })
  }
}

知识点解析

1. scale 缩放属性

  • scale({ x: 0.0, y: 0.0 }):光圈缩放到中心点(起始位置)
  • scale({ x: 1.8, y: 1.8 }):光圈放大 1.8 倍
  • 必须传入 x / y 双参数,保证等比缩放

2. opacity 透明度控制

  • 透明度从 10 平滑过渡
  • 配合缩放实现"扩散并消失"的视觉效果
  • 无闪烁、无突变,过渡极度自然

3. 双波纹延迟为什么重要?

  • 单波纹会出现"动画空档"
  • 第二个波纹延迟 1000ms(总时长的一半)
  • 实现上圈未消失、下圈已开始的连续流动感
  • 视觉上形成源源不断的涟漪效果

4. Curve.EaseOut 缓动曲线

  • 先快后慢,符合水波纹物理扩散规律
  • 比匀速线性动画更柔和、更高级
  • 是鸿蒙动画中最常用的自然动效曲线

扩展与优化

  1. 调整动画速度 :修改 duration(数值越大扩散越慢)
  2. 调整扩散范围 :修改 scale 目标值(1.5~2.0 最佳)
  3. 调整光圈颜色/透明度 :修改填充色 fill 颜色与 rgba 值
  4. 多场景适配:可用于搜索、配对、雷达
相关推荐
不爱吃糖的程序媛5 小时前
Flutter 三方库适配鸿蒙教程
flutter·华为·harmonyos
不羁的木木6 小时前
HarmonyOS文件基础服务(Core File Kit)实战演练04-文件监听与流式读写
华为·harmonyos
不羁的木木7 小时前
ArkWeb实战学习笔记05-综合实战:构建混合应用
笔记·学习·harmonyos
芒鸽8 小时前
鸿蒙应用测试实战:从单元测试到自动化测试
华为·单元测试·harmonyos
Davina_yu9 小时前
Hello HarmonyOS:搭建DevEco Studio开发环境与第一个应用运行(1)
harmonyos·鸿蒙原生开发
2501_919749039 小时前
鸿蒙 Flutter 实战:video_compress 3.1.4 适配 3.27-ohos 全流程
flutter·华为·harmonyos
nashane9 小时前
HarmonyOS 6学习:应用退出动画优化实战——从“闪退“到优雅退出的完美蜕变
学习·华为·harmonyos
程序猿追12 小时前
在 HarmonyOS 模拟器上用递归种出科赫分形
华为·harmonyos
高心星12 小时前
鸿蒙6.0应用开发——访问应用文件
华为·文件读写·fs·鸿蒙6.0·harmonyos6.0·应用文件·fileio
FrameNotWork12 小时前
HarmonyOS三方库:lv-markdown-in 技术解析与自定义语法扩展实战
华为·harmonyos