Flutter动画色彩修改插件rive_color_modifier的使用

发布于 1周前 作者 zlyuanteng 来自 Flutter

Flutter动画色彩修改插件rive_color_modifier的使用

Rive Color Modifier

此包提供了一种简单直接的方法,在运行时修改Rive动画中特定组件的颜色,同时保持它们在整个动画中的透明度(alpha值)。

Demo

rive_color_modifier_example

Getting Started

Important Notes

  1. 导出名称:在导出Rive文件时,请确保启用“导出选项 -> 导出所有名称”设置。这对于该包的正常工作至关重要。 Export All Names

  2. Rive Pro vs. No Pro:当使用Rive文件的运行时导出版本时,更改某些元素(如描边和填充)颜色存在一些限制。为了获得完整功能,可能需要使用备份导出选项,这是Rive Pro的功能。自Rive编辑器版本v0.8.1440以来,不导出对象名称的选项被启用以减少文件大小。这会导致只有形状名称被导出,但不包括它们包含的元素(如填充和描边)的名称。我正在探索有效的解决方案,以便非Pro用户仍然可以使用填充和描边的名称。

  3. 渐变支持:自版本2.1.1起,此包现在支持使用新的RiveGradientComponent小部件更改线性和径向渐变。

使用步骤

在开始使用这个包之前,必须理解的是,你需要有一个包含你想要修改的动画的.riv文件。如果你还没有在Rive中创建任何动画或对它的编辑器不熟悉,无需担心。你可以访问社区部分,浏览并编辑由社区分享的令人印象深刻的动画。在此案例中,我借用了来自JcToon的这个精美的动画。

关键步骤

  1. 为Artboard命名:为包含你想要更改的动画的Artboard分配一个名称。这一步非常重要,因为我们稍后将使用分配的名称检索Artboard。
// 在StatefulWidget的initState方法中调用此方法
Future<void> _load() async {
  // 从资产包加载RiveFile
  final avatarFile = await RiveFile.asset('assets/avatar.riv');
  // 获取包含你想要修改的动画的Artboard
  final artboard = avatarFile.artboardByName('Avatar')!;

  setState(
    () {
      // 初始化之前声明的_avatarArtboard变量
      _avatarArtboard = artboard;
    },
  );
}
  1. 为每个Shape命名:确保每个Shape都有一个唯一名称,因为这将是我们在代码中用来修改每个Shape颜色的标识符。
RiveColorModifier(
  artboard: _avatarArtboard,
  components: [
    //* EARRING COLOR
    RiveColorComponent(
      shapePattern: 'Left Earring', // Shape name
      // rest of the code
    ),
    RiveColorComponent(
      shapePattern: 'Right Earring', // Shape name
      //...
    ),
    // ...
  ],
)

或者使用模式匹配多个Shape:

RiveColorModifier(
  artboard: _avatarArtboard,
  components: [
    //* EARRING COLOR
    RiveColorComponent(
      shapePattern: '.*Earring', // 匹配所有以"Earring"结尾的Shape
      // rest of the code
    ),
    // ...
  ],
)
  1. 为每个Fill或Stroke命名:确保每个你想要修改的Fill或Stroke都有一个唯一名称。
RiveColorModifier(
  artboard: _avatarArtboard,
  components: [
    //* EARRING COLOR
    RiveColorComponent(
      shapePattern: 'Left Earring',
      fillPattern: 'Left Earring Fill', // Fill name
      color: Colors.yellow, // Color
    ),
    RiveColorComponent(
      shapePattern: 'Right Earring',
      fillPattern: 'Right Earring Fill', // Fill name
      color: Colors.yellow, // Color
    ),
    // ...
  ],
)

或者使用模式匹配多个Fill或Stroke:

RiveColorModifier(
  artboard: _avatarArtboard,
  components: [
    //* EARRING COLOR
    RiveColorComponent(
      shapePattern: '.*Earring', // 匹配所有以"Earring"结尾的Shape
      fillPattern: '.*Earring Fill', // 匹配所有以"Earring Fill"结尾的Fill
      color: Colors.yellow, // Color
    ),
    // ...
  ],
)

如何工作

不使用模式

此包允许你动态修改Rive动画中特定组件的颜色属性。以下是如何使用RiveColorModifierRiveColorComponent来更改动画中特定Shapes颜色的示例。

// 示例:如何使用RiveColorModifier
RiveColorModifier(
  artboard: _yourArtboard,
  components: [
    // 更改Shape的Fill颜色
    RiveColorComponent(
      shapePattern: 'Your Shape Name',
      fillPattern: 'Your Fill Name',
      color: isDarkMode ? Colors.white : Colors.black, // 根据主题动态改变颜色
    ),
    // 更改Shape的Stroke颜色
    RiveColorComponent(
      shapePattern: 'Your Shape Name',
      strokePattern: 'Your Stroke Name',
      color: isDarkMode ? Colors.white : Colors.black, // 根据主题动态改变颜色
    ),
  ],
)

使用模式

