Как я могу оживить спрайт, чтобы перейти к произвольной точке флаттера?
Я пытаюсь научиться использовать анимации со стеком и позиционными переходами во Flutter, и с этой целью я делаю простую игру на основе спрайтов. В настоящее время мои спрайты появляются в конечной позиции их анимации, а не в начале, а затем скользят в конечную позицию.
Мой код выглядит так:
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 анимированных виджетов, каждый из которых использует один и тот же _контроллер, и все они должны перемещаться одновременно.
Спасибо
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),
),
);
Однако я не знаю, как указать начальную точку анимации - кажется, она заканчивается в нужном месте, а иногда начинается в правильном месте, но как заставить ее начать в нужном месте? Я полагаю, что это "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),
),
);
}
1 ответ
Добавление ключа вроде этого, кажется, является ответом на вопрос API, ключ сообщает флаттеру, какой виджет 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),
),
);
}