Flutter使用AnimationController来控制动画效果
Flutter提供了一个相对简单易用的AnimatedContainer和SlideTransition来实现简单的动画效果,但是要完全实现定制化的、复杂的动画效果,你还是需要使用一个AnimationController。
今天我们将尝试使用AnimationController来实现一个绘制图像然后返回原点的动画。
创建一个小部件来为其设置动画
在本文的示例中,我们希望允许拖动图像,然后自动返回到其原始位置。
为了实现此任务,我们首先创建一个放置在界面中间的图像。
child: Align( alignment: Alignment.center, child: Card( child: Image(image: AssetImage('images/head.jpg')) ), )
Align 元素在这里用于将图像对象放置在界面的中心。
接下来,我们希望这个小部件可拖动和可放置,因此将此子部件放入 GestureDetector 中,以拉动适当的响应。
Widget build(BuildContext context) { final size = MediaQuery.of(context).size; return GestureDetector( onPanUpdate: (details) { setState(() { _animateAlign += Alignment( details.delta.dx / (size.width / 2), details.delta.dy / (size.height / 2), ); }); }, child: Align( alignment: _animateAlign, child: Card( child: widget.child, ), ), ); }
要实现绘制效果,我们需要在GestureDetector的onPanUpdate方法中改变Align位置,所以需要调用setState方法。
在setState方法中,根据手势位置设置Alignment位置,所以这里需要使用MediaQuery来获取屏幕尺寸。
但是现在的结果是随着运动的运动而运动。我们还需要对图像应用动画效果,在松开手后自动返回到原始位置。
让图像移动
由于这次需要改变的是Alignment,所以我们首先用Alignment定义Animation属性:
late Animation<Alignment> _animation;
接下来我们需要定义AnimationController来处理动画信息,animation并定义us 动画的起点和终点:
late AnimationController _controller; _animation = _controller.drive( AlignmentTween( begin: _animateAlign, end: Alignment.center, ), );
我们的动画起点是当前图像所在的Alignment,终点在Alignment.center。
Alignment 有一个名为 AlignmentTween 的类,专门表示位置信息,如上面的代码所示。
除了开始和结束之外,我们还需要定义如何从开始移动到结束。这里使用Spring效果进行模拟,所以使用SpringSimulation。
SpringSimulation 需要提供弹簧定义、起始距离、结束距离和初始速度。
const spring = SpringDescription( mass: 30, stiffness: 1, damping: 1, ); final simulation = SpringSimulation(spring, 0, 1, -1);
我们使用上面创建的模拟来实现动画:
_controller.animateWith(simulation);
最后,我们需要在动画完成后执行这个动画:
onPanEnd: (details) { _runAnimation(); },
最后,运行输出是这样的:
总结
真元威力强大,但使用起来并不难。我们只需要定义起点和终点,然后定义动画效果即可。
本文示例:https://github.com/ddean2009/learn-flutter.git
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。