📅  最后修改于: 2023-12-03 15:30:49.661000             🧑  作者: Mango
Flutter 可以轻松实现多种类型的动画,例如补间动画、物理模拟等。
补间动画是通过将起始和结束的值进行平滑地转换来创建动画效果的一种方式。在 Flutter 中,Animation
类和其子类可以用于实现补间动画。
Tween
是一个对值进行线性插值的类,它可以用于在两个值之间产生平滑的动画。
例如,以下代码将会在 2 秒内将一个容器从高度为 0.0 变为高度为 200.0:
class MyWidget extends StatefulWidget {
@override
_MyWidgetState createState() => _MyWidgetState();
}
class _MyWidgetState extends State<MyWidget>
with SingleTickerProviderStateMixin {
late AnimationController _controller;
late Animation<double> _animation;
@override
void initState() {
super.initState();
_controller = AnimationController(
vsync: this,
duration: const Duration(seconds: 2),
);
_animation = Tween(begin: 0.0, end: 200.0).animate(_controller)
..addListener(() {
setState(() {});
});
_controller.forward();
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Container(
height: _animation.value,
color: Colors.blue,
);
}
}
CurvedAnimation
可用于在动画的启动和停止之间应用曲线。
例如,以下代码将会在 2 秒内将一个容器从高度为 0.0 变为高度为 200.0,并在动画开始时使用一个缓入曲线,并在动画结束时使用一个缓出曲线:
class MyWidget extends StatefulWidget {
@override
_MyWidgetState createState() => _MyWidgetState();
}
class _MyWidgetState extends State<MyWidget>
with SingleTickerProviderStateMixin {
late AnimationController _controller;
late Animation<double> _animation;
@override
void initState() {
super.initState();
_controller = AnimationController(
vsync: this,
duration: const Duration(seconds: 2),
);
_animation = Tween(begin: 0.0, end: 200.0).animate(
CurvedAnimation(
parent: _controller,
curve: Curves.easeInOut,
reverseCurve: Curves.easeInOut,
),
)
..addListener(() {
setState(() {});
});
_controller.forward();
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Container(
height: _animation.value,
color: Colors.blue,
);
}
}
Flutter 可以使用 AnimatedPhysics
来模拟物理运动,并产生动画效果。
例如,以下代码将在 2 秒内将一个容器从高度为 0.0 变为高度为 200.0,使用一个比较真实的物理模拟效果:
class MyWidget extends StatefulWidget {
@override
_MyWidgetState createState() => _MyWidgetState();
}
class _MyWidgetState extends State<MyWidget>
with SingleTickerProviderStateMixin {
late AnimationController _controller;
late Animation<double> _animation;
@override
void initState() {
super.initState();
_controller = AnimationController(
vsync: this,
duration: const Duration(seconds: 2),
);
_animation = Tween(begin: 0.0, end: 200.0).animate(
AnimatedPhysics(
parent: _controller,
velocity: 0.0,
),
)
..addListener(() {
setState(() {});
});
_controller.forward();
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Container(
height: _animation.value,
color: Colors.blue,
);
}
}