flutter SlideTransition实现平移动画

更多文章请查看 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实现平移动画_第1张图片

移动前
flutter SlideTransition实现平移动画_第2张图片
移动后
flutter SlideTransition实现平移动画_第3张图片

源码

  //动画控制器
  AnimationController controller;
  Animation 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实现平移动画_第4张图片

    //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实现平移动画_第5张图片


3 垂直向下平移
animation =
        Tween(begin: Offset(0, 0), end: Offset(0, 1)).animate(controller);
在这里插入代码片

flutter SlideTransition实现平移动画_第6张图片

4 flutter 无限循环的平移动画

widget 平移到终点后,再回到起点再次发起平移
关键代码

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

flutter SlideTransition实现平移动画_第7张图片

  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实现平移动画_第8张图片

    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");
      }
    });

你可能感兴趣的:(flutter,flutter,从入门,到精通)