Flutter之Animation

先上例子

import 'package:flutter/material.dart';

class LoaderAnimations extends StatefulWidget {


  @override
  _LoaderAnimationsState createState() => _LoaderAnimationsState();
}

class _LoaderAnimationsState extends State<LoaderAnimations> with SingleTickerProviderStateMixin{
  //with是dart的关键字,意思是混入的意思,就是说可以将一个或者多个类的功能添加到自己的类无需继承这些类,避免多重继承导致的问题。可以在https://stackoverflow.com/questions/21682714/with-keyword-in-dart中找到答案
  //为什么是SingleTickerProviderStateMixin呢,因为初始化animationController的时候需要一个TickerProvider类型的参数Vsync参数,所以我们混入了TickerProvider的子类SingleTickerProviderStateMixin
  AnimationController animationController;//该对象管理着animation对象
  Animation<double> animation;//该对象是当前动画的状态,例如动画是否开始,停止,前进,后退。但是绘制再屏幕上的内容不知道
  // 初始化
  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    // vsync在此处时忽略不必要的情况
    animationController = new AnimationController(duration: new Duration(microseconds: 200),vsync: this);
    // curve 曲线是定义动画的动作,也就说动画是非线性运动
    animation = new CurvedAnimation(parent: animationController, curve: Curves.fastOutSlowIn);
    // 添加监听器
    animation.addListener((){
      // 当动画值发生变化时调用setState
      this.setState(() {
        print('我在变');
      });
    });

    //只显示动画一次,根据调用setState的打印情况就会知道。重载就会使其激活,自己的见解,需思量
    animationController.forward();
    //重复不断的效果,调用setState的打印效果显示
    animationController.repeat();
  }

  // 销毁生命周期
  @override
  void dispose() {
    // TODO: implement dispose
    super.dispose();
    animationController.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      child: new Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          new Container(
            color: Colors.red,
            height: 50.0,
            width: animation.value *100,// animation.value的值是0到1,*100是具体的大小
          ),
          new Padding(padding: const EdgeInsets.only(bottom: 5.0)),
          new Container(
            color: Colors.green,
            height: 50.0,
            width: animation.value * 50,
          ),
          new Padding(padding: const EdgeInsets.only(bottom: 5.0)),
          new Container(
            color: Colors.white,
            height: 50.0,
            width: animation.value * 10,
          )
        ],
      ),
    );
  }
}

Tween在被动画对象使用的范围之间进行插值,例如,可以定义红色到蓝色或者0-255的插值(颜色渐变的动画效果),也可以定义从小到大或者从大到小的插值。

小技巧之一,当想使用动画无限播放,可使用添加状态监听.

animation = Tween(begin: 50.0, end: 200.0).animate(curve)
      ..addListener(() {
        setState(() {});
      })
      ..addStatusListener((status) {
        if (status == AnimationStatus.completed) {
          controller.reverse();
        } else if (status == AnimationStatus.dismissed) {
          controller.forward();
        }
      });

技巧之二:使用动画渐变

controller = AnimationController(
        duration: const Duration(milliseconds: 3000), vsync: this);
    animation = ColorTween(begin: Colors.redAccent, end: Colors.blue).animate(
        controller)
      ..addListener(() {
        setState(() {});
      });
    controller.forward();
child: Container(
        decoration: BoxDecoration(
            color: animation.value
        ),
        margin: EdgeInsets.symmetric(vertical: 10.0),
        height: 200.0,
        width: 200.0,
      ),

Tween在被动画对象使用的范围之间进行插值,例如,可以定义红色到蓝色或者0-255的插值(颜色渐变的动画效果),也可以定义从小到大或者从大到小的插值。
如果控制使用forward()则重新加载会调用,如果控制使用repeat()则会不断的重复曲线绘制的效果

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值