1

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

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

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

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

谢谢您的帮助!

4

1 回答 1

2

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

// 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 文件时触发的函数,在您将控制器带到状态机以修改其状态后(这很重要,状态机的名称必须与动画状态机名称相同) 并且要修改触发器的值,您必须以这种方式获得参考

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

那么你可以使用

无效 _onHandlerStateMachine() => _lick?.value = !_lick!.value;

随时放置或删除动画,您也可以有多个触发器。如果您需要您的动画做某事并在一段时间后做其他事情,您可以使用 debouncer 功能

_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

于 2021-12-11T02:12:51.410 回答