Flutter基建 - 12种隐式动画小组件全解析

本篇基于Flutter 3.16.4,Dart 3.2.3版本

Flutter 3.16.4 • channel stable • Framework • revision 2e9cb0aa71 (3 days ago) • 2023-12-11 14:35:13 -0700

Engine • revision 54a7145303

Tools • Dart 3.2.3 • DevTools 2.28.4

本篇为Flutter基建的第九篇文章,文章会围绕着ImplicitylyAnimatedWidget隐式动画组件来分析,通过代码+Gif的形式将12种常用的动画呈现出来,隐式动画使用起来并不是很难,但它在日常开发中可以帮助我们解决一些小而美的视角效果,下面一起进入文章的了解下吧~

image.png

简述

隐式动画的基类为ImplicitlyAnmatedWidget,它是一个抽象方法,上面12种动画组件都是继承自它,它的构造方法也是比较简单,只有四个参数,下面先来看下各个参数的作用。

const ImplicitlyAnimatedWidget({super.key,this.curve = Curves.linear,required this.duration,this.onEnd,
});
  • curve参数表示的是动画执行的过程方式,默认为线性方式;
  • duration参数表示的是动画执行的时长,此参数为必传参数;
  • onEnd参数表示的是动画结束的回调。

ImplicitlyAnmatedWidget构造方法中参数含义都是比较简单,基本上都是写一次就懂的~

AnimatedAlign

AnimatedAlign提供的对齐方式的动画效果,下面我们来实现文本从左边移到右边的动画效果。

const duration = Duration(seconds: 1);Alignment _alignment = Alignment.centerLeft;Widget buildAnimatedAlign() {return AnimatedAlign(alignment: _alignment,duration: duration,child: const Text("AnimatedAlign"),);
}

先构建一个AnimatedAlign组件,它的alignment参数传入的初始值为居中左对齐方式,时长为1s,然后子组件就是一个简单的文本组件。


@override
Widget build(BuildContext context) {return buildScaffold(context,ListView(children: [buildAnimatedAlign(),],),actionButton: FloatingActionButton(onPressed: () {setState(() {_alignment = _alignment == Alignment.centerLeft? Alignment.centerRight: Alignment.centerLeft;});},child: const Icon(Icons.favorite,),),);
}

最后在FloatingActionButton的点击事件中将_alignment进行变化,从左边变化为右边,反之从右边变化为左边,下面我们看下实现的效果:

AnimatedContainer

AnimatedContainer提供的动画效果比较多,在其内部属性变化的时候都会按照动画的效果变化,比如颜色值、大小、padding等改变时都会执行动画,下面我们以颜色来感受下。

Color _color = Colors.red;Widget buildAnimatedContainer() {return AnimatedContainer(duration: duration,color: _color,height: 100,);
}setState(() {_color = _color == Colors.red ? Colors.blue : Colors.red;
});

这里将AnimatedContainer的背景色设置默认为红色,然后点击按钮时以红色和蓝色切换,这时候背景色就会以线性的方式改变。

AnimatedDefaultTextStyle

AnimatedDefaultTextStyle提供的是当文本样式改变时执行的动画效果,这里我们以文本颜色值改变来感受下此动画。

TextStyle _textStyle = const TextStyle(color: Colors.red, fontSize: 20);Widget buildAnimatedTextStyle() {return AnimatedDefaultTextStyle(style: _textStyle,duration: duration,child: const Text('AnimatedDefaultTextStyle'),);
}setState(() {_textStyle = _textStyle.color == Colors.red? const TextStyle(color: Colors.blue, fontSize: 20): const TextStyle(color: Colors.red, fontSize: 20);
});

点击时让文本的颜色值以红色和蓝色切换,然后看文本呈现的变化效果。

AnimatedScale

AnimatedScale提供的是一种缩放动画,通过此动画组件缩放就不在是一瞬间的效果,而是以线性的方式逐渐变化大小。

double _scale = 1.0;Widget buildAnimatedScale() {return AnimatedScale(scale: _scale,duration: duration,child: Container(height: 100,color: Colors.red,),);
}setState(() {_scale = _scale == 1.0 ? 0.5 : 1.0;
})

AnimatedRotation

AnimtedRotation提供的是一种旋转动画,旋转一圈分为8份,没份表示旋转45度,下面来看看Text旋转效果

double _rotation = 0;
Widget buildAnimatedRotation() {return AnimatedRotation(turns: _rotation,duration: duration,child: Container(alignment: Alignment.center,child: const Text('AnimatedRotation'),),);
}setState(() {_rotation += 1.0 / 8.0;
})

AnimatedSlide

AnimatedSlide提供的是Offset的对象上的动画,当AnimatedSlide的Offset发生变化时,它会以指定的动画形式进行偏移,下面我们来实现每次点击按钮Y轴向下偏移1个单位。

