Flutter自定义RiveAnimation控制器:速度未调整且背景动画失效
解决Flutter Rive动画速度调整及背景停止问题
问题根源
- 背景动画停止:你指定了
animations: const ['idle'],这会限制Rive仅自动播放'idle'动画,而背景对应的独立动画未被包含在该列表中,因此停止运行。 - 角色速度无变化:自定义的
SpeedController仅作用于'curves'动画,角色的'idle'动画仍沿用默认播放逻辑,所以速度未受影响。 - 控制器重写逻辑缺陷:原
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
相关产品推荐
相关产品推荐

