​更多文章请查看 flutter从入门 到精通​

flutter 动画状态监听器

AnimationController

    //动画控制器
AnimationController controller;
//AnimationController是一个特殊的Animation对象,在屏幕刷新的每一帧,就会生成一个新的值,
// 默认情况下,AnimationController在给定的时间段内会线性的生成从0.0到1.0的数字
//用来控制动画的开始与结束以及设置动画的监听
//vsync参数,存在vsync时会防止屏幕外动画(动画的UI不在当前屏幕时)消耗不必要的资源
//duration 动画的时长,这里设置的 seconds: 2 为2秒,当然也可以设置毫秒 milliseconds:2000.
controller =
AnimationController(duration: const Duration(seconds: 2), vsync: this);
//动画开始、结束、向前移动或向后移动时会调用StatusListener
controller.addStatusListener((status) {
if (status == AnimationStatus.completed) {
//动画从 controller.reverse() 反向执行 结束时会回调此方法
print("status is completed");
// controller.reset(); 将动画重置到开始前的状态
//开始执行
//controller.forward();
} else if (status == AnimationStatus.dismissed) {
//动画从 controller.forward() 正向执行 结束时会回调此方法
print("status is dismissed");
//controller.forward();
}else if (status == AnimationStatus.forward) {
print("status is forward");
//执行 controller.forward() 会回调此状态
}else if (status == AnimationStatus.reverse) {
//执行 controller.reverse() 会回调此状态
print("status is reverse");
}
});

AnimationController 的常用操作说明

说明

controller.forward()

正向开始执行动画

controller.reverse()

反向开始执行动画

controller.reset()

重置动画到初始状态

controller.dispose()

取消/停止动画

flutter AnimationStatus 动画状态说明

说明

AnimationStatus.forward

执行 controller.forward() 会回调此状态

AnimationStatus.reverse

执行 controller.reverse() 会回调此状态

AnimationStatus.dismissed

动画从 controller.reverse() 反向执行 结束时会回调此方法

AnimationStatus.completed)

动画从 controller.forward() 正向执行 结束时会回调此方法


1 水平向右平移

flutter SlideTransition实现平移动画_Flutter项目开发

移动前

flutter SlideTransition实现平移动画_Flutter项目开发_02

移动后

flutter SlideTransition实现平移动画_Flutter教程_03

源码

  //动画控制器
AnimationController controller;
Animation<Offset> animation;

//初始化 
//用来控制动画的开始与结束以及设置动画的监听
//vsync参数,存在vsync时会防止屏幕外动画(动画的UI不在当前屏幕时)消耗不必要的资源
//duration 动画的时长,这里设置的 seconds: 2 为2秒,当然也可以设置毫秒 milliseconds:2000.
controller =
AnimationController(duration: const Duration(seconds: 2), vsync: this);
//动画开始、结束、向前移动或向后移动时会调用StatusListener
controller.addStatusListener((status) {
if (status == AnimationStatus.completed) {
//AnimationStatus.completed 动画在结束时停止的状态
//ontroller.reverse();
} else if (status == AnimationStatus.dismissed) {
//AnimationStatus.dismissed 表示动画在开始时就停止的状态
//controller.forward();
}
});
//begin: Offset.zero, end: Offset(1, 0) 以左下角为参考点,相对于左下角坐标 x轴方向向右 平移执行动画的view 的1倍 宽度,y轴方向不动,也就是水平向右平移
//begin: Offset.zero, end: Offset(1, 1) 以左下角为参考点,相对于左下角坐标 x轴方向向右 平移执行动画的view 的1倍 宽度,y轴方向 向下 平衡执行动画view 的1倍的高度,也就是向右下角平移了
animation =
Tween(begin: Offset.zero, end: Offset(1, 0)).animate(controller);

//开始执行动画
controller.forward();

执行动画的view



//平移
Widget buildSlideTransition() {
return Center(
//SlideTransition 用于执行平移动画
child: SlideTransition(
position: animation,
//将要执行动画的子view
child: Container(
width: 200,
height: 200,
color: Colors.grey,
),
),
);
}


