I 介绍
一款用户体验好的应用,或多或少都会有一些动画交互体验,而Flutter
也包含了众多的动画类,先让我们看看最近仿写的一个小Demo
Flutter
动画看起来非常的流畅,也很舒服;像要在Flutter
中实现这样的动画并不难,但是相对于在android
中来说就有点捉襟见肘了,虽然实现起来没任何问题,但是代码的量会非常多;
在学习Flutter
的动画前,需要了解几个主要的类:
Animation
Animation
为一个抽象类,它的实现类有很多; 它的主要功能设置动画的监听事件;
AnimationController
AnimationController
类似于Android
中的一个Animation
基类,用于控制动画的时长来显示运动的状态,可以设置动画是正向运动,还是反向运动;相对而言,Flutter
分得更细,控制类只做动画的基础控制,而不去管动画的曲率(Android
中,animation
设置所有的动画参数);
Curve
曲线,曲率;表示一个动画运动的速度快慢,和Android
中的类似,不过Flutter
中定义了比Android
更多的运动曲率:
Tween
在Android
中使用动画,我们经常用ValueAnimation
来拿到动画中提供的数值,在Flutter
中,如果你想使用自己定义的数值,在AnimationController
中定义的通常范围在[0,1],所以就有了Tween
来通过映射的方式来提供数值;
Tween
是一个基础类,它也有多个子类,来创建不同的数值,通过名字我们就能了解到其作用:
II使用
下面,我们通过一个简单的例子来创建一个位移动画:
效果非常简单,这里我贴下代码:
class AnimationState extends State<AnimationDemo> with TickerProviderStateMixin {
late AnimationController animationController;
@override
void initState() {
animationController = AnimationController(vsync: this, duration: const Duration(milliseconds: 5000));
super.initState();
}
@override
Widget build(BuildContext context) {
final curvedAnimation = CurvedAnimation(parent: animationController, curve: Curves.fastOutSlowIn);
final slideTransition = Tween(begin: const Offset(0, 0), end: const Offset(1, 0)).animate(curvedAnimation);
return Scaffold(
appBar: AppBar(
title: const Text("测试使用动画"),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisSize: MainAxisSize.max,
children: [
SlideTransition(
position: slideTransition,
child: const Text(
"我是移动的view",
style: TextStyle(fontSize: 22, color: Colors.red),
),
),
const SizedBox(
height: 100,
),
TextButton(onPressed: () {
animationController.forward();
}, child: const Text("点击开始移动"))
],
),
),
);
}
}
首先,我们需要一个管理动画的类,所以先创建AnimationController
, 设置时间和vsync
,这里我们可以先不了解这个vsync : TickerProvider
是做什么用的,使State
类with
它即可;
然后我们使用了位移动画,所以在创建动画的时候我们使用了SlideTransition
,它需要给一个position
,乍一看是位置,实际上该参数是一个Animation<Offset>
, 所以这里需要传一个Animation
子类,而我们上面介绍了Tween
是管理数值的,需要Animation<Offset>
就是需要一个数值的管理者,通过创建Tween
得知需要两个参数:start / end
;这两个参数也是一个泛型,可以传整形,也可以传Offset
坐标,这里我们对位置进行动画修改,所以传了坐标;
再然后使用animate
方法返回一个animation
animate
方法需要一个Animation<double>
,这里其实是一个曲率,我们看源码可以得知实现类也很多:
我们使用了
CurvedAnimation
, 设置controller
以及curves
曲率运动即可
最后点击按钮调用controller
的 forward()
方法开始我们的动画。