Android的动画,大的分类有两种:

  • 视图动画(View Animation)
  • 属性动画(Property Animation)

视图动画又可以分为两类:

  • 补间动画(Tween Animation)
  • 逐帧动画(Frame Animation)

这之间的差别是什么呢?它们只有实现上的差别

  • 补间动画是根据初始状态,系统自动补充中间状态;
  • 逐帧动画则是需要我们提供每一帧;
  • 视图动画只是作用于视图上,而不会改变控件的属性;
  • 属性动画则是会实实在在的更改控件的属性。

可以看出Android的动画分类还是比较明晰的。

2.2 iOS动画

iOS很久没弄了,在这里也简单说下,不对的话还请各位指正。

  • 隐式动画
  • 显式动画

显式动画又可以分为两类:

  • 基础动画
  • 关键帧动画

这些动画类别之间的差别是什么呢?

  • 隐式动画,顾名思义是不指定动画类型,更改某个属性,Core Animation来决定如何且何时去做动画;
  • 基础动画,根据起始值来做动画;
  • 关键帧动画,则是定义一系列关键帧,系统自动补齐中间的过渡帧。

通过动画这一块儿,可以看出iOS的分类其实是比较的模糊的,有一些历史包袱。

2.3 css动画

css动画大体上有两种:

  • Transition
  • Animation

web中的动画分类简单的多了

  • Transition动画,给定起始值,可以结合插值器做动画;
  • Animation动画,则是定义一系列关键帧,系统补齐中间的过渡帧。

2.4 小节

通过上面个平台动画粗略的介绍,动画在不同平台虽然被叫着不同的名称,本质上其实都差不多的,变来变去都是这几种方式,要么根据属性要么根据关键帧,要么更改绘制层,要么更改控件本身属性。一些游戏引擎,虽然我没有看,但是我觉得原理也大致相似。

3. Flutter动画

上面铺垫了这么多,终于到Flutter动画了。Flutter是一门比较新的技术,历史包袱理应说是最小的。

3.1 Flutter动画分类

Flutter动画分为两类:

  • 补间动画(Tween Animation)
  • 基于物理的动画(Physics-based animation)

补间动画很好理解,基于物理的动画是这个什么鬼。

基于物理的动画是一种遵循物理学定律的动画形式

举个例子,比方说你滑动一张图片,这个过程不是匀速的,而是起始速度快,然后慢慢的降速,就像一本书在地上往前推一样。它有什么特点呢?

  • 遵循物理学定律;
  • 能够依据加速度和速度去计算和更新每一帧的动画数值;
  • 当受力平衡时,动画为处于恒定运动或静止状态。

哈哈,最后一点是不是似曾相识,这样做的好处是什么呢?随着人们生活水平的极大提升,移动端硬件这些年也是赶英超美,人们不再满足于简单的动画,于是就有部分有(xian)识(de)之(dan)士(teng),实现了基于物理学定律的动画。

这种动画iOS或者Android有没有呢,是有的,但不是作为最基础的动画API被提供。为什么其他平台没有将这个纳入最基本的动画中去呢?

  • 历史原因。iOS以及Android端多年前就诞生了,那个时候,硬件资源都是极其有限的,当时的环境不足以支撑这种动画效果。但也不是说没有,一些游戏引擎里面也是有的,但是作为操作系统,把这些集成进去,还是不太现实的。
  • 认知过程。电脑以及移动端这些年的发展,最开始只是满足于查看最简单的文本,然后各种图片视频。随着互联网的越来越普及,人们的需求越来越多了。于是,在一些游戏里面才会见到的基于物理学定律的动画,进入了寻常百姓家。反观一下,现在也是有非常多的“委屈”事物。例如人类几千年都是通过人眼看现实的事物,现在却被限制在一个小屏幕上,这其实是不合理的。所以AR、VR,还有一些动画片科幻片中的远程感知等技术,才会层出不穷,当然这个扯的有些远了。

基于物理的动画这么好,那有什么好处呢?更自然,更加符合人们的认知。

3.2 分类的原因

前面讲的各平台的动画,从本质上看,基于某个属性也好,帧动画也好,都是从一种状态到另一种状态,而中间过程是可以推演出来的,所以Flutter提供补间动画。

基于物理的动画,我猜测可能是为了实现其他平台上的一些效果,例如弹簧、阻尼效果等等。所以Flutter就提供了这种动画API,毕竟没什么包袱。

3.3 动画模式

Flutter提炼了三种动画模式,与其说提炼出来的,倒不如说统一不能更为合适。

  • list、grid中的动画(Animated list or grid)。场景是item的添加或者删除操作;
  • 转场动画(Shared element transition)。场景是当前页面打开另一页面的过渡动画;
  • 交错动画(Staggered animation)。场景是需要部分或者完全交错的动画。

3.4 复杂度

Flutter的实现原理以及这个阶段,注定了做动画是非常麻烦的一件事情。跨平台的技术做动画都麻烦,这个似乎是通识,为了跨平台而同化的一些东西,到异化部分,就变得蛋疼了,动画正是这种存在。

Flutter做动画复杂体现在哪些地方呢?

  • 实现的动画较少,这个是初期,没啥好说的;
  • 动画实现的方式复杂,这个是Flutter的设计思想所决定的。

4. 小节

关于动画的具体的实现、一些底层的代码逻辑以及如何使用,将会在下一篇文章中做介绍。这篇文章更多的是偏于一些普适性的介绍,关于Flutter动画相关的介绍反而很少。希望读者能够了解一些动画的原理,以及各个平台动画的大致实现方式,这样可以更好的理解Flutter动画的设计思想。文中若有错误的地方,还恳请指出,在此不胜感激。
5. 后话

笔者建了一个Flutter学习相关的项目,Github地址,里面包含了笔者写的关于Flutter学习相关的一些文章,会定期更新,也会上传一些学习Demo,欢迎大家关注。
6. 参考

  1. 电影原理
  2. 视觉暂留
  3. iOS-Core-Animation-Advanced-Techniques
  4. CSS动画简介
  5. Animations in Flutter
  6. Android 中基于物理特性的动画简介

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

最后送福利了,现在关注我可以获取包含源码解析,自定义View,动画实现,架构分享等。
内容难度适中,篇幅精炼,每天只需花上十几分钟阅读即可。
大家可以跟我一起探讨,有flutter—底层开发—性能优化—移动架构—资深UI工程师 —NDK相关专业人员和视频教学资料,还有更多面试题等你来拿

录播视频图.png

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!

资料,还有更多面试题等你来拿**

[外链图片转存中…(img-TdRZRyR4-1711817281538)]

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