Animation 动画
动画(Animation)用于为元素添加动态效果,提升界面交互的流畅性和视觉吸引力。通过 AnimationEngine,你可以方便地为任意元素实现淡入淡出、滑动、缩放、旋转、弹跳等多种常见动画效果,并支持动画的播放、暂停、恢复、重置等操作。动画支持链式调用和异步控制,适用于页面过渡、弹窗、提示等多种场景。
属性
AnimationEngine
方法名 | 说明 | 类型 |
---|---|---|
createAnimation | 创建动画实例 | (element: UniElement | null, options: AnimationOptions = {}): AnimationEngine |
play | 开始播放动画 | (): AnimationEngine |
playAsync | 异步播放动画,支持 await | (): Promise<void> |
stop | 停止动画 | (): AnimationEngine |
pause | 暂停动画 | (): AnimationEngine |
resume | 恢复暂停的动画 | (): AnimationEngine |
reset | 重置动画到初始状态,清空所有内容 | (): AnimationEngine |
getProgress | 获取当前动画进度 | (): number |
isAnimating | 获取动画是否正在运行 | (): boolean |
getCurrentLoop | 获取当前循环次数 | (): number |
clearAttributes | 清除所有动画属性 | (): AnimationEngine |
getAttributeCount | 获取动画属性数量 | (): number |
fadeIn | 淡入动画 | (duration: number = 300): AnimationEngine |
fadeOut | 淡出动画 | (duration: number = 300): AnimationEngine |
slideInLeft | 滑入动画(从左) | (duration: number = 300): AnimationEngine |
slideInRight | 滑入动画(从右) | (duration: number = 300): AnimationEngine |
slideInUp | 滑入动画(从上) | (duration: number = 300): AnimationEngine |
slideInDown | 滑入动画(从下) | (duration: number = 300): AnimationEngine |
zoomIn | 缩放动画(放大) | (duration: number = 300): AnimationEngine |
zoomOut | 放动画(缩小) | (duration: number = 300): AnimationEngine |
rotateIn | 旋转动画 | (duration: number = 300): AnimationEngine |
rotateOut | 旋转退出动画 | (duration: number = 500): AnimationEngine |
bounce | 弹跳动画 | (duration: number = 300): AnimationEngine |
slideOutLeft | 滑出动画(向左) | (duration: number = 300): AnimationEngine |
slideOutRight | 滑出动画(向右) | (duration: number = 300): AnimationEngine |
slideOutUp | 滑出动画(向上) | (duration: number = 300): AnimationEngine |
slideOutDown | 滑出动画(向下) | (duration: number = 300): AnimationEngine |
flipX | 翻转动画(水平) | (duration: number = 600): AnimationEngine |
flipY | 转动画(垂直) | (duration: number = 600): AnimationEngine |
elasticIn | 弹性进入动画 | (duration: number = 600): AnimationEngine |
elasticOut | 性退出动画 | (duration: number = 600): AnimationEngine |
rubberBand | 回弹动画 | (duration: number = 1000): AnimationEngine |
swing | 摆动动画 | (duration: number = 1000): AnimationEngine |
wobble | 抖动动画 | (duration: number = 1000): AnimationEngine |
rollIn | 滚动进入动画 | (duration: number = 600): AnimationEngine |
rollOut | 滚动退出动画 | (duration: number = 600): AnimationEngine |
lightSpeed | 灯光效果动画 | (duration: number = 500): AnimationEngine |
float | 浮动动画 | (duration: number = 3000): AnimationEngine |
breathe | 呼吸动画 | (duration: number = 2000): AnimationEngine |
glow | 发光动画 | (duration: number = 1500): AnimationEngine |
progressBar | 进度条动画 | (duration: number = 1000): AnimationEngine |
modalIn | 模态框进入动画 | (duration: number = 300): AnimationEngine |
modalOut | 模态框退出动画 | (duration: number = 300): AnimationEngine |
cardFlip | 卡片翻转动画 | (duration: number = 600): AnimationEngine |
ripple | 波纹扩散动画 | (duration: number = 600): AnimationEngine |
sequence | 链式动画:支持多个动画依次执行 | (animations: ((engine: AnimationEngine) => AnimationEngine)[]): AnimationEngine |
AnimationOptions
用于配置动画的选项对象,支持自定义动画的持续时间、循环次数、缓动函数、回调等参数。
属性名 | 说明 | 类型 | 默认值 |
---|---|---|---|
duration | 动画持续时间(毫秒) | number | 300 |
loop | 循环次数,-1 为无限循环 | number | 1 |
alternate | 是否往返播放 | boolean | false |
sequential | 是否按属性顺序依次执行动画 | boolean | false |
timingFunction | 缓动函数名称 | string | 'linear' |
bezier | 自定义贝塞尔曲线参数 | number[] | undefined |
complete | 动画完成回调 | () => void | undefined |
start | 动画开始回调 | () => void | undefined |
frame | 每帧回调,参数为进度(0~1) | (progress: number) => void | undefined |
示例
基础用法
实现元素顺时针旋转一圈(360
度)
vue
<template>
<view ref="viewRef" class="h-10 w-10 bg-primary-500 rounded-lg"></view>
</template>
<script lang="ts" setup>
onReady(() => {
createAnimation(viewRef.value, {
duration: 1000,
})
.rotate("0deg", "360deg")
.play();
});
</script>
无限循环
只需将参数 loop
设置为 -1
,即可让动画无限循环播放。
vue
<template>
<view ref="viewRef" class="h-10 w-10 bg-primary-500 rounded-lg"></view>
</template>
<script lang="ts" setup>
onReady(() => {
createAnimation(viewRef.value, {
duration: 1000,
loop: -1,
})
.rotate("0deg", "360deg")
.play();
});
</script>
是否往返播放
只需将参数 alternate
设置为 true
,即可让动画往返播放。
vue
<template>
<view ref="viewRef" class="h-10 w-10 bg-primary-500 rounded-lg"></view>
</template>
<script lang="ts" setup>
onReady(() => {
createAnimation(viewRef.value, {
duration: 1000,
loop: -1,
alternate: true,
})
.rotate("0deg", "360deg")
.play();
});
</script>
贝塞尔曲线动画
你可以通过设置 bezier
参数为贝塞尔曲线数组(如 [0.42, 0, 0.58, 1]
),实现自定义缓动效果。
vue
<template>
<view ref="viewRef" class="h-10 w-10 bg-primary-500 rounded-lg"></view>
</template>
<script lang="ts" setup>
onReady(() => {
createAnimation(viewRef.value, {
bezier: [0.42, 0, 0.58, 1],
loop: -1
})
.rotate("0deg", "360deg")
.play();
});
</script>
异步序列动画方法
异步序列动画方法允许你通过传入一个函数数组,依次执行每个动画步骤。每个函数会接收一个动画引擎实例(AnimationEngine
),你可以在其中自定义动画效果和持续时间。每个动画会在上一个动画完成后自动开始,适合实现复杂的动画流程。
下面是一个示例,依次执行淡入、放大、旋转、缩小、淡出等动画:
vue
<template>
<view ref="viewRef" class="h-10 w-10 bg-primary-500 rounded-lg"></view>
</template>
<script lang="ts" setup>
onReady(() => {
createAnimation(viewRef.value)
.sequence([
(engine: AnimationEngine) => engine.fadeIn(300),
(engine: AnimationEngine) => engine.scale("1", "1.5").setDuration(400),
(engine: AnimationEngine) =>
engine.rotate("0deg", "360deg").setDuration(500),
(engine: AnimationEngine) => engine.scale("1.5", "1").setDuration(300),
(engine: AnimationEngine) => engine.fadeOut(300),
])
.play();
});
</script>