You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter自定义RiveAnimation控制器:速度未调整且背景动画失效

解决Flutter Rive动画速度调整及背景停止问题

问题根源

  1. 背景动画停止:你指定了animations: const ['idle'],这会限制Rive仅自动播放'idle'动画,而背景对应的独立动画未被包含在该列表中,因此停止运行。
  2. 角色速度无变化:自定义的SpeedController仅作用于'curves'动画,角色的'idle'动画仍沿用默认播放逻辑,所以速度未受影响。
  3. 控制器重写逻辑缺陷:原apply方法中对动画实例的状态判断可能导致动画提前终止,且未确保循环播放的持续性。

修复方案

方案1:移除animations参数,统一用控制器管理所有动画

去掉animations参数,为角色和背景动画分别创建SpeedController实例,确保两者都按自定义速度播放:

RiveAnimation.asset(
  'assets/animations/lumberjack.riv',
  controllers: [
    SpeedController('idle', speedMultiplier: 5),
    SpeedController('curves', speedMultiplier: 5),
  ],
)

同时修正SpeedController的实现逻辑,保障动画循环播放:

class SpeedController extends SimpleAnimation {
  final double speedMultiplier;

  SpeedController(
    String animationName, {
    double mix = 1,
    this.speedMultiplier = 1,
  }) : super(animationName, mix: mix);

  @override
  void apply(RuntimeArtboard artboard, double elapsedSeconds) {
    // 初始化动画实例并设置循环模式
    if (instance == null) {
      instance = artboard.animationByName(animationName)?.instance()
        ..loop = Loop.loop;
    }
    
    if (instance == null) return;
    
    // 按自定义速度推进动画
    instance!.advance(elapsedSeconds * speedMultiplier);
    // 将动画状态应用到画板
    instance!.animation.apply(instance!.time, coreContext: artboard, mix: mix);
    
    // 保持控制器活跃,确保动画持续循环
    isActive = true;
  }
}

方案2:保留animations参数,包含所有需播放的动画名

如果要保留animations参数,需将背景动画名称加入列表,同时为角色动画绑定控制器:

RiveAnimation.asset(
  'assets/animations/lumberjack.riv',
  animations: const ['idle', 'curves'], // 加入背景动画名称
  controllers: [
    SpeedController('idle', speedMultiplier: 5),
    SpeedController('curves', speedMultiplier: 5),
  ],
)

核心提示

  • 当使用controllers参数时,只有被控制器绑定的动画会按自定义逻辑运行;未绑定但在animations列表中的动画会以默认速度播放,不在列表中的则直接停止。
  • 所有需要调整速度或保持播放的动画,都需要对应创建控制器实例并绑定。

内容的提问来源于stack exchange,提问作者Lara

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 09:33:20