当前位置:首页>鸿蒙APP>鸿蒙动画特效全解(属性动画、逐帧动画、过渡动画、交互动效封装)

鸿蒙动画特效全解(属性动画、逐帧动画、过渡动画、交互动效封装)

  • 2026-10-21 16:11:21
鸿蒙动画特效全解(属性动画、逐帧动画、过渡动画、交互动效封装)

一、前言

流畅动画是提升App交互质感的关键,弹窗弹出、按钮点击反馈、页面切换、列表加载动效、图片轮播都离不开动画。鸿蒙ArkTS提供四类原生动画能力,但很多开发者使用时频繁踩坑:动画卡顿、多次触发叠加、页面销毁动画未停止造成内存泄漏、动效代码重复难以复用。

  • 大量重复写animateTo代码,无统一封装,维护麻烦;

  • 动画未做状态锁,快速重复点击触发多层动画叠加错乱;

  • 页面退出动画不销毁,定时器持续执行引发报错;

  • 逐帧图片动画资源量大、不会缓存导致加载卡顿;

  • 页面路由切换无过渡动画,切换生硬割裂。

本文全覆盖鸿蒙四大动画体系:内置过渡动画、animateTo属性动画、帧动画、路由转场动画,从基础用法、实战案例、商用封装、性能避坑全方位讲解,所有代码开箱即用,适配API10+商用项目。

二、鸿蒙四大动画体系对比

先搞懂选型,告别乱用动画导致的性能问题。

动画类型

核心能力

性能

适用场景

内置过渡动画

组件属性自动过渡

极高,系统原生优化

显隐、尺寸、颜色、透明度渐变

animateTo 属性动画

代码手动驱动动画,自由度高

高

点击动效、弹窗缩放、位移、旋转、组合动效

帧动画(ImageAnimator)

多张图片逐帧播放

一般,依赖图片资源

加载动画、礼物动效、表情包、动态图标

页面转场动画

路由页面切换过渡

极高

页面跳转、返回、模态弹窗过渡

三、最简单好用:内置过渡动画

鸿蒙所有组件自带.transition() 过渡属性,属性变化自动补帧动画,无需手动写动画逻辑,是性价比最高的动效方案。

3.1 显隐渐变+缩放动画实战

@Entry@Componentstruct TransitionDemo {  @State show: boolean = false  build() {    Column({ space: 30 }) {      Button('显示/隐藏弹窗')        .onClick(() => {          this.show = !this.show        })      if (this.show) {        Text('过渡动画弹窗')          .width(200)          .height(100)          .backgroundColor('#007DFF')          .fontColor(Color.White)          .textAlign(TextAlign.Center)          // 透明度 + 缩放过渡          .transition({            opacity: 0,            scale: { x: 0.8, y: 0.8 }          })      }    }    .width('100%')    .height('100%')    .justifyContent(FlexAlign.Center)  }}

原理:组件插入/销毁时,自动从设置的初始值过渡到默认状态,系统自动补帧,性能零损耗。

四、核心重点:animateTo 属性动画

animateTo 是项目中使用最多的动画API,支持手动控制动画时长、曲线、延迟、循环,可实现任意组合复杂动效。

4.1 基础语法规则

animateTo(动画参数, 状态变更回调):通过修改State变量,驱动组件属性渐变。

4.2 按钮点击缩放动效(商用高频)

@Entry@Componentstruct AnimateToDemo {  @State scaleSize: number = 1  build() {    Column() {      Text('点击缩放动效')        .scale({ x: this.scaleSize, y: this.scaleSize })        .width(200)        .height(80)        .backgroundColor('#1677ff')        .fontColor(Color.White)        .textAlign(TextAlign.Center)        .onClick(() => {          animateTo({            duration: 150,    // 动画时长            curve: Curve.Ease,// 动画曲线            playMode: PlayMode.Normal          }, () => {            this.scaleSize = 0.9          })          // 回弹          animateTo({            duration: 150          }, () => {            this.scaleSize = 1          })        })    }    .width('100%')    .height('100%')    .justifyContent(FlexAlign.Center)  }}

4.3 常用动画参数说明

  • duration:动画时长,单位ms;

  • delay:动画延迟执行;

  • curve:动画曲线(匀速、加速、减速、弹性);

  • iterations:循环次数,-1为无限循环;

  • playMode:播放模式,正向/反向/交替播放。

五、帧动画 ImageAnimator 实战

帧动画用于多张图片逐帧播放,适合加载、动画表情、动态图标场景。

@Entry@Componentstruct FrameAnimDemo {  // 图片资源数组  private frameImages: Resource[] = [    $r('app.media.frame1'),    $r('app.media.frame2'),    $r('app.media.frame3')  ]  build() {    Column() {      ImageAnimator()        .images(this.frameImages)        .duration(600)      // 总时长        .iterations(-1)     // 无限循环        .fixedSize(true)        .width(100)        .height(100)        .start()    }  }}

避坑:页面销毁必须停止动画,防止内存泄漏。

六、页面路由转场动画

默认页面跳转生硬,鸿蒙支持自定义页面入场、出场过渡动画,极大提升页面切换质感。

在路由跳转时配置动画参数,支持平移、透明度、缩放过渡。

// 页面跳转带动画router.pushUrl({  url: 'pages/TargetPage'}, RouterMode.Standard, {  transition: TransitionType.SLIDE_RIGHT})

系统内置:左右滑动、上下弹出、渐变缩放等多种转场样式,开箱即用。

七、商用级通用动画工具类封装

避免页面重复写动画代码,全局封装常用动效,统一参数、统一规范。

最新文章

随机文章