我怎样才能让精灵动画移动到颤振中的任意点?
how can I animate a sprite to move to an arbitrary point in flutter?
我正在尝试学习在 Flutter 中使用带有 Stack 和 PositionedTransitions 的动画,为此我正在制作一个简单的基于精灵的游戏。目前我的精灵出现在他们动画的结束位置,而不是在开始然后滑动到结束位置。
我的代码如下所示:
if (lamb != null) {
beginTop = ((lamb.lastY - 1) * roomLength) + lamb.lastY;
beginLeft = ((lamb.lastX - 1) * roomLength) + lamb.lastX;
endTop = ((lamb.y - 1) * roomLength) + lamb.y;
endLeft = ((lamb.x - 1) * roomLength) + lamb.x;
layerAnimation = RelativeRectTween(
begin: RelativeRect.fromLTRB(beginLeft, beginTop, 0.0, 0.0),
end: RelativeRect.fromLTRB(endLeft, endTop, 0.0, 0.0),
).animate(_controller.view);
return PositionedTransition(
rect: layerAnimation,
child: Text(
lamb.emoji,
style: TextStyle(color: Colors.black, fontSize: roomLength - 12),
),
);
}
我应该在某处调用 _controller.forward()
吗?何时何地?屏幕上最多同时显示 10 个动画小部件,它们都使用相同的 _controller,所有这些都必须同时滑动。
谢谢
PS:下面的代码,而不是 PositionedTransition 的东西,似乎在朝着正确的方向前进:
return AnimatedPositioned(
left: endLeft,
top: endTop,
duration: Duration(milliseconds: 900),
child: Text(
widget.maze.minotaur.emoji,
style: TextStyle(color: Colors.black, fontSize: roomLength),
),
);
但是我不知道如何指定动画的起点 - 它似乎在正确的位置结束,有时在正确的位置开始,但如何强制它从正确的位置开始? A "Tween" 我想,但如果是这样,我不确定如何连接它。
或者像这样添加密钥,到目前为止似乎有所帮助:
return AnimatedPositioned(
key: Key('uniquekey'),
left: endLeft,
top: endTop,
curve: Curves.linear,
duration: Duration(milliseconds: 900),
child: Text(
widget.maze.minotaur.emoji,
style: TextStyle(color: Colors.black, fontSize: roomLength),
),
);
}
像这样添加一个键,似乎是 API 问题的答案,键告诉 flutter 在更新之间哪个 AnimatedPositioned 小部件是哪个,这样它就可以知道每个部件从哪里开始它的旅程,如果没有它,每个部件都是每次更新都有新的,旧的已经消失,所以没有开始位置可以使用:
return AnimatedPositioned(
key: Key('uniquekey'),
left: endLeft,
top: endTop,
curve: Curves.linear,
duration: Duration(milliseconds: 900),
child: Text(
widget.maze.minotaur.emoji,
style: TextStyle(color: Colors.black, fontSize: roomLength),
),
);
}
我正在尝试学习在 Flutter 中使用带有 Stack 和 PositionedTransitions 的动画,为此我正在制作一个简单的基于精灵的游戏。目前我的精灵出现在他们动画的结束位置,而不是在开始然后滑动到结束位置。
我的代码如下所示:
if (lamb != null) {
beginTop = ((lamb.lastY - 1) * roomLength) + lamb.lastY;
beginLeft = ((lamb.lastX - 1) * roomLength) + lamb.lastX;
endTop = ((lamb.y - 1) * roomLength) + lamb.y;
endLeft = ((lamb.x - 1) * roomLength) + lamb.x;
layerAnimation = RelativeRectTween(
begin: RelativeRect.fromLTRB(beginLeft, beginTop, 0.0, 0.0),
end: RelativeRect.fromLTRB(endLeft, endTop, 0.0, 0.0),
).animate(_controller.view);
return PositionedTransition(
rect: layerAnimation,
child: Text(
lamb.emoji,
style: TextStyle(color: Colors.black, fontSize: roomLength - 12),
),
);
}
我应该在某处调用 _controller.forward()
吗?何时何地?屏幕上最多同时显示 10 个动画小部件,它们都使用相同的 _controller,所有这些都必须同时滑动。
谢谢
PS:下面的代码,而不是 PositionedTransition 的东西,似乎在朝着正确的方向前进:
return AnimatedPositioned(
left: endLeft,
top: endTop,
duration: Duration(milliseconds: 900),
child: Text(
widget.maze.minotaur.emoji,
style: TextStyle(color: Colors.black, fontSize: roomLength),
),
);
但是我不知道如何指定动画的起点 - 它似乎在正确的位置结束,有时在正确的位置开始,但如何强制它从正确的位置开始? A "Tween" 我想,但如果是这样,我不确定如何连接它。 或者像这样添加密钥,到目前为止似乎有所帮助:
return AnimatedPositioned(
key: Key('uniquekey'),
left: endLeft,
top: endTop,
curve: Curves.linear,
duration: Duration(milliseconds: 900),
child: Text(
widget.maze.minotaur.emoji,
style: TextStyle(color: Colors.black, fontSize: roomLength),
),
);
}
像这样添加一个键,似乎是 API 问题的答案,键告诉 flutter 在更新之间哪个 AnimatedPositioned 小部件是哪个,这样它就可以知道每个部件从哪里开始它的旅程,如果没有它,每个部件都是每次更新都有新的,旧的已经消失,所以没有开始位置可以使用:
return AnimatedPositioned(
key: Key('uniquekey'),
left: endLeft,
top: endTop,
curve: Curves.linear,
duration: Duration(milliseconds: 900),
child: Text(
widget.maze.minotaur.emoji,
style: TextStyle(color: Colors.black, fontSize: roomLength),
),
);
}