Q:如何用新米反向播放OneShot动画

Q: How to play OneShotAnimations in reverse with new rive

我有一个应用程序,其中有一个用 rive 制作的动画复选标记。这是一个一次性动画,我想播放它并让它在完成后留在动画的末尾,然后当用户再次单击它时也能够反转它。我尝试使用 SimpleAnimation 但我也无法实现我想要的,但它在动画完成后仍然存在。但是,我不知道如何播放动画然后反转它或播放另一个动画。

复选标记看起来像这样:https://cln.sh/MwLFNs

它们是两个独立的动画,但它们是反向复制粘贴的,所以我可以使用一个或两个。

我需要的是让动画播放,然后当用户点击支票时,我希望动画更改为另一个可以播放的动画。我怎样才能做到这一点?

感谢您的帮助!

您可以使用状态机,获取状态并在需要时决定做什么

// Getting state machine
  void _onRiveInit(Artboard artboard) async {
    final controller =
        StateMachineController.fromArtboard(artboard, 'State Machine 1');

    if (controller != null) {
      artboard.addController(controller);
      _lick = controller.findInput<bool>('Lick') as SMITrigger;
    }
  }

  void _onHandlerStateMachine() => _lick?.value = !_lick!.value;

_onRiveInit 是在加载 Rive 文件时触发的函数, 在你得到 controller 到状态机后修改他的状态 (这很重要,状态机的名称必须与动画状态机名称相同) 并修改触发器的值,您必须以这种方式获得参考

_lick = controller.findInput('Lick') as SMITrigger;

那么你可以使用

void _onHandlerStateMachine() => _lick?.value = !_lick!.value;

随时打开或删除动画,也可以有多个触发器。 如果你需要你的动画做一些事情,过一段时间再做一些其他事情,你可以使用去抖功能

_debouncer.run(() {
      _onHandlerStateMachine()
    });

**如果使用状态管理,记得更新视图

加载 rive 文件时

// Loads a Rive file
  Future<void> _loadRiveFile() async {
    final bytes = await rootBundle.load(riveFileName);
    RiveFile rFile = RiveFile.import(bytes);

    final artboard = rFile.mainArtboard;
    _onRiveInit(artboard);

    globalArtboard = artboard
      ..addController(
        _animationController = SimpleAnimation('idle'),
      );    
  }

这里有泰迪熊的 Rive 动画示例,使用 Flutter 和提供程序 https://github.com/alcampospalacios/flutter-rive-animations