Offset _offset = Offset.zero;
Widget buildAnimatedSlide() {return AnimatedSlide(offset: _offset,duration: duration,child: const FlutterLogo(size: 50,),);
}
setState(() {_offset = Offset(0, _offset.dy + 1);
})

AnimatedOpacity

AnimatedOpacity提供的是组件的透明度变化动画,当AnimatedOpacity透明度值变化时,子组件会按照指定的动画形式就行改变,下面我们来实现组件显示和隐藏之间的切换,看看具体的动画效果。

double _opacity = 1.0;
Widget buildAnimatedOpacity() {return AnimatedOpacity(opacity: _opacity,duration: duration,child: const FlutterLogo(size: 50,),);
}setState(() {_opacity = _opacity == 1 ? 0 : 1;
})

AnimatedPadding

AnimatedPadding提供的是当padding参数发生改变时,子组件的边距会以动画的形式逐渐改变,下面我们以Container每次增加10边距的效果直观感受下。

double _padding = 0.0;Widget buildAnimatedPadding() {return AnimatedPadding(padding: EdgeInsets.all(_padding),duration: duration,child: Container(height: 50,color: Colors.red,),);
}setState(() {_padding += 10.0;
})

AnimatedTheme

AnimatedTheme比较有趣,它可以提供当主题发生改变时,其子组件的各种样式都会随之以动画的形式变化,这里我们选择切换黑白主题时,改变Icon的颜色,这种可以很好的感受其动画的效果。

bool _isDark = false;Widget buildAnimatedTheme() {return AnimatedTheme(duration: duration,data: _isDark ? ThemeData.dark() : ThemeData.light(),child: const Icon(Icons.favorite,size: 50,),);
}setState(() {_isDark = !_isDark;
})

这里逻辑比较简单,这是在AnimatedTheme的data参数中判断当前是是否为黑色主题,然后根据判断赋值对应的ThemeData,当_isDark发生变化时,Icon的颜色也会随之而黑白切换。

AnimatedSize

AnimatedSize算是12种隐式动画组件中较为简单的一种了,它自身并没有可改变的参数,而是根据子组件的大小变化而产生动画效果,下面我们来实现Logo大小变化的动画效果。

double _size = 50;Widget buildAnimatedSize() {return AnimatedSize(duration: duration,child: FlutterLogo(size: _size,),);
}setState(() {_size = _size == 50 ? 100 : 50;
})

这样就完成了FlutterLogo在50和100之间的大小变化并且带有动画效果。

AnimatedSwitcher

AnimatedSwitcher是这里面比较复杂的一种,它提供的是新旧组件切换时一种动画效果,但是看它的参数中只有一个child参数,并没有第二个子组件的定义,其实新旧组件的切换是在transitionBuilder参数中进行定义,transitionBuilder用于定义新组件是如何进行出现,默认的是FadeTransition效果,其效果为淡入淡出,下面我们来看看实现的具体效果。

int _count = 0;Widget buildAnimatedSwitcher() {return AnimatedSwitcher(duration: duration,child: Text(key: ValueKey(_count),"$_count",style: const TextStyle(fontSize: 40),),);
}setState(() {++count;
})

这里我们看下Text中给key赋值了,使用ValueKey将_count值和key进行绑定,这样的作用是用于判断新旧组件是否变化,在默认的FadeTransition实现中会取child的key,这里千万别忘记给Text赋值key哦,不然动画就不会生效。

TweenAnimationBuilder

TweenAnimationBuilder被称之为补间动画,它会根据目标值的变化而随之执行动画,补间动画的自由度比较多,可以实现大小、颜色等等动画,如果上面11种不满足需求使用,可以使用TweenAnimationBuilder来定义自己想要的动画效果,下面我们还是以简单的例子来感受下补间动画的使用和效果。

double _tweenSize = 50;Widget buildTweenAnimated() {return TweenAnimationBuilder(tween: Tween<double>(begin: 100, end: _tweenSize),duration: duration,builder: (context, size, child) {return FlutterLogo(size: size,);},);
}setState(() {_tweenSize = _tweenSize == 50 ? 100 : 50;
})

这里tween参数需要提供一个Tween类型的对象,Tween构造方法中有begin和end两个参数,也就是说在进入界面的时候FlutterLogo就会从begin:100的大小动画至end:50,后续每次点击按钮FlutterLog的大小都会在100和50之间切换,下面来看下效果图是否如我们期望的一致。

写在最后

本篇文章主要介绍了Flutter中12种常用的隐式动画小组件,这12中动画都不是很复杂但是在日常使用中可能会给我们带来小而美的效果,在一些简单的效果中可以使用其帮助我们简化动画的实现,希望通过文章给阅读的小伙伴们带来一点帮助,后续会循序渐进逐步接触Flutter更多的知识。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/298889.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【MySQL基础】:超详细MySQL完整安装和配置教程

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; MySQL从入门到进阶 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一. MySQL数据库1.1 版本1.2 下载1.3 安装1.4 客户端连接 &#x1f324;️全篇总…

