HarmonyOS7 属性动画基础:animateTo 驱动透明度与位移动画
2026/7/23 22:16:26 网站建设 项目流程

文章目录

    • 前言
    • 基础概念
      • animateTo vs .animation()
    • 从简到繁
      • 透明度动画
      • 位移动画
      • 组合复位
    • 代码详解
      • 完整状态管理
      • 动画目标组件
      • 按钮控制面板
      • 实时数值显示
    • Curve 曲线对比
    • 常见问题
    • 进阶技巧
    • 写在最后

前言

ArkUI 有两种动画模式:声明式动画(.animation())和显式动画(animateTo)。前者适合"状态变化自动过渡"的场景,后者适合"在特定时刻触发动画"的场景。今天聊animateTo的基础用法,用透明度和位移两个属性来入门。

基础概念

animateTo vs .animation()

特性.animation()animateTo
触发方式状态变化自动触发手动调用触发
代码位置组件属性事件回调中
适用场景属性跟随状态变化点击按钮触发动画
多次触发每次值变化都触发只在调用时触发

animateTo的函数签名:

animateTo({duration:500,curve:Curve.EaseInOut},()=>{// 在这里修改状态变量,修改会走动画})

第一个参数是动画配置,第二个是回调函数。回调里修改的状态变量会以动画方式过渡到新值。

从简到繁

透明度动画

Button('淡出').onClick(()=>{animateTo({duration:500,curve:Curve.EaseInOut},()=>{this.opacityValue=0.2})})Button('淡入').onClick(()=>{animateTo({duration:500,curve:Curve.EaseInOut},()=>{this.opacityValue=1})})

点击"淡出"时,opacityValue从 1 渐变到 0.2,持续 500ms,使用EaseInOut曲线(先慢后快再慢)。

位移动画

Button('右移').onClick(()=>{animateTo({duration:600,curve:Curve.EaseOut},()=>{this.offsetX=60})})

方块向右平移 60vp,EaseOut曲线让运动"先快后慢",有减速感。

组合复位

Button('复位').onClick(()=>{animateTo({duration:500,curve:Curve.FastOutLinearIn},()=>{this.opacityValue=1this.offsetX=0})})

一个animateTo调用里同时修改多个状态变量,透明度和位移会同时做过渡动画。FastOutLinearIn曲线快速开始然后线性减速。

代码详解

完整状态管理

@Entry@Componentstruct BasicPropertyAnimation{@StateopacityValue:number=1@StateoffsetX:number=0// ...}

只需要两个状态变量,一个控制透明度,一个控制水平偏移。

动画目标组件

Column().width(80).height(80).backgroundColor('#6BCB77').borderRadius(12).opacity(this.opacityValue).translate({x:this.offsetX})

.opacity().translate()都是可动画属性——框架知道怎么在两个值之间做插值。

按钮控制面板

Row({space:12}){Button('淡出').onClick(()=>{/* ... */})Button('淡入').onClick(()=>{/* ... */})Button('右移').onClick(()=>{/* ... */})Button('复位').onClick(()=>{/* ... */})}.width('100%').justifyContent(FlexAlign.SpaceEvenly).margin({top:12})

四个按钮一字排开,用Row({ space: 12 })设置间距,SpaceEvenly均匀分布。

实时数值显示

Text(`当前透明度:${this.opacityValue.toFixed(1)}| 偏移:${this.offsetX}vp`).fontSize(12).fontColor('#999999').margin({top:12})

动画过程中,数值是连续变化的。toFixed(1)保留一位小数,显示更整洁。

Curve 曲线对比

这个案例用到了三种曲线,对比一下:

Curve运动特点视觉效果
EaseInOut先慢后快再慢最自然,适合大多数过渡
EaseOut先快后慢有减速感,适合"停下来"
FastOutLinearIn快速启动,线性减速有点"冲"的感觉

选曲线的原则:

  • 入场/出现:用EaseOut(快速出现,慢慢停稳)
  • 出场/消失:用EaseIn(慢慢开始,快速消失)
  • 状态切换:用EaseInOut(平滑过渡)

常见问题

Q:animateTo 的回调里能写异步操作吗?

不能。回调里只应该写状态变量的赋值操作。异步操作放在animateTo外面。

Q:动画还没结束又触发了新动画?

新动画会"打断"旧动画,从当前值开始过渡到新目标值。不会叠加。

Q:怎么知道动画结束了?

animateTo的第一个参数支持onFinish回调:

animateTo({duration:500,curve:Curve.EaseInOut,onFinish:()=>{console.info('动画完成')}},()=>{this.opacityValue=0.2})

animateTo的回调函数里不要写非状态修改的代码(比如网络请求、日志打印)。它的作用是"告诉框架哪些状态变量需要做动画",不是通用的回调。

进阶技巧

  1. 链式动画:在onFinish里触发下一个animateTo,形成动画序列。

  2. 不同属性不同时长:如果需要透明度和位移用不同的动画时长,可以分两次animateTo调用。

  3. 延迟启动:用setTimeout包裹animateTo实现延迟动画,或者用animateTodelay参数。

写在最后

animateTo是 ArkUI 动画系统的"手动模式",给你精确的触发控制。配合Curve曲线和duration时长,能做出各种节奏感不同的动画效果。今天用透明度和位移入了门,后面的文章会在这个基础上扩展到缩放、旋转、颜色变化等更多属性。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询