前言
最近工作上有动画的需求,实现方案呢,又很难找,以前看了好几个动画相关的文章,感觉总是差点什么,总有种好像会了,但是又不怎么会的感觉,趁这次项目需求就看了三天的官网关于动画的介绍(还没看完),由于是在工作日看的,进度又赶,清明就加了三天班。
另外,Compose动画还没看,这里就不写了。
文档链接:developer.android.com/develop/ui/... ,我看的英文版,因为某次发现英文版新内容比中文版多,而且读起来会流畅一些。
第一节 动画的介绍(Introduction to animations)
文档这一节有五个小节,看起来是将动画分成了五种类别,但是有些动画在这节是没有的。这五个小节分别是:bitmaps动画、UI能见度与移动动画、基于物理的动画、layout改变动画和activity之间的动画
1. bitmaps动画(Animate bitmaps)
为了将类似icon或插图的bitmap图形动起来,需要使用drawable animation APIs。通常,这些animations被定义为静态的drawable资源,但你也可以在运行时定义这种动画行为,也就是代码中动态定义。这种动画效果如下图所示:
2. UI能见度与移动动画(Animate UI visibility and motion)
这节比较长,就长话短说了。第一个自然段忽略,第二个自然段介绍了属性动画,这里叫做property animation system,一个从Android3.0(API level 11)开始的玩意儿。
属性动画很多人都有介绍,能实现很多的动画功能,比如说view的显隐、缩放、移动、旋转,除了这四个,其他属性的改变动画也可以做,自定义的变量也行。属性,就是一个对象的字段。与属性动画关联的是view动画,这节并没有介绍。此节动画具体效果看下图:
第三自然段介绍的动画乍看起来不太明白,其实直接点进链接跳过去就知道了,内容很少,详见第六节。
3. 基于物理的动画(Physics-based motion)
截止到目前我看到的这块,只看到了两个有物理效果的动画API,分别是Spring animation和Fling animation,文档里也给了不带物理效果和带物理效果的区别,分别如下两图所示:
详细的就不介绍了,时间也不早了,就说两个点;
- 这节最后一个自然段提到了DynamicAnimation,不要以为有第三个基于物理的动画API(第三方或者自己实现那就有),这是个虚基类,点进去看就Spring animation和Fling animation两个子类。
- 这个文档里两个API介绍被打散到两节里面了。
4. layout改变动画(Animate layout changes)
在Android 4.4 (API level 19) 新增了一个叫做transition framework的东西。使用这个东西呢,需要指定开始和结束的layout,以及动画的类型,系统会自动计算和执行两个layout之间的动画。具体效果下图所示:
开始和结束的layout存储在各自的Scene中,虽然通常来说起始Scene由当前layout自动决定。你可以使用Transition来告诉系统想要什么类型的动画,然后调用TransitionManager.go()就会执行动画啦。
5. activity之间的动画(Animate between activities)
这个是在Android 5.0 (API level 21)新增的。这个动画也是基于transition framework的,和上一个点一样,不同的是,这个能实现activity之间的layout切换动画。
举例的应用场景就是不同activity之间跳转时的共享View动画。具体效果和上一个点图片中的动画一致。
通常来说,需要在startActivity跳转的时候携带一个由ActivityOptions转换来的bundle,而这个options通过 ActivityOptions.makeSceneTransitionAnimation()来获取,这个options会说明哪个view是共享的,然后transition framework就会在动画的时候将它们联系起来。
结尾
此节还有一些内容没有说,比如补间动画(tween animation)、ViewPropertyAnimator、ViewAnimationUtils(虽然这玩意儿就一个动画方法...);另外还有一些不常用的xml中的动画(对我而言),比如selector中指定动画、animated-selector;再之外还有就是Keyframe(第一次见到这玩意儿,属性动画的内容)。
转述个文档都分开两天来写,当初看这块是因为觉得MotionLayout或许对我项目有帮助,结果没时间看到MotionLayout,直接用view动画来做了。动画出完出蓝牙,嗯,先画个饼。