#flutter #dart #flutter-animation
#флаттер #dart #флаттер-анимация
Вопрос:
Итак, у меня есть изображение в интерактивном средстве просмотра. Я хочу сбрасывать панорамирование и масштабирование каждый раз, когда пользователь заканчивает его изменять. Я успешно могу это сделать, используя TransformationController
onInteractionEnd
обратный вызов and . Однако, конечно, сброс происходит очень резко, поэтому я хотел бы анимировать его, чтобы обеспечить плавный переход. У меня нет опыта работы с анимацией флаттера, и это лучшее, что я мог придумать.
class _PhotoZoom extends State<PhotoZoom> with TickerProviderStateMixin {
TransformationController transformationController =
new TransformationController();
@override
Widget build(BuildContext context) {
return Scaffold(
body: Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
Center(
child: InteractiveViewer(
transformationController: transformationController,
child: Image.network(imageUrl),
onInteractionEnd: (ScaleEndDetails details) {
_resetPanZoom();
},
),
),
],
),
);
}
_resetPanZoom() {
AnimationController animationController =
AnimationController(duration: const Duration(seconds: 2), vsync: this);
Animation<Matrix4> animation = Matrix4Tween(
begin: transformationController.value, end: Matrix4.identity())
.animate(animationController);
transformationController.value = animation.value;
}
}
То, что я пытаюсь сделать, это плавно изменить измененную Matrix4
переменную контроллера Matrix4.identity()
, которая приведет к возврату изображения к исходному панорамированию и масштабированию. Но да, это не работает, поскольку я, вероятно, делаю что-то не так. Каков был бы правильный способ сделать это?
Комментарии:
1. добавьте слушателя к вашему
animation
, внутри этого вызова слушателяtransformationController.value = animation.value
и, наконец, вызовитеanimationController.forward(from: 0.0)
2. на самом деле
animationController.forward()
достаточно, так как его значение0.0
после создания3. конечно, ваше приветствие
4. и, конечно
transformationController.value = animation.value
, должен вызываться только в слушателе, но я полагаю, что вы уже это сделали