美文网首页Flutter
轻松flutter 之 时间处理 | 动画 | 启动页

轻松flutter 之 时间处理 | 动画 | 启动页

作者: 熊爸天下_56c7 | 来源:发表于2020-05-14 14:52 被阅读0次

    一. 计时器

    要使用计时器先要导入dart:async包,
    整个计时器体验和JS基本一致

    1. Duration 间隔

    这里先介绍一个dart自带的类: Duration

    2. Timer 计时器

    再介绍一个dart自带的非常好用的类Timer,

    Timer(间隔, 回调)

    import 'dart:async';
    
        final timeout = Duration(seconds: 3);
        Timer(timeout, () {
          print("时间到,我被执行了!");
        });
    

    二. 动画

    flutter动画分为两大类:

    • 补间动画(Tween)
    • 基于物理的动画

    在为widget添加动画之前,先让我们认识下动画的几个朋友:

    • Animation:是Flutter动画库中的一个核心类,它生成指导动画的值;
    • CurvedAnimationAnimation的一个子类,将过程抽象为一个非线性曲线;
    • AnimationControllerAnimation的一个子类,用来管理Animation
    • Tween:在正在执行动画的对象所使用的数据范围之间生成值。例如,Tween可生成从红到蓝之间的色值,或者从0到255;

    1. Animation //动画过程

    在Flutter中,Animation对象本身和UI渲染没有任何关系。Animation是一个抽象类,它拥有其当前值和状态(完成或停止)。

    • Animation还可以生成除double之外的其他类型值,如:Animation<Color>()Animation<Size>()
    • Animation对象有状态。可以通过访问其value属性获取动画的当前值;
    • Animation对象本身和UI渲染没有任何关系;

    2. CurvedAnimation //非线性动画曲线

    里面传入一个控制器和一个曲线类型

    final CurvedAnimation curve =
        new CurvedAnimation(parent: controller, curve: Curves.easeIn);
    

    3. AnimationController //动画控制器

    AnimationController是一个特殊的Animation对象,在屏幕刷新的每一帧,就会生成一个新的值。默认情况下,AnimationController在给定的时间段内会线性的生成从0.0到1.0的数字。 例如,下面代码创建一个Animation对象:

    final AnimationController controller = new AnimationController(
        duration: const Duration(milliseconds: 2000), vsync: this);
    

    AnimationController派生自Animation<double>,因此可以在需要Animation对象的任何地方使用。 但是,AnimationController具有控制动画的其他方法:

    • forward():启动动画;
    • reverse({double from}):倒放动画;
    • reset():重置动画,将其设置到动画的开始位置;
    • stop({ bool canceled = true }):停止动画;

    当创建一个AnimationController时,需要传递一个vsync参数,存在vsync时会防止屏幕外动画消耗不必要的资源,可以将stateful对象作为vsync的值。

    4. Tween

    默认情况下,AnimationController对象的范围从0.0到1.0。

    如果您需要不同的范围或不同的数据类型,则可以使用Tween来配置动画以生成不同的范围或数据类型的值。例如,以下示例,Tween生成从-200.0到0.0的值:

    final Tween doubleTween = new Tween<double>(begin: -200.0, end: 0.0);
    

    Tween是一个无状态(stateless)对象,需要beginend值。Tween的唯一职责就是定义从输入范围到输出范围的映射。输入范围通常为0.0到1.0,但这不是必须的。

    Tween继承自Animatable<T>,而不是继承自Animation<T>AnimatableAnimation相似,不是必须输出double值。例如,ColorTween指定两种颜色之间的过渡。

    final Tween colorTween =
        new ColorTween(begin: Colors.transparent, end: Colors.black54);
    

    Tween对象不存储任何状态。相反,它提供了evaluate(Animation<double> animation)方法将映射函数应用于动画当前值。 Animation对象的当前值可以通过value()方法取到。evaluate函数还执行一些其它处理,例如分别确保在动画值为0.0和1.0时返回开始和结束状态。

    说了这么多,到底该怎么用????

    1. 我们必须要混入SingleTickerProviderStateMixin
    2. 我们要创建一个动画
    3. 要创建yi
    4. 我们可以为动画添加状态 或者 数值的监听(也可以不监听)

    下面的例子是一个线性的动画的例子.

    import 'package:flutter/material.dart';
    
    void main() => runApp(MyApp());
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter Demo',
          theme: ThemeData(
            primarySwatch: Colors.blue,
          ),
          home: MyHomePage(),
        );
      }
    }
    
    class MyHomePage extends StatefulWidget {
      @override
      _MyHomePageState createState() => _MyHomePageState();
    }
    
    class _MyHomePageState extends State<MyHomePage>
        with SingleTickerProviderStateMixin {
      //动画控制器需要传入 async, 要达到这一目的_MyHomePageState必须混合 SingleTickerProviderStateMixin
      Animation<double> animation; //创建了一个泛double型的Animation类对象
      AnimationController controller; //创建了一个动画控制器 AnimationController类型
      AnimationStatus animationState; //创建了一个动画状态 AnimationStatus类型
      double animationValue; //一个double类型的数值, 用来展示动画的状态进度值
    
      @override
      void initState() {
        super.initState();
        controller = //初始化进程中为控制器做初始化.
            AnimationController(duration: const Duration(seconds: 2), vsync: this);
        animation = Tween<double>(begin: 0, end: 300)
            .animate(controller) //用一个Tween生成了一个Animation动画,同时给他了一个controller
              ..addListener(() {
                //创建完动画后, 为其添加一个监听,
                setState(() {
                  animationValue = animation.value; 
                  //在这个监听里, 将这个动画的value赋值给之前创建的double数据animationValue
                });
              })
              ..addStatusListener((AnimationStatus state) {
                //然后又为动画添加了一个状态监听
                setState(() {
                  animationState = state; //把动画的状态赋值给我们之前创建的动画状态对象animationState
                });
              });
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text("动画"),
          ),
          body: Center(
            child: Column(
              children: <Widget>[
                RaisedButton(
                    child: Text('点击触发动画'),
                    onPressed: () {
                      controller.reset(); //点击时先复位动画
                      controller.forward(); //点击时先复位动画后播放
                    }),
                Row(
                  children: <Widget>[
                    Text('State:' + animationState.toString()), //用一个text展示一下状态
                  ],
                ),
                Row(
                  children: <Widget>[
                    Text('Value:' + animationValue.toString()), //用一个text展示一下动画值
                  ],
                ),
                Container(
                  height: animation.value, //这容器的高和宽都是跟随动画变化的.
                  width: animation.value,
                  child: FlutterLogo(), //用这个图片来展示一下容器的变化
                ),
              ],
            ),
          ),
        );
      }
    
      @override
      void dispose() {
        //当控件解散时把控制器销毁掉
        controller.dispose();
        super.dispose();
      }
    }
    

    三. Android启动页

    调用原生的安卓启动页并按照本地平台机制展示, 效果如下:

    方法:

      1. 放一张图片在...\android\app\src\main\res\drawable\splashimg.jpg
      1. android\app\src\main\res\drawable\launch_background.xml中引用这张图片

    相关文章

      网友评论

        本文标题:轻松flutter 之 时间处理 | 动画 | 启动页

        本文链接:https://www.haomeiwen.com/subject/vcjaghtx.html