三、Flutter 动画

Flutter动画类型

动画分为两类:基于tween或基于物理的。以下部分解释了这些术语的含义,并指出您可以在其中了解更多信息的资源。在某些情况下,我们目前最好的文档是Flutter图库中的示例代码。

tween动画

介于两者之间的简称。在补间动画中,定义了开始点和结束点,以及时间线和定义转换时间和速度的曲线。该框架计算如何从开始点过渡到结束点。

上面列出的文档(如动画教程)并不是关于补间,特别是,但他们在其示例中使用补间。

基于物理的动画

在基于物理学的动画中,运动被模拟为与真实世界的行为相似。例如,当你掷球时,它在何处落地,取决于抛球速度有多快,有多沉重,距离地面有多远。类似地,将连接在弹簧上的球落下(并弹跳)与将连接到绳上的球放下的方式不同。

颤振画廊

在材质组件下,网格示例演示了一个动画。从网格中选择其中一个图像并放大。您可以用甩手或拖动手势平移图像。

另请参阅AnimationController.animateWith和SpringSimulation的API文档。

Hero animation(英雄动画)

英雄指的是在屏幕之间飞行的小部件。

使用Flutter's Hero小部件创建英雄动画。

将英雄从一个屏幕飞到另一个屏幕。

将英雄的形状从圆形转换为矩形,同时将其从一个屏幕飞到另一个屏幕的过程中进行动画处理。

Flutter中的Hero小部件实现了通常称为共享元素转换或共享元素动画的动画风格。

1️⃣ 基本的动画概念和类

重点是什么?

Animation对象是Flutter动画库中的一个核心类,它内插用于指导动画的值。

Animation对象知道动画的当前状态(例如,它是开始,停止还是向前或向后移动),但不知道屏幕上显示的内容。

AnimationController管理动画。

CurvedAnimation将进展定义为非线性曲线。

Tween在正在动画的对象所使用的数据范围之间进行插值。 例如,Tween可能会定义从红到蓝的插值,或者从0到255。

使用Listeners和StatusListeners监视动画状态更改。

Animation

在Flutter中,动画对象对屏幕上的内容一无所知。 动画是一个抽象类,它理解其当前价值和状态(完成或解散)。 其中一个比较常用的动画类型是Animation 。

Flutter中的Animation对象是一个在一定时间内依次生成两个值之间的插值数字的类。 动画对象的输出可以是线性的,曲线,步进函数或任何其他可以设计的映射。 根据动画对象的控制方式,它可以反向运行,甚至可以在中间切换方向。

动画还可以插入除double之外的其他类型,例如Animation 或Animation 。

动画对象具有状态。 其当前值始终在.value成员中可用。

一个Animation对象对渲染或build()函数一无所知。

2️⃣AnimationController

AnimationController是一个特殊的Animation对象,只要硬件准备好新帧,就会生成一个新的值。 默认情况下,AnimationController在给定的持续时间内线性生成从0.0到1.0的数字。 例如,此代码创建一个Animation对象,但不会启动它运行:

final AnimationController controller = new AnimationController(

    duration: const Duration(milliseconds: 2000), vsync: this);

3️⃣Tween

默认情况下,AnimationController对象的范围从0.0到1.0。 如果您需要不同的范围或不同的数据类型,则可以使用补间来配置动画以插入到不同的范围或数据类型。 例如,以下Tween从-200.0变为0.0:

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

Tween从Animatable继承,而不是从Animation继承。 Animatable与动画一样,不需要输出两倍。 例如,ColorTween指定两种颜色之间的进展。

final Tween colorTween =

    new ColorTween(begin: Colors.transparent, end: Colors.black54);

要使用Tween对象,请在Tween上调用animate(),传入控制器对象。 例如,以下代码在500毫秒的过程中生成从0到255的整数值。

final AnimationController controller = new AnimationController(

    duration: const Duration(milliseconds: 500), vsync: this);

Animation alpha = new IntTween(begin: 0, end: 255).animate(controller);

注意 :Notice that animate() 返回的是一个 an Animation, not an Animatable.

以下示例显示了一个控制器,一条曲线和一个Tween:

final AnimationController controller = new AnimationController(

    duration: const Duration(milliseconds: 500), vsync: this);

final Animation curve =

    new CurvedAnimation(parent: controller, curve: Curves.easeOut);

Animation alpha = new IntTween(begin: 0, end: 255).animate(curve);

4️⃣Animation notifications

一个Animation对象可以有Listeners和StatusListeners,它们分别由addListener()和addStatusListener()定义。 只要动画的值发生变化,就会调用监听器。 Listener最常见的行为是调用setState()来重建。 动画开始,结束,向前移动或向后移动(如AnimationStatus所定义)时会调用StatusListener。 下一节有addListener()方法的示例,<监视动画的进度显示https://flutter.io/tutorials/animation/#monitoring>了addStatusListener()的示例。

重点是什么

使用addStatusListener来处理动画状态更改的通知,例如启动,停止或反转方向。

当动画完成或返回其开始状态时,通过反转方向在无限循环中运行动画。

5️⃣用AnimatedWidget简化

如何使用AnimatedWidget帮助器类(而不是addListener()和setState())来创建动画的控件。

使用AnimatedWidget创建一个可执行可重用动画的小部件。 要从小部件中分离出转换,请使用AnimatedBuilder。

Flutter API中AnimatedWidgets的示例:AnimatedBuilder,AnimatedModalBarrier,DecoratedBoxTransition,FadeTransition,PositionedTransition,RelativePositionedTransition,RotationTransition,ScaleTransition,SizeTransition,SlideTransition。

AnimatedWidget类允许您在setState()调用中从动画代码中分离出小部件代码。 AnimatedWidget不需要维护一个State对象来保存动画。

6️⃣监视动画的进度

使用addStatusListener来处理动画状态更改的通知,例如启动,停止或反转方向。

当动画完成或返回其开始状态时,通过反转方向在无限循环中运行动画。

7️⃣用AnimatedBuilder重构

AnimatedBuilder了解如何呈现过渡。

AnimatedBuilder不知道如何渲染小部件,也不知道如何管理动画对象。

使用AnimatedBuilder将动画描述为另一个小部件的构建方法的一部分。 如果你只是想用可重用的动画定义一个小部件,请使用AnimatedWidget。

AnimatedBuilder是渲染树中的一个独立的类。 与AnimatedWidget类似,AnimatedBuilder会自动侦听来自Animation对象的通知,并根据需要将该控件树标记为dirty,因此您无需调用addListener()。

Flutter API中AnimatedBuilder的示例:BottomSheet,ExpansionTile,PopupMenu,ProgressIndicator,RefreshIndicator,Scaffold,SnackBar,TabBar,TextField。



从小部件树的底部开始,渲染徽标的代码很简单:

class LogoWidget extends StatelessWidget {

  // Leave out the height and width so it fills the animating parent

  build(BuildContext context) {

    return new Container(

      margin: new EdgeInsets.symmetric(vertical: 10.0),

      child: new FlutterLogo(),

    );

  }

}

图中的中间三个块都在GrowTransition的build()方法中创建。 GrowTransition小部件本身是无状态的,并拥有定义过渡动画所需的最终变量集合。 build()函数创建并返回AnimatedBuilder,它将(匿名构建器)方法和LogoWidget对象作为参数。 渲染转换的工作实际上发生在(匿名构建器)方法中,该方法创建一个适当大小的Container来强制缩放LogoWidget。

8️⃣同时动画

Curves类定义了一个可用于CurvedAnimation的常用曲线数组。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容