Skip to content

ICFAbstractAnimation - 动画基类

ICFAbstractAnimation 是所有动画组件的抽象基类,定义了动画的生命周期、状态管理和信号接口。设计这个基类是为了统一时间动画和弹簧动画的行为模式——它们虽然内部插值逻辑不同,但启动、暂停、停止这些外部操作是一致的。

动画状态

动画在其生命周期内会经历四种状态:

cpp
enum class State { Idle, Running, Paused, Finished };
```text

- `Idle`:动画尚未启动或已停止,处于初始状态
- `Running`:动画正在运行中
- `Paused`:动画已暂停,可以继续运行
- `Finished`:动画已完成

这些状态由内部管理,外部通过信号监听状态变化。

## 基本使用

动画的典型使用流程是创建、连接信号、启动:

```cpp
#include "ui/components/animation.h"

// 假设有一个具体实现
auto* anim = new CFTimingAnimation(spec, this);

// 连接信号监听动画生命周期
connect(anim, &ICFAbstractAnimation::started, []() {
    qDebug() << "Animation started";
});
connect(anim, &ICFAbstractAnimation::finished, []() {
    qDebug() << "Animation finished";
});
connect(anim, &ICFAbstractAnimation::progressChanged, [](float progress) {
    qDebug() << "Progress:" << progress;
});

// 启动动画
anim->start(ICFAbstractAnimation::Direction::Forward);
```text

## 方向控制

动画支持正向和反向播放,`reverse()` 方法会停止当前动画并以相反方向重新启动:

```cpp
// 正向播放
anim->start(ICFAbstractAnimation::Direction::Forward);

// 反向播放
anim->start(ICFAbstractAnimation::Direction::Backward);

// 翻转当前方向
anim->reverse();  // 停止并以相反方向重新开始
```text

⚠️ `reverse()` 会停止当前动画并重新启动,而不是简单地改变播放方向。如果需要无缝反向,需要自己管理逻辑。

## 生命周期控制

```cpp
// 暂停正在运行的动画
anim->pause();

// 停止并重置到初始状态
anim->stop();
```text

`stop()` 和 `pause()` 的区别在于:`pause()` 可以恢复,而 `stop()` 会将动画重置回初始状态。

## 弱引用获取

每个具体动画类都需要实现 `GetWeakPtr()` 方法,返回指向自己的弱引用。这是为了避免动画对象在异步回调中被意外持有导致内存泄漏:

```cpp
cf::WeakPtr<ICFAbstractAnimation> weak = anim->GetWeakPtr();
```text

⚠️ 动画类本身不是线程安全的。如果需要在多线程环境下使用,外部需要自行加锁。

## 相关文档

- [CFTimingAnimation - 时间动画](./timing_animation.md)
- [CFSpringAnimation - 弹簧动画](./spring_animation.md)
- [Easing - 缓动曲线](../base/easing.md)

Built with VitePress