как я могу анимировать спрайт, чтобы он перемещался в произвольную точку во флаттере?

Я пытаюсь научиться использовать Animations with Stack и PositionedTransitions во 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 анимированных виджетов, использующих один и тот же _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),
        ),
      );

Однако я не знаю, как указать начальную точку анимации - кажется, что она заканчивается в нужном месте, а иногда начинается в нужном месте, но как заставить ее начинаться в нужном месте? Полагаю, "подросток", но если так, я не уверен, как это подцепить. Или добавление такого ключа, похоже, пока помогает:

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),
    ),
  );
}

person lost baby    schedule 26.07.2019    source источник


Ответы (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),
    ),
  );
}
person lost baby    schedule 29.07.2019