尺寸公差分析与尺寸链计算软件-DTAS3D到底能给我们带来哪些价值?

【技能】DTAS3D能给我们带来哪些价值&#xff1f; DTAS3D是一款高度集成的公差分析软件&#xff0c;旨在为产品开发团队提供准确的建议&#xff0c;从而放心地将设计发布给制造部门。下面是DTAS3D的关键价值和应用: 1.与三维CAD无缝集成: DTAS3D与三维CAD软件 (CATIA、NX、Cr…

为什么我的网络这么卡卡卡卡卡?(网络调试篇)

前言 最近小白迷上了打游戏。 有没有一起上王者的小伙伴&#xff1f; 有没有一起吃鸡的小伙伴&#xff1f; 欧耶&#xff0c; 咱们组队 送人头去吧 为了不让对方太菜&#xff0c; 送人头是与对方最高的敬意。 闲话说到这&#xff0c;本文就结束了。 感谢观看&#xff5e;…

使用Selenium库模拟浏览器操作

Selenium是一个用于自动化Web浏览器的Python库。它提供了一组强大的工具和API&#xff0c;使开发者能够以编程方式控制浏览器的行为&#xff0c;模拟用户与网页的交互。 Selenium可以用于各种Web自动化任务&#xff0c;包括网页测试、数据采集、UI自动化等。它支持主流的Web浏览…

Selenium自动化测试框架(附教程+源码)

说起自动化测试&#xff0c;我想大家都会有个疑问&#xff0c;要不要做自动化测试&#xff1f; 自动化测试给我们带来的收益是否会超出在建设时所投入的成本&#xff0c;这个嘛别说是我&#xff0c;即便是高手也很难回答&#xff0c;自动化测试的初衷是美好的&#xff0c;而测试…

山海鲸开发者视角:帮助汽车制造商取得市场优势

山海鲸可视化是一款致力于数字孪生领域的产品&#xff0c;为各行各业提供专业的数据可视化解决方案。作为山海鲸开发者&#xff0c;我们在开发免费好用的数字孪生工具同时也希望能让大家通过多种解决方案了解我们软件的多种可能性&#xff0c;本文就为大家介绍我们的汽车行业解…

U盘加密软件下载安装步骤

随着移动存储设备的普及&#xff0c;U盘已成为我们工作和生活中不可或缺的存储工具。然而&#xff0c;U盘丢失或被盗的风险也随之增加&#xff0c;如何保护U盘中的敏感数据成为了重要的问题。此时&#xff0c;U盘加密软件成为了解决这一问题的有效手段。 下面&#xff0c;我们…

利用MATLAB设计一个(2,1,7)卷积码编译码器

1、条件&#xff1a; 输入数字信号&#xff0c;可以随机产生&#xff0c;也可手动输入 2、要求&#xff1a; &#xff08;1&#xff09;能显示编码树、网格图或状态转移图三者之一&#xff1b; &#xff08;2&#xff09;根据输入数字信号编码生成卷积码并显示&#xf…

nodejs文心一言API接入

需求 在nodejs里面接入文心一言API&#xff0c;官方调用步骤API介绍 - 千帆大模型平台 | 百度智能云文档 大致流程 创建应用——>API授权——>获取访问凭证——>调用接口 创建应用 注册账号创建应用 首先注册百度云智能账号&#xff0c;登录进入百度智能云千帆控…

虚拟机(centos)磁盘空间不够

磁盘空间不够 1.关机 2.打开设置-->硬盘 --> 扩展 3.搞定一半 4.开机进入终端 4.1 查看 lsblk 4.2 加起来 growpart /dev/sda 3 注1&#xff1a; 如果 growpart 提示没有的话需要安装一下 yum -y install cloud-utils-growpart 注2&#xff1a;3前面有个空格 4.3 再次…

工具系列:TensorFlow决策森林_(3)使用dtreeviz可视化

文章目录 介绍设置安装 TF-DF 和 dtreeviz导入库 可视化分类树加载、清洗和准备数据分割训练/测试集并训练模型训练一个随机森林分类器显示决策树检查叶节点统计信息决策树如何对实例进行分类特征空间划分 可视化回归树加载、清洗和准备数据分割训练/测试集并训练模型训练一个随…

顺序表的实现(头插、尾插、头删、尾删、查找、删除、插入)

目录 一. 数据结构相关概念​ 二、线性表 三、顺序表概念及结构 3.1顺序表一般可以分为&#xff1a; 3.2 接口实现&#xff1a; 四、基本操作实现 4.1顺序表初始化 4.2检查空间&#xff0c;如果满了&#xff0c;进行增容​编辑 4.3顺序表打印 4.4顺序表销毁 4.5顺…