【发布时间】:2020-09-19 10:38:54
【问题描述】:
我正在尝试为一个小部件添加多个动画,但由于我是 Flutter 的初学者,我不知道我必须使用什么功能来执行此操作。当每个小部件只有一个动画时,这很好。只需将一个布尔值添加到字段并使用 AnimatedContainer 覆盖小部件。像这样,
bool init = false; //Bool about animation
//Somewhere of codes...
child: AnimatedContainer(
transform: init ? matrixA : matrixB,
child: FlatButton(
child: Text("Press Me"),
onPressed: () {
//Change init to true
setState(() {
init = true;
});
}
) //FlatButton
) //AnimatedContainer
我可以使用 Flare 执行图标动画,也可以使用 Future.delayed() 执行惰性动画(对不起,如果这种行为是不好的做法,如果我做错了,请告诉我)。问题是一个小部件必须有几个动画,这样的小部件大约有3个。我曾经尝试首先为一个小部件放置 2 个动画。在我的应用程序中,我放置了耀斑图标动画。此动画结束后,我正在显示按钮。当用户点击此按钮时,按钮将上升到特定位置。由于按钮首先必须位于屏幕下方,因此我需要 3 个 Matrix4 变量。我尝试用上面相同的方式将 2 个动画放到一个小部件上,结果就是这样。
bool init = false; //This will make button show up
bool pressed = false; //This will make button go up
//Somewhere of codes...
children: [
FlareActor("assets/animation.flr",
animation: "anim",
callback: (name) {
//Notify flare animation is ended
//and make button show up by calling setState
if(name == "anim") {
this.setState(() {
init = true;
});
}
}), //FlareActor
AnimatedContainer(
transform: init ? pressed ? matrixA : matrixB : matrixC, //This is problem
duration: pressed ? Duration(milliseconds: 300) : Duration(millisecons: 150),
child:FlatButton(
child: Text("Press Me"),
onPressed: () {
//Change pressed to true to make it move up
setState(() {
pressed = true;
});
}
) //FlatButton
) //AnimatedContainer
]
我知道这些代码不包含完整的信息(如矩阵A、矩阵B、矩阵C),但我认为这足以让您了解我想要做什么。如果您需要有关代码的更多信息,可以在评论中询问我。我只是将 2 个布尔值放入字段中......它已经开始看起来很复杂,尤其是 AnimatedContainer 中的变换参数。想象一下,每 3 个小部件会有 4 个布尔值,总共有 12 个布尔值,这会使代码变得非常混乱,看起来很复杂。
你可能会问我为什么要尝试将多个动画放到 1 个小部件中,但好吧,仅仅是因为我想让应用更生动,而不仅仅是简单的屏幕切换、对话框、或者无聊的动画。当然,我对此进行了搜索,发现的是 Stream 和 AnimatedBuilder。我不知道 Stream 是否可以帮助我,因为即使我使用 Stream,我也无法直接设置小部件的属性(位置、比例、不透明度)。只需将布尔值发送给侦听器,然后调用 setState(),它就变得和上面一样了。 AnimatedBuilder 看起来不错,但我发现的所有帖子都是关于将动画放入多个小部件,而不是将多个动画放入一个小部件。
以下是问题:
- 这是对 1 个小部件执行多个动画的唯一方法吗?
- 如果第一个问题不是,那么执行此操作的更好(或最佳)方法是什么?
【问题讨论】:
-
我希望你们不要建议将flare作为UI组件...因为这意味着我必须为整个屏幕制作flare,这比像上面添加bools要花费更多时间。