Flare/Flutter: 如何在开始动画之前重置动画进度?
Flare/Flutter: How to reset the progress of an animation before starting it?
我有一个 Flare 文件,其中包含 3 个动画,都在同一个画板上。我知道在动画之间切换时,Flare 默认会将动画混合在一起,并且播放一个动画不会将相关节点值重置回编辑器中第 0 帧时的值。这就是我想要实现的行为:在播放新动画时,我希望之前的动画完全停止(根本不要混合它们)并让传入的动画从一开始就开始及其所有默认值。
用例是这样的:
- 播放动画,例如,形状的不透明度降至零
- 播放一个使用上面形状的不同动画,但在 Flare 编辑器中,它在动画开始时的不透明度为 1
期望的结果:新动画重置形状的不透明度,然后像正常一样开始播放
实际结果:由于之前的动画改变了形状的不透明度,新动画将使用形状的原样而不是在编辑器中创建的形状
对于我在 GitHub 上解释的问题,您可以查看有关此问题的线程结尾(有 gif):https://github.com/2d-inc/Flare-Flutter/issues/14
在上面的话题中,Luigi Rosso 提到了 "re-instancing" 画板。有谁知道他的意思是什么以及如何去做?我已经尝试了几种方法来做到这一点,例如 类 上的 makeInstance
方法,例如 FlutterActorArtboard
、ActorNode
和其他一些方法(makeInstance
方法,但它们的名称都相似,并且 return 一个新的画板。但是,到目前为止,我没有运气在 FlareController 实现中替换我的画板的当前实例。
我也尝试过手动循环画板的所有 ActorNode
s 并首先保存它们的初始值,然后在每次播放新动画时将保存的值复制到画板,但是这个似乎把事情搞砸了(动画无法识别,之后就不能正确播放,所以我一定是做错了什么。或者我正在重置错误的值)。
感谢任何帮助,谢谢!
要在形状上播放不同的动画并重置其不透明度,您可以在运行时访问节点的不透明度:
ActorNode myNode = _artboard.getNode("nodeString");
myNode.opacity = 0.00;
As outlined here 在手册中。
更简单的,在新动画中,你可以在Rive/Flare编辑器中设置一个关键帧,在新动画开始时不透明度为1,这样当它从头开始播放动画时它的不透明度将重置为 1。
要播放一个动画,然后在播放下一个动画时完全覆盖它,您可以扩展 FlareController
并创建自定义动画控制器以在 advance
方法中执行此操作。
这是一个简单粗暴的示例(不是最佳实践),让您了解如何使用 advance
:
https://gist.github.com/she-who-codes/85d8f0da97abfc3ecc43b1cb470e9c29
https://gist.github.com/she-who-codes/ce633204cd2d4babfe9a5b54e34ca63d
我有一个 Flare 文件,其中包含 3 个动画,都在同一个画板上。我知道在动画之间切换时,Flare 默认会将动画混合在一起,并且播放一个动画不会将相关节点值重置回编辑器中第 0 帧时的值。这就是我想要实现的行为:在播放新动画时,我希望之前的动画完全停止(根本不要混合它们)并让传入的动画从一开始就开始及其所有默认值。
用例是这样的:
- 播放动画,例如,形状的不透明度降至零
- 播放一个使用上面形状的不同动画,但在 Flare 编辑器中,它在动画开始时的不透明度为 1
期望的结果:新动画重置形状的不透明度,然后像正常一样开始播放
实际结果:由于之前的动画改变了形状的不透明度,新动画将使用形状的原样而不是在编辑器中创建的形状
对于我在 GitHub 上解释的问题,您可以查看有关此问题的线程结尾(有 gif):https://github.com/2d-inc/Flare-Flutter/issues/14
在上面的话题中,Luigi Rosso 提到了 "re-instancing" 画板。有谁知道他的意思是什么以及如何去做?我已经尝试了几种方法来做到这一点,例如 类 上的 makeInstance
方法,例如 FlutterActorArtboard
、ActorNode
和其他一些方法(makeInstance
方法,但它们的名称都相似,并且 return 一个新的画板。但是,到目前为止,我没有运气在 FlareController 实现中替换我的画板的当前实例。
我也尝试过手动循环画板的所有 ActorNode
s 并首先保存它们的初始值,然后在每次播放新动画时将保存的值复制到画板,但是这个似乎把事情搞砸了(动画无法识别,之后就不能正确播放,所以我一定是做错了什么。或者我正在重置错误的值)。
感谢任何帮助,谢谢!
要在形状上播放不同的动画并重置其不透明度,您可以在运行时访问节点的不透明度:
ActorNode myNode = _artboard.getNode("nodeString");
myNode.opacity = 0.00;
As outlined here 在手册中。
更简单的,在新动画中,你可以在Rive/Flare编辑器中设置一个关键帧,在新动画开始时不透明度为1,这样当它从头开始播放动画时它的不透明度将重置为 1。
要播放一个动画,然后在播放下一个动画时完全覆盖它,您可以扩展 FlareController
并创建自定义动画控制器以在 advance
方法中执行此操作。
这是一个简单粗暴的示例(不是最佳实践),让您了解如何使用 advance
:
https://gist.github.com/she-who-codes/85d8f0da97abfc3ecc43b1cb470e9c29
https://gist.github.com/she-who-codes/ce633204cd2d4babfe9a5b54e34ca63d