前端动画新姿势:Rive 数据绑定实战 Tabbar 主题切换

247 阅读2分钟

概览

PixPin_2025-04-30_14-25-14.gif

Rive 最近的一次重大更新引入了数据绑定 这一全新特性。在此之前,若要在运行时动态修改 Rive 动画中的状态,唯一的途径是通过状态机进行管理。
如果需要实现多套主题颜色的动画效果,状态机 的逻辑往往会变得异常复杂且难以维护。而数据绑定的加入,极大地提升了 Rive 动画的动态性可维护性 ,为开发者带来了更高的灵活性和效率。

如上图所示,本文将使用 Rive 数据绑定实现一个在 APP 中非常常见的 Tabbar 切换动画效果,并能适配不同颜色的主题。

数据绑定定义

熟悉 Vue 的同学对数据绑定自动更新 的概念一定不会陌生。
“数据绑定”是一种通用的技术,用于将“提供者”(即数据源)与“消费者”(如 UI 元素)建立关联,并保持二者之间的同步。每当数据发生变化时,所有与其绑定的元素都会自动更新,反映出最新的状态。

在 Rive 中,Data Binding(数据绑定) 是一种强大的机制,能够将动画元素与外部数据源或代码逻辑建立响应式连接。设计师可以在编辑器中可视化地定义数据结构,并将这些属性映射到动画表现和交互行为上,从而实现高度动态和可配置的动画效果。

在 Rive 编辑器中的操作

创建视图模型

  1. 打开 Rive 编辑器,切换到 “Data” 面板
  2. 点击 “+” 创建新的 View Model,定义名称与属性类型(Number、String、Boolean、Color、Trigger、Enum、Nested Model)

image.png

  1. 为属性设定初始值

image.png

绑定源与目标

  1. 在设计画板中的 artboard 界面选择 vm 和 instance

image.png

  1. 选中某个形状、颜色或者位置,在属性上右键打开 Data Binding 面板,选择要绑定的 View Model 属性,即可将数据源与目标属性(如 fillColor、x、scale 等)建立连接。此后,无论是动画播放还是外部更新,都能保持属性同步

image.png

在运行时的使用

获取并操作视图模型

  1. 在加载 Rive 文件后,使用 Rive 运行时 API 获取视图模型,并保存相关引用:

const initRive = () => {
  const layout = new Layout({
    fit: Fit.Contain,
    alignment: Alignment.Center,
  });

  const riveFile = new RiveFile({
    src: animatedIcon,
  });

  riveFile.on(EventType.Load, () => {
    tabbarData.forEach(({ riveConfig }, i) => {
      const rive = new Rive({
        canvas: canvas.value[i],
        riveFile,
        layout,
        artboard: riveConfig.name,
        stateMachines: [riveConfig.stateMachine],
        autoplay: false,
        autoBind: true,
      });
      rive.on(EventType.Load, () => {
      
        // 数据绑定相关逻辑
        const ins = rive.viewModelInstance;
        const color = ins.color('color');
        riveColorList.value[i] = markRaw(color);

        // 状态机相关逻辑
        rive.stateMachineInputs(riveConfig.stateMachine).forEach((input) => {
          if (input.name === 'active') {
            riveActive.value[i] = markRaw(input);
            input.value = false;
          }
        });
        rive.play();
      });
      riveInstances.value[i] = rive;
    });
  });
  riveFile.init();
};

  1. 通过修改 Rive VM,同步系统中的状态到动画中
watchEffect(() => {
  riveActive.value.forEach((input, i) => {
    const isActive = activeTitle.value === tabbarData[i].title;
    const colors: Colors = isActive ? primaryColor.value : [50, 50, 51];
    // 数据绑定,状态同步
    riveColorList.value[i].rgb(...colors);
    // 状态机
    input.value = isActive;
  });
});

总结

预览地址:stackblitz.com/edit/vitejs…

里面包含了 Rive 工程文件和运行时文件,可在 Rive 编辑器中打开查看。