#animation #ui #interface

mina

一个简单、表达性强、框架无关的 Rust 动画库

2 个版本

0.1.1 2023 年 6 月 15 日
0.1.0 2023 年 6 月 15 日

#641GUI

Download history 7/week @ 2024-03-13 13/week @ 2024-03-27 54/week @ 2024-04-03 24/week @ 2024-04-10 9/week @ 2024-04-17 132/week @ 2024-04-24 55/week @ 2024-05-01 64/week @ 2024-05-08 22/week @ 2024-05-15 77/week @ 2024-05-22 47/week @ 2024-05-29 35/week @ 2024-06-05 70/week @ 2024-06-12 47/week @ 2024-06-19 75/week @ 2024-06-26

每月 237 次下载

MIT 许可证

130KB
1.5K SLoC

Mina

一个简单、表达性强、框架无关的 Rust 动画库。

特性

  • 可以动画化任何标准 struct 的属性。
  • 简洁,类似于 CSS 动画 的语法,用于帧和计时。
  • 基于状态的动画器,类似于 CSS 过渡
  • 包含 缓动,无需数学计算。
  • 无 GUI 依赖 - 您编写事件循环并决定属性的含义。

目标

  • 简单:创建和实验动画应该是 简单 的。
  • 平滑:动画应该很好地融合,直观且不会显得生硬。
  • 可适应:能够开箱即用地动画化简单的属性,并通过少量调整来动画化更复杂的属性。
  • 多用途:可以与任何具有计时器或事件循环的应用程序结合使用。

时间轴示例

注意:这是一个示例,本页上的所有其他示例仅包括创建时间轴和/或动画器的代码。完整的示例始终可在 示例目录 中找到。

Moving Shape

#[derive(Animate)]
struct Shape {
    size: f32,
    #[animate] x: f32,
    #[animate] y: f32,
}

impl Shape {
    pub fn new(size: f32) -> Self {
        Shape { size, x: 0.0, y: 0.0 }
    }
}

let timeline = timeline!(Shape 5s infinite Easing::OutCubic
    from { x: -150.0, y: 60.0 }
    25% { x: 150.0, y: 60.0 }
    50% { x: 150.0, y: -60.0 }
    75% { x: -150.0, y: -60.0 }
    to { x: -150.0, y: 60.0 });

查看 完整示例(使用 nannou)。

动画器示例

Fancy Widgets

#[derive(Animate, Clone, Debug, Default)]
struct Effects {
    background_alpha: f32,
    emission_alpha: f32,
    emission_scale: f32,
}

const EFFECT_SCALE: f32 = 2.0;

let animator = animator!(Effects {
    default(Interaction::None, {
        background_alpha: 0.5,
        emission_alpha: 0.25,
        emission_scale: 0.85
    }),
    Interaction::None => [
        0.5s Easing::OutCubic to { background_alpha: 0.5 },
        2s Easing::OutQuint infinite
            from { emission_alpha: 0.0, emission_scale: 0.0 }
            2% { emission_alpha: 0.15, emission_scale: 0.0 }
            5% { emission_scale: 0.85 } Easing::InOutCirc
            75% { emission_alpha: 0.0 }
            100% { emission_scale: EFFECT_SCALE },
    ],
    Interaction::Over => 0.5s Easing::OutCubic to {
        background_alpha: 0.8,
        emission_alpha: 0.0,
        emission_scale: 0.85,
    },
    Interaction::Down => [
        0.5s Easing::OutCubic to {
            background_alpha: 1.0,
            emission_alpha: 0.0,
            emission_scale: 0.85,
        },
        3s Easing::OutExpo
            1% { emission_scale: 1.05 }
            to { emission_alpha: 0.1, emission_scale: 1.5 }
    ]
});

上面的示例来自使用 iced小部件示例

路线图

  • 具有构建器式语法的独立时间轴
  • 基于状态的动画器
  • 使用 proc macros 的类似 CSS 的语法
  • 修复宏语法的松散项(每关键帧缓动、持续时间/延迟标识等)
  • 为插件式集成创建 GUI 特定子 crate
  • 扩展示例/集成 crate,以包括更多 GUI 库
  • enum-map 依赖中解耦
  • 内置 palette 支持(用于颜色插值)

更多示例

进度指示器

Progress Indicator

Bevy 形状和精灵

Progress Indicator

画布示例(代码即将推出!)

Canvas Example

依赖关系

~1.6–2.2MB
~50K SLoC