Flutter widget动画效果之CurvedAnimation

在Android中,我们可以用XML来指定动画样式,或者调用View的animate()方法。在Flutter中,widget的动画效果利用animated动画化组件的动画库来实现。
Flutter中,使用AnimationController来控制动画暂停、调整进度、停止和倒退。AnimationController继承自Animation<double>
在vsync信号发出时,需要一个触发器来通知它,从而在每帧中产生一个0到1的线性差值。
一个Controller可以与多个动画进行关联。

当整个屏幕刷新完毕,即一个垂直刷新周期完成,会有短暂的空白期,此时发出 VSync 信号。

动画样式示例 - CurvedAnimation与FadeTransition

CurvedAnimation实现一个动画效果。
给widget指定动画效果,用Controller来控制动画的播放。
下面这个例子是关于FadeTransition的。用一个FloatingActionButton来控制动画播放。

import 'package:flutter/material.dart';

void main() => runApp(new AnimationApp());

class AnimationApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Animation',
      theme: new ThemeData(primarySwatch: Colors.blue),
      home: new HomePage(
        title: '动画示例',
      ),
    );
  }
}

class HomePage extends StatefulWidget {
  final String title;

  HomePage({Key key, this.title}) : super(key: key);

  @override
  State<StatefulWidget> createState() => new _HomePageState();
}

// 需要Ticker
class _HomePageState extends State<HomePage> with TickerProviderStateMixin {
  AnimationController controller;
  CurvedAnimation curveEaseIn, bounceIn, linear, decelerate;
  bool _animationFlag = true;

  @override
  void initState() {
    super.initState();
    controller = new AnimationController(
        duration: new Duration(milliseconds: 2000), vsync: this);
    curveEaseIn = new CurvedAnimation(parent: controller, curve: Curves.easeIn);
    bounceIn = new CurvedAnimation(parent: controller, curve: Curves.bounceIn);
    linear = new CurvedAnimation(parent: controller, curve: Curves.linear);
    decelerate =
        new CurvedAnimation(parent: controller, curve: Curves.decelerate);
  }

  @override
  Widget build(BuildContext context) {
    buildItemWidget(
        CurvedAnimation animation, MaterialColor color, String itemText) {
      return new Column(
        children: <Widget>[
          new FadeTransition(
            opacity: animation,
            child: new FlutterLogo(
              size: 100.0,
              colors: color,
            ),
          ),
          new Text(itemText)
        ],
      );
    }

    return new Scaffold(
      appBar: new AppBar(
        title: new Text(widget.title),
      ),
      floatingActionButton: new FloatingActionButton(
        onPressed: () {
          if (_animationFlag) {
            controller.forward();
          } else {
            controller.reverse();
          }
          _animationFlag = !_animationFlag;
        },
        child: new Icon(Icons.star),
      ),
      body: new Center(
        child: new GridView.extent(
          maxCrossAxisExtent: 170.0,
          padding: const EdgeInsets.all(12.0),
          children: <Widget>[
            buildItemWidget(curveEaseIn, Colors.blue, 'Curves.easeIn'),
            buildItemWidget(bounceIn, Colors.amber, 'Curves.bounceIn'),
            buildItemWidget(linear, Colors.red, 'Curves.linear'),
            buildItemWidget(decelerate, Colors.indigo, 'Curves.decelerate'),
            buildItemWidget(
                new CurvedAnimation(
                    parent: controller, curve: Curves.elasticIn),
                Colors.pink,
                'Curves.elasticIn'),
            buildItemWidget(
                new CurvedAnimation(parent: controller, curve: Curves.ease),
                Colors.purple,
                'Curves.ease'),
          ],
        ),
      ),
    );
  }
}
效果图1
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明AI阅读 16,033评论 3 119
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,312评论 4 61
  • 踏青时节,千里之行回到乡下。与父母打过招呼,我匆匆放下行李,径直跑到自家菜园,去感受春天的绿色。熟悉的路口...
    风雨同路覃阅读 537评论 0 0
  • 我觉得我是个工作狂。 可能很多工作狂是真的热爱工作,并且热爱工作带来的一切繁琐的小事情。我不是。 我工作狂表现在,...
    集智的月英XD阅读 573评论 0 1
  • 北京玉渊潭公园座落在中央电视塔下。
    闲人老傅阅读 178评论 1 0