动画(Animation)

2020-02-02  本文已影响0人  梦幽辰
class AnimationDemo extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Animation'),
        elevation: 0,
      ),
      body: AnimationDemoHome(),
    );
  }
}
class _AnimationDemoHomeState extends State<AnimationDemoHome> with TickerProviderStateMixin {
  AnimationController animationDemoController;
  Animation animation;
  Animation animationColor;
  CurvedAnimation curve;

  @override
  void initState() {
    super.initState();

    animationDemoController = AnimationController(
      // value: 32,
      // lowerBound: 32,
      // upperBound: 100,
      duration: Duration(seconds: 1),
      vsync: this,
    );

    curve = 
        CurvedAnimation(parent: animationDemoController, curve: Curves.bounceOut);

    // Tween中只能使用double
    animation = Tween(begin: 32.0, end: 100.0).animate(curve);
    animationColor = 
        ColorTween(begin: Colors.red, end: Colors.red[900])
        .animate(curve);

    // animationDemoController.addListener(() {
    //   // print('${animationDemoController.value}');
    //   setState(() {});
    // });

    animationDemoController.addStatusListener((AnimationStatus status) {
      print(status);
    });

    // animationDemoController.forward(); // 开始播放动画
  }

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

    animationDemoController.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Center(
      child: AnimatedHeart(
        animations: [
          animation,
          animationColor
        ],
        controller: animationDemoController,
      )
    );
  }
}
class AnimatedHeart extends AnimatedWidget{
  final List animations;
  final AnimationController controller;

  AnimatedHeart({
    this.animations,
    this.controller,
  }): super(listenable: controller);

  @override
  Widget build(BuildContext context) {
    return IconButton(
        icon: Icon(Icons.favorite),
        iconSize: animations[0].value,
        color: animations[1].value,
        onPressed: () {
          switch (controller.status) {
            case AnimationStatus.completed:
              controller.reverse(); // 反转播放动画
              break;
            default:
              controller.forward();
          }
        },
      );
  }
}
上一篇 下一篇

猜你喜欢

热点阅读