
Flutter 以 Widget 数量多著称,所以 Flutter 中的动画 API 那是一个多啊,我觉得有必要梳理一下,大家看的舒服一些。本文不是详细介绍 API,而是帮大家顺利以下其中脉络,给大家归归类,细数都有具体的 API,详细的我有专门的文章去介绍,大家点链接看我的文章就行了
目前转场,共享元素,SVG 动画还没看,其他的都差不多了
回顾 android 动画历史
android 中有什么动画,Flutter 差不多就得有什么动画,区别可能是 Flutter 拥有后发优势,精简合并和一部分
Android 动画历程如下:
API 1- View Animations,也就是补间动画,说实话我也不知道为啥叫这么个没啥关联性的名字。特点是动画作用于 draw 阶段,动画结束后 view 的位置还是在 layout 时的位置,造成了经典的 view 动画结束后无法相应点击事件的事API 11- View Animations,Object Animator,iew Property Animator 都是属性动画,直接操作 view 的属性,这就能在 layout 阶段时起作用了API 19- Transitions 变换动画,可以在 view 属性改变时插入预设动画API 21- Animated Vector Drawable 矢量动画,API 试用很简单,但是矢量设计这块很麻烦,复杂有点的一般 coder 还真搞不定Android X- Physics 物理动画 和 MotionLayout ConstraintLayout 中的动画
Flutter 中也有补间动画,特点和 android 的一样,我可讨厌了,不知道为啥 Flutter 还要把他带上,官方文档上说是为了给 window 用
剩下的 Flutter 动画以 属性动画 和 变换动画 为主,尤其是 变换动画 这块结合了 Transitions、Physics、MotionLayout 众特点于一身。Flutter 中的 Physics 我看更多以插值器的形式出现和配置的
Flutter 一切动画的基础
Flutter 一切动画都是基于 AnimatedWidget 开发的(补间动画不知道是不是啊,没看),而 AnimatedWidget 是对 Flutter 动画核心 API 的集大成者,这些核心动画 API 如下:
Animation- 动画 API 的基础,所有的动画最终都是用 Animation 类型来承载。Animation 主要职能是保存动画每一帧的数值Curve- 动画的插值器,用于动画每帧数值的计算的,这个大家都是熟悉AnimationController- 动画的控制器,动画操控,监听部分都写在这里Tween- 数值区间,主要用来处理不同数据类型的数据,比如 widget 动画中最常用的 都 double,color 等Ticker- 负责分发 async,触发页面 rebuild,详细的去看源码研究,代码一般用不上这个
详细的大家去看我的这篇文章,再次说明这是 Flutter 动画的基础核心,我们自己改动画 API 也是在 AnimatedWidget 基础上操作,所以大家一定要搞明白
详细的请看:
Flutter 补间动画
Transform.rotateTransform.translateTransform.scale
就这几个,可见 Flutter 对他也是不怎么上心
Flutter 属性动画
和 android 的属性动画一模一样,思路都没变,这在 Flutter 中叫:内置动画
SlideTransition- 基于自身倍数的位移动画AlignTransition- 对齐动画,核心也是位移,只不过因为对齐方式的变化PositionedTransition- 缩放动画,限定父布局只能是 stackFadeTransition- 透明度动画ScaleTransition- 缩放动画,这个是 android 中的那种缩放动画,可以指定中心点SizeTransition- 宽高动画,限制是每次只能执行一个维度的动画,宽和高一起不行,那就是缩放动画了RotationTransition- 旋转动画,特点是其数值是 0-1 之间的,旋转90度 = 0.25
详细的请看:
Flutter 变换动画
Flutter 的变换动画融合和 android 中后来出现的动画概念,还包括 LayoutAnimator 布局动画
AnimatedSwitcher- widget 内容改变时可以播放自己指定的动画AnimatedContainer- 带动画的 Container,像 Container 一眼使用,在其中 color、width、height、圆角改变时会触发过度动画,动画不能控制,有些类似与 path 动画AnimatedCrossFade- 切换不同布局时可以显示动画,但是不能自己设置动画,默认就是淡入淡出,并且在大小不通切换时显示不好DecoratedBoxTransition- 边框动画,核心是通过圆角角度的改变实现形状上的变化,这个变化是自然过度的,这点和 path 动画是一样了AnimatedDefaultTextStyle- 文字样式改变时的切换动画,主要呈现的大小变换方面的动画,颜色的渐变过度不明显,但是体验不好的地方在于,大小字切换时字体粗细的变化真实有点辣眼,有点卡顿AnimatedModalBarrier- 颜色改变的变换动画,特殊的地方在于其必须放到所操的 widget 的 child 中,有明确的应用场景,就是点击时改变背景色,比如 dialog 弹出时,背景变灰色AnimatedOpacity- 透明度的变化动画AnimatedPhysicalModel- 阴影变换动画,设置有些复杂AnimatedPositioned- stack 中 widget 位置,大小变换动画AnimatedSize- widget 大小变换动画
详细的请看:
最后
最后啦,要感谢自己写技术博客的习惯,要不这些资料,这么细谁能记得清楚呢,所以啊大家能写博客就写点,写多休少不重要,重要的是要写。未来的你会感谢现在的自己的
有时我会回来看看自己写的文章,呀的一声,好惊讶啊,原来当时我写的文章这么 NB,这么有深度啊,原来我写了好几十万字啦,好些写小说的都没我写的多哈~