flutter SlideTransition实现平移动画_Flutter教程_04

    //begin: Offset(1, 0), end: Offset(1, 1) 在构建布局页面的时候,执行动画的view 会先相对于自身左下角水平向右移动 执行动画的view 的1倍 宽度,
//动画开始后 再次 移动到 end: Offset(1, 1)
animation =
Tween(begin: Offset(1, 0), end: Offset(1, 1)).animate(controller);


2 向右下角平移

//相对于左下角,起始位置相对无平移,终点分别向右向下移动 1倍的宽度与高度,效果即为右下角平移
animation =
Tween(begin: Offset(0, 0), end: Offset(1, 1)).animate(controller);

flutter SlideTransition实现平移动画_Flutter教程_05


3 垂直向下平移

animation =
Tween(begin: Offset(0, 0), end: Offset(0, 1)).animate(controller);

在这里插入代码片

flutter SlideTransition实现平移动画_Flutter项目开发_06

4 flutter 无限循环的平移动画

widget 平移到终点后,再回到起点再次发起平移

关键代码

  //将动画重置到开始前的状态
controller.reset();
//开始执行
controller.forward();

flutter SlideTransition实现平移动画_Flutter项目开发_07

  controller =
AnimationController(duration: const Duration(seconds: 2), vsync: this);
//动画开始、结束、向前移动或向后移动时会调用StatusListener
controller.addStatusListener((status) {
if (status == AnimationStatus.completed) {
//动画从 controller.forward() 正向执行 结束时会回调此方法
print("status is completed");
//将动画重置到开始前的状态
controller.reset();
//开始执行
controller.forward();
} else if (status == AnimationStatus.dismissed) {
//动画从 controller.reverse() 反向执行 结束时会回调此方法
print("status is dismissed");
//controller.forward();
} else if (status == AnimationStatus.forward) {
print("status is forward");
//执行 controller.forward() 会回调此状态
} else if (status == AnimationStatus.reverse) {
//执行 controller.reverse() 会回调此状态
print("status is reverse");
}
});
//begin: Offset.zero, end: Offset(1, 0) 以左下角为参考点,相对于左下角坐标 x轴方向向右 平移执行动画的view 的1倍 宽度,
// y轴方向不动,也就是水平向右平移

//begin: Offset.zero, end: Offset(1, 1) 以左下角为参考点,相对于左下角坐标 x轴方向向右 平移执行动画的view 的1倍 宽度,
// y轴方向 向下 平衡执行动画view 的1倍的高度,也就是向右下角平移了

//begin: Offset(1, 0), end: Offset(1, 1) 在构建布局页面的时候,执行动画的view 会先相对于自身左下角水平向右移动 执行动画的view 的1倍 宽度,
//动画开始后 再次 移动到 end: Offset(1, 1)
animation =
Tween(begin: Offset(0, 0), end: Offset(0, 1)).animate(controller);

执行动画的widget

  //平移
Widget buildSlideTransition() {
return Center(
child: SlideTransition(
position: animation,
//将要执行动画的子view
child: Container(
width: 200,
height: 200,
color: Colors.grey,
),
),
);
}


动画执行到终点后,再由终点反向回到起点

flutter SlideTransition实现平移动画_Flutter项目开发_08

    controller =
AnimationController(duration: const Duration(seconds: 2), vsync: this);
//动画开始、结束、向前移动或向后移动时会调用StatusListener
controller.addStatusListener((status) {
if (status == AnimationStatus.completed) {
//动画从 controller.forward() 正向执行 结束时会回调此方法
print("status is completed");
//将动画重置到开始前的状态
controller.reverse();
} else if (status == AnimationStatus.dismissed) {
//动画从 controller.reverse() 反向执行 结束时会回调此方法
print("status is dismissed");
controller.forward();
} else if (status == AnimationStatus.forward) {
print("status is forward");
//执行 controller.forward() 会回调此状态
} else if (status == AnimationStatus.reverse) {
//执行 controller.reverse() 会回调此状态
print("status is reverse");
}
});