ArkUI 动画

ArkUI 动画

动画可以让界面过渡更加自然流畅。ArkUI 提供了属性动画、显示动画和转场动画等多种动画能力。

属性动画

属性动画通过 .animation() 方法实现,当组件的属性变化时会产生过渡效果。

@State rotateAngle: number = 0;

Text('旋转')
  .fontSize(24)
  .rotate({ angle: this.rotateAngle })
  .animation({
    duration: 1000,
    curve: Curve.EaseInOut,
  })
  .onClick(() => {
    this.rotateAngle += 90;
  })
仓颉写法
@State var rotateAngle: Float64 = 0.0

Text("旋转")
    .fontSize(24)
    .rotate(RotateOptions(angle: rotateAngle))
    .animation(
        duration: 1000,
        curve: Curve.EaseInOut
    )
    .onClick { evt =>
        rotateAngle += 90.0
    }

显示动画

使用 animateTo 可以触发动画块中多个状态变化的过渡效果。

@State widthValue: number = 100;

Button('放大')
  .onClick(() => {
    animateTo({ duration: 500 }, () => {
      this.widthValue = 200;
    });
  })

Text('会变宽')
  .width(this.widthValue)
  .height(50)
  .backgroundColor('#007dff')
仓颉写法
@State var widthValue: Float64 = 100.0

Button("放大")
    .onClick { evt =>
        animateTo(duration: 500) {
            widthValue = 200.0
        }
    }

Text("会变宽")
    .width(widthValue)
    .height(50)
    .backgroundColor("#007dff")

转场动画

透明度转场

@State isShow: boolean = true;

Button('切换显示')
  .onClick(() => {
    this.isShow = !this.isShow;
  })

if (this.isShow) {
  Text('淡入淡出')
    .transition(TransitionOpacity)
}
仓颉写法
@State var isShow: Bool = true

Button("切换显示")
    .onClick { evt =>
        isShow = !isShow
    }

if (isShow) {
    Text("淡入淡出")
        .transition(TransitionOpacity)
}

移动转场

if (this.isShow) {
  Text('移动出现')
    .transition(TransitionEffect.translate({ x: 100 }))
}
仓颉写法
if (isShow) {
    Text("移动出现")
        .transition(TransitionEffect.translate(x: 100))
}

动画参数

参数说明
duration动画时长,单位毫秒
curve动画曲线,如 Curve.LinearCurve.EaseInOut
delay延迟时间
iterations动画播放次数,-1 表示无限循环

本章小结

  • .animation() 实现属性变化时的过渡动画。
  • animateTo() 控制多个状态变化的动画效果。
  • transition() 实现组件显示/隐藏时的转场动画。