// 示例:如何使用带有模式的RiveColorModifier
RiveColorModifier(
  artboard: _yourArtboard,
  components: [
    // 使用单个RiveColorComponent更改多个Shapes的Fills和Strokes颜色
    RiveColorComponent(
         shapePattern : '.*',        // 匹配所有Shapes
         fillPattern  : '.*primary', // 匹配所有以"primary"结尾的Fills
         strokePattern: '.*primary', // 匹配所有以"primary"结尾的Strokes
         color: primaryColor,
      ),
  ]
)

更改渐变

自版本2.1.1起,你现在可以修改线性和径向渐变:

// 示例:如何使用RiveGradientComponent更改渐变
RiveColorModifier(
  artboard: _yourArtboard,
  components: [
    // 更改线性或径向渐变
    RiveGradientComponent(
      shapePattern: 'Your Shape Name',
      fillPattern: '.*', // 匹配所有Fills
      colors: [Colors.red, Colors.blue],
      stops: [0.0, 1.0],
    ),
  ],
)

其他信息

更多关于如何使用此包的信息,或如果你想贡献,请访问GitHub仓库。如果你遇到任何问题或有功能请求,请在问题跟踪器中提交。

不要忘记如果你觉得这个包有用的话,给它点个赞。如果有任何建议,请随时告诉我。

你的反馈和贡献将帮助改进这个包!

完整示例代码

import 'package:animated_theme_switcher/animated_theme_switcher.dart';
import 'package:example/config/config.dart';
import 'package:example/screens/home_screen.dart';
import 'package:flutter/material.dart';

void main() {
  final appTheme = AppTheme(isDarkMode: false);

  runApp(
    ThemeProvider(
      initTheme: appTheme.getTheme(),
      builder: (context, theme) => MaterialApp(
        title: 'Rive Change Color Example',
        theme: theme,
        home: const HomeScreen(),
      ),
    ),
  );
}

更多关于Flutter动画色彩修改插件rive_color_modifier的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter动画色彩修改插件rive_color_modifier的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何使用 rive_color_modifier 插件来修改 Flutter 中 Rive 动画色彩的具体代码示例。rive_color_modifier 插件允许你动态地修改 Rive 动画中的颜色属性。

首先,确保你已经在 pubspec.yaml 文件中添加了 riverive_color_modifier 依赖:

dependencies:
  flutter:
    sdk: flutter
  rive: ^0.8.0  # 请检查最新版本
  rive_color_modifier: ^0.1.0  # 请检查最新版本

然后,运行 flutter pub get 来获取这些依赖。

接下来,我们编写代码来加载 Rive 动画并使用 rive_color_modifier 修改其颜色。

import 'package:flutter/material.dart';
import 'package:rive/rive.dart';
import 'package:rive_color_modifier/rive_color_modifier.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Rive Color Modifier Example'),
        ),
        body: Center(
          child: RiveAnimationExample(),
        ),
      ),
    );
  }
}

class RiveAnimationExample extends StatefulWidget {
  @override
  _RiveAnimationExampleState createState() => _RiveAnimationExampleState();
}

class _RiveAnimationExampleState extends State<RiveAnimationExample> {
  late RiveAnimationController _controller;
  late Artboard _artboard;
  late ColorModifier _colorModifier;

  @override
  void initState() {
    super.initState();

    // 加载 Rive 文件
    final riveFile = RiveFile.import(asset: 'assets/your_rive_file.riv');
    _artboard = riveFile.mainArtboard;
    _controller = RiveAnimationController.fromArtboard(_artboard, animations: ['your_animation_name']);

    // 初始化 ColorModifier
    _colorModifier = ColorModifier(_artboard);

    // 播放动画
    _controller.play('your_animation_name');
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Stack(
      alignment: Alignment.center,
      children: [
        Rive(artboard: _artboard, controller: _controller),
        // 添加一个按钮来修改颜色
        Positioned(
          bottom: 20,
          child: ElevatedButton(
            onPressed: () {
              // 修改动画中的颜色
              _colorModifier.setColor('your_color_property_name', Colors.red);
            },
            child: Text('Change Color'),
          ),
        ),
      ],
    );
  }
}

在上面的代码中:

  1. 我们首先加载了一个 Rive 动画文件 your_rive_file.riv,并获取了主 Artboard 和动画控制器。
  2. 我们初始化了一个 ColorModifier 实例,它将用于修改动画中的颜色。
  3. build 方法中,我们显示了 Rive 动画,并添加了一个按钮。当按钮被点击时,我们调用 _colorModifier.setColor 方法来修改动画中的颜色属性 your_color_property_name

请注意:

  • 你需要将 your_rive_file.riv 替换为你的实际 Rive 文件名。
  • your_animation_name 需要替换为你的实际动画名称。
  • your_color_property_name 需要替换为你希望在 Rive 动画中修改的实际颜色属性名称。

这个示例演示了如何使用 rive_color_modifier 插件来动态修改 Rive 动画中的颜色。根据你的具体需求,你可能需要调整颜色属性的名称和动画的细节。

回到顶部