#animation #interpolation #transition #time #state #free #running

轻量级

一个简单、无需依赖的库,用于根据时间运行可中断的、基于转换的动画。

13 个版本 (7 个重大更新)

新版本 0.7.0 2024 年 8 月 17 日
0.6.0 2024 年 7 月 12 日

#310算法

Download history 297/week @ 2024-06-22 228/week @ 2024-06-29 784/week @ 2024-07-06 208/week @ 2024-07-13 68/week @ 2024-07-20 12/week @ 2024-07-27 3/week @ 2024-08-03 118/week @ 2024-08-10

每月 211 次下载

MIT 许可证

50KB
1K SLoC

轻量级

rust coverage crates.io downloads license

一个简单、无需依赖的库,用于根据时间运行可中断的、基于转换的动画。

此库仅实现动画,与能够执行 GUI 操作的 GUI 库(如 iced)配合使用将非常有用。

入门指南

定义

将您想要动画化的状态嵌入到 Animated 结构体中。

struct MyViewState {
    toggle: Animated<bool, Instant>,
}

当初始化您的视图状态时 - 定义初始状态并配置动画以符合您的喜好。

let mut state = MyViewState {
    toggle: Animated::new(false)
        .duration(300.)
        .easing(Easing::EaseOut)
        .delay(30.)
        .repeat(3),
};

转换

当您的状态需要更新时,在您的动画化状态上调用 transition 函数,并传递当前时间。

let now = std::time::Instant::now();
state
    .toggle
    .transition(!state.animated_toggle.value, now);

渲染

在根据您的状态渲染视图时 - 使用您状态上的 animate 函数来获取当前帧的插值值。

let now = std::time::Instant::now();

// The wrapped value can be used to interpolate any values that implement `Interpolable`
let animated_width = self.toggle.animate_bool(100., 500., now);

// If the wrapped value itself is `Interpolable`, it can easily be interpolated in place
let animated_width = self.width.animate_wrapped(now);

// There are plenty of `animate` methods for interpolating things based on the wrapped value.

这是为什么?

轻量级从需要 ELM 兼容/反应式动画的需求中产生。

此库中建模的动画不需要像 'tick' 函数那样的周期性突变 - 当调用 'transition' 时,动画的所有中间状态都是预定义的,然后在渲染时根据当前时间访问。

轻量级动画与帧率或 tick 频率完全独立,并且仅在渲染期间使用时才需要计算。

示例

indicator

无运行时依赖