Flutter 旋转动画 — RotationTransition
系列文章
- Flutter 旋转动画 — RotationTransition
- Flutter 平移动画 — 4种实现方式
- Flutter 淡入淡出与逐渐出现动画
- Flutter 尺寸缩放、形状、颜色、阴影变换动画
- Flutter 列表Item动画 — AnimatedList实现Item左进左出、淡入淡出
- Flutter Hero 实现共享元素转场动画
- Flutter Hero 实现径向变换动画 — 圆形变成矩形的转场动画
- Flutter 自定义动画 — 数字递增动画和文字逐行逐字出现或消失动画
文章目录
- 系列文章
- 1 旋转动画效果对比
- 2 动画基础知识
- 3 旋转动画案例
- 3.1 线性变化的旋转动画(补间动画 Tween)
- 3.1.1 首先创建 Animation 与 AnimationController
- 3.1.2 构建Widget RotationTransition
- 3.1.3 效果图
- 3.2 非线性变化的旋转动画(CurvedAnimation)
- 3.2.1 代码实现
- 3.2.2 效果图
- 3.3 动画延时重复(每次重复播放前停顿一下)
- 3.3.1 代码实现
- 3.3.2 效果图
- 3.4 手动控制旋转动画
- 3.4.1 代码实现
- 3.4.2 效果图
- 4 注意
1 旋转动画效果对比
2 动画基础知识
- Animation 是 Flutter 动画库中的核心类,它插入用于引导动画的值。
- AnimationController 管理动画。例如控制动画开始、停止、前进、后退等。
- CurvedAnimation 将进程定义为非线性曲线。
- Tween 在被动画对象使用的数据范围之间进行插值。 例如,Tween 可以定义从红色到蓝色或从 0 到 255 的插值。
- Listeners 和 StatusListeners 可监控动画状态的变化。
- AnimatedWidget 是展示动画的Widget,Flutter提供一些动画Widget让我们快速实现动画效果。例如:
AnimatedBuilder、 AnimatedModalBarrier、DecoratedBoxTransition、FadeTransition、PositionedTransition、RelativePositionedTransition、RotationTransition、ScaleTransition、SizeTransition、SlideTransition
3 旋转动画案例
RotationTransition 继承于AnimatedWidget,是一个提供旋转功能的Widget,需要传入参数 Animation<double>。
设
Animation<double>
中的值为 v,则旋转的弧度是 v * 2 * π
3.1 线性变化的旋转动画(补间动画 Tween)
3.1.1 首先创建 Animation 与 AnimationController
/// 会重复播放的控制器late final AnimationController _repeatController;/// 线性动画late final Animation<double> _animation;@overridevoid initState() {super.initState();/// 动画持续时间是 3秒,此处的this指 TickerProviderStateMixin_repeatController = AnimationController(duration: const Duration(seconds: 3),vsync: this,)..repeat(); // 设置动画重复播放// 创建一个从0到360弧度的补间动画 v * 2 * π_animation = Tween<double>(begin: 0, end: 1).animate(_repeatController);}
3.1.2 构建Widget RotationTransition
@overrideWidget build(BuildContext context) {return Scaffold(body: Center(child: RotationTransition(turns: _animation,child: const Icon(Icons.arrow_drop_up, size: 180),),),);}
3.1.3 效果图
3.2 非线性变化的旋转动画(CurvedAnimation)
3.2.1 代码实现
实现方式与线性变化的旋转动画类似,只是需要将 Tween
更改为 CurvedAnimation
class _RotationTransitionPageState extends State<RotationTransitionPage>with TickerProviderStateMixin {/// 会重复播放的控制器late final AnimationController _repeatController;/// 非线性动画late final Animation<double> _curveAnimation;@overridevoid initState() {super.initState();_repeatController = AnimationController(duration: const Duration(seconds: 3),vsync: this,)..repeat();/// Curves 存在多种模式,具体的效果查看Curves源码,有链接展示动画效果_curveAnimation = CurvedAnimation(parent: _repeatController,curve: Curves.easeInCirc,);}@overrideWidget build(BuildContext context) {return Scaffold(body: Center(child: RotationTransition(turns: _curveAnimation,child: const Icon(Icons.arrow_drop_up, size: 180),),),);}
}
3.2.2 效果图
3.3 动画延时重复(每次重复播放前停顿一下)
实现思路:监听动画的状态,每当动画播放完成时延时一段时间,然后启动动画开始播放。
3.3.1 代码实现
class _RotationTransitionPageState extends State<RotationTransitionPage>with TickerProviderStateMixin {/// 重复播放前需要停顿一下的控制器late final AnimationController _delayRepeatController;/// 延时重复播放动画late final Animation<double> _delayAnimation;@overridevoid initState() {super.initState();_delayRepeatController = AnimationController(duration: const Duration(seconds: 3),vsync: this,)// 添加动画监听..addListener(() {// 获取动画当前的状态var status = _delayRepeatController.status;if (status == AnimationStatus.completed) {// 延时1秒Future.delayed(const Duration(seconds: 1), () {//从0开始向前播放_delayRepeatController.forward(from: 0.0);});}})..forward();_delayAnimation =Tween<double>(begin: 0, end: 1).animate(_delayRepeatController);}@overrideWidget build(BuildContext context) {return Scaffold(body: Center(child: RotationTransition(turns: _delayAnimation,child: const Icon(Icons.arrow_drop_up, size: 180),),),);}
}
3.3.2 效果图
3.4 手动控制旋转动画
实现方式:使用 AnimationController 的
animateTo
函数。
3.4.1 代码实现
class _RotationTransitionPageState extends State<RotationTransitionPage>with TickerProviderStateMixin {/// 手动控制动画的控制器late final AnimationController _manualController;/// 手动控制late final Animation<double> _manualAnimation;@overridevoid initState() {super.initState();/// 不设置重复,使用代码控制进度,动画时间1秒_manualController = AnimationController(vsync: this,duration: const Duration(seconds: 1),);_manualAnimation =Tween<double>(begin: 0, end: 1).animate(_manualController);}@overrideWidget build(BuildContext context) {return Scaffold(body: Center(child: RotationTransition(turns: _manualAnimation,child: CupertinoButton(onPressed: () {/// 获取动画当前的值var value = _manualController.value;/// 0.5代表 180弧度if (value == 0.5) {_manualController.animateTo(0);} else {_manualController.animateTo(0.5);}},child: const Icon(Icons.arrow_drop_up, size: 180),),),),);}
}
3.4.2 效果图
4 注意
别忘了释放AnimationController 资源。
@overridevoid dispose() {_controller.dispose();super.dispose();}
Flutter 旋转动画 — RotationTransition相关推荐
- Flutter 平移动画 — 4种实现方式
系列文章 Flutter 旋转动画 - RotationTransition Flutter 平移动画 - 4种实现方式 Flutter 淡入淡出与逐渐出现动画 Flutter 尺寸缩放.形状.颜色. ...
- Flutter 自定义动画 — 数字递增动画和文字逐行逐字出现或消失动画
系列文章 Flutter 旋转动画 - RotationTransition Flutter 平移动画 - 4种实现方式 Flutter 淡入淡出与逐渐出现动画 Flutter 尺寸缩放.形状.颜色. ...
- flutter RotationTransition实现旋转动画
更多文章请查看 flutter从入门 到精通 flutter 动画状态监听器 AnimationController //动画控制器AnimationController controller;//A ...
- flutter 点击旋转动画_让动画实现更简单,Flutter 动画简易教程!
Flutter中的动画功能强大且易于使用.接下来通过一个具体的实例,您将学到关于 Flutter 动画的一切. 难度:中级 今天,我们无法想象移动应用程序里面没有任何动画,当您从一页跳转到另一页时,或 ...
- cell 滑动实现旋转动画效果
效果图(真机效果好一点.毕竟 gif) tableView角度旋转动画.gif -(void)tableView:(UITableView *)tableView willDisplayCell:(U ...
- 如何用纯 CSS 创作一个方块旋转动画
效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/gjgyWm 可交互视频 ...
- 不炫技,SVG+CSS3 旋转动画属性就能实现的梦幻效果
CSS3的动画相关的基础的属性基本都涉猎过了,个人认为,其中最复杂的是d:path()路径变形动画,超过3D,而位移.轨迹.旋转.缩放.斜切什么的,相对简单一些,但作为非动画设计师而言,灵活的掌握这些 ...
- 代码创建 WPF 旋转动画
原文:代码创建 WPF 旋转动画 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/a771948524/article/details/9304001 ...
- CSS3 skew倾斜、rotate旋转动画
css3出现之前,我们实现一个对象的一组连续动画需要通过JavaScript或Jquery编写,脚本代码较为复杂: 若需要实现倾斜.旋转之类的动画难度将更高(我还没试过用JavaScript或Jque ...
- android旋转动画和平移动画具体解释,补充说一下假设制作gif动画放到csdn博客上...
先上效果图: 我这里用的是GifCam来制作的gif动画,能够在http://download.csdn.net/detail/baidu_nod/7628461下载, 制作过程是先起一个模拟器,然后 ...
最新文章
- 数据科学Python训练营课程:从初级到高级 Python for Data Science Bootcamp Course:Beginner to Advanced
- 基于3D的结构光的应用
- 进程间通信之命名管道
- python初学者web还是爬虫-python 爬虫《从入门到放弃》
- go 怎么等待所有的协程完成_Go 编程:如何实现协程调度的精准控制
- java实现在线浏览zip文件及文件下载
- 上传到服务器gd不支持,安装dedecms出现GD不支持。我的php5.5的。怎么解决?
- Spring 4.1和Java 8:java.util.Optional
- 【问答集锦】从数据中挖掘宝藏,深度学习赋予机器更多“思想”
- PHP检测每一段代码执行时间
- Android Studio 安装遇到问题及解决方法
- Java多线程深度探索
- 拓端tecdat|R语言再保险合同定价案例研究
- 网站服务器mine类型设置,windows服务器如何配置MIME类型
- 高斯c语言百度云免费,高斯数学(1-6年级)精品课程全集百度云下载
- 电子通讯录(文件保存版)
- 运维审计系统----堡垒机的部署
- QTTabBar安装与使用: 更胜浏览器的Windows平台浏览文件方式
- URAL 1099 Work Scheduling
- 基于Java Springboot+Vue+MyBatis音乐播放系统设计实现
热门文章
- 硬盘运行与“AHCI 模式”还是“IDE 模式”
- python case用法_Python Switch Case三种实现方法代码实例
- python3 使用writerows写入csv时有多余空行的处理办法
- Javascript和C#正则只保留英文、数字、汉语、空格
- Axure8.0使用教程
- Frame-Relay基础及配置学习笔记
- 小学身高体重测试软件,儿童身高体重在线测评
- linux 最新cpu型号,linux如何查看cpu型号
- 基于openstack构建私有云实践
- 微信公众号运营推广用户主动分享背后的秘密