Flutter的菜鸟教程十九:动画-监视动画的过程

本文开始学习Flutter动画

  1. 渲染动画*
  2. AnimatedWidget简化
  3. 监视动画的过程(根据动画的状态 例如启动 停止 和翻转方向)
  4. 用AnimatedBuilder重构
  5. 并行动画

/**
 * 动画实例3-监视动画的过程(根据动画的状态 例如启动 停止 和翻转方向)
 */
import 'package:flutter/material.dart';
import 'package:flutter/animation.dart';

void main() {
  runApp(new LogoApp());
}

/**
 * AnimatedWidget会自动调用addlistener和setState
 */
class AnimatedLogo extends AnimatedWidget {
  @override
  Widget build(BuildContext context) {
    final Animation animation = listenable;
    return new Center(
      child: new Container(
        margin: new EdgeInsets.symmetric(vertical: 10.0),
        height: animation.value,
        width: animation.value,
        child: new FlutterLogo(),
      ),
    );
  }

  AnimatedLogo({Key key, Animation animation})
      : super(key: key, listenable: animation);
}

class LogoApp extends StatefulWidget {
  @override
  State createState() {
    return new _LogoAppState();
  }
}

class _LogoAppState extends State<LogoApp> with SingleTickerProviderStateMixin {
  AnimationController controller;
  Animation animation;

  @override
  void initState() {
    super.initState();
    controller = new AnimationController(
        vsync: this, duration: const Duration(milliseconds: 2000));
    animation = new Tween(begin: 0.0, end: 300.0).animate(controller)
    //添加了状态监听
      ..addStatusListener((state) {
        //当动画结束时执行动画反转
        if (state == AnimationStatus.completed) {
          controller.reverse();
          //当动画在开始处停止再次从头开始执行动画
        } else if (state == AnimationStatus.dismissed) {
          controller.forward();
        }
      });
    controller.forward();
  }

  @override
  build(dynamic) {
    return new AnimatedLogo(animation: animation);
  }

  @override
  void dispose() {
    controller.dispose();
    super.dispose();
  }
}



相比较上一篇本文就多了一个状态监听,这里还是再赘述一下,
animation = new Tween(begin: 0.0, end: 300.0).animate(controller)
//添加了状态监听
..addStatusListener((state)的意思是给.animate(controller)的返回值添加监听,那么我们看下源码中
Animation animate(Animation parent) {
return new _AnimatedEvaluation(parent, this);
}

他的返回值是Animation
Animation由值<类型T>和状态组成,状态指示Animation在概念上是从开始到结束还是结束回到开始,当然Animation还允许其他对象监听其值或状态的更改,这里就通过AnimationController和Animation状态配合使动画循环执行
当然他也不止这一个状态监听,这动画的第一文中我们使用了addListener,每次动画的值发生变化时调用
还有对应的取消监听removeListener removeStatusListener
你应该主动尝试去使用他们….

你可能感兴趣的:(Flutter,Flutter的菜鸟教程)