查看原文
其他

Android新的动画库-SpringAnimation(弹簧动画)

2017-04-27 承香墨影 承香墨影

版权声明:

本公众号发布的所有文章,均属于原创,版权归本公众号所有。

允许有条件转载,转载请附带底部二维码。

一、前言

前几天,Android 在 Support Library(25.3.0)中,新增和修复了一些 API,其中新增了一个基于物理学的动画支持库,被命名为:SpringAnimation(弹簧动画)。

紧跟着,Google Android 研发工程师 『Nick Butcher』 在 Twitter 上发布推文予以公布,并且在 gist 中给出了一个简单的实例代码,演示了 SpringAnimation 的核心效果。

实际上,在 gist 中给出的示例是不完整的。而且既然有新东西,当然要第一时间体验一下。并且它既然是 Support 包下的,是没有 API Level 限制的。

二、SpringAnimation

SpringAnimation 弹簧动画,顾名思义它可以实现一种类似弹簧弹动效果的动画,设计的非常巧妙。

生活的尝试告诉我们,弹簧在拉伸或者压缩后,一旦被释放,会自动恢复到原来的模样,但是在恢复的时候过程中,不是一步到位的恢复,而是有一个弹动的效果。而SpringAnimation 就是模拟的这种弹簧效果的动画。它可以在 View 移动后,模拟弹簧的效果恢复到原本的位置上。

SpringAnimation 实际上是实现了 DynamicAnimation 。DynamicAnimation 同样也是 Support Library (25.3.0) 中新增的类,所以等于真的是新增了一整套新的 Animation 形式。

1、gist上的Demo

既然『Nick Butcher』已经发布了一个Demo,那么我们就直接还原这个Demo,使用这个Demo来分析。

不过它只是 Demo ,真的非常的简单。主要的逻辑就在View的onTouch里实现的,为了方便阅读,就不贴完整的代码了。

Demo 中,根据Touch 事件移动的方向,分别做了两个 SpringAnimation,然后分别执行,最终就作用在 View 上,就有上面 gif 图的效果。

可以看到,实际上,它通过设置两个属性,来确定这个弹簧动画的效果,分别是:Stiffness 和 DampingRatio。这个下面会讲解它的意思。

2、SpringAnimation API

再看看SpringAnimation 的 构造方法。

可以看到,它提供了两个构造方法,再来分别说说它们的参数。

  • View:动画作用的 View,没什么好说的。

  • ViewProperty :弹簧动画操作的弹动坐标轴,从源码中可以看到,可以传递 TRANSLATION_X、TRANSLATION_Y、TRANSLATION_Z ,它们分别表示了X、Y、Z 轴。

  • finalPosition:动画执行最终恢复的点,注意这个点是在原位置的偏移量,所以要恢复到最初的位置,之需要设置为 0 即可。

虽然它提供了两个构造方法,但是实际上,即便是使用两个参数的构造方法,我们也需要自行设置 SpringForce 对象,否者在调用 start() 的时候也会报错,所以一般我们直接使用三个参数的构造方法就好了,提前指定动画结束后恢复的点。

在 start() 的时候,会先调用 sanityCheck() 方法进行检查mSpring 对象是否被初始化,如果没有被初始化,就直接抛异常出来。

而从上面的例子可以看到,弹动动画实际上是对 SpringAnimation 配置的两个属性 :stiffness (劲度程度)、dampingRatio(阻尼程度),这两个属性都是属于 SpringForce 对象的。

通过生活中,我们对弹簧的认识,应该知道,这两个属性就是影响弹簧拉伸效果和恢复效果的两个重要的因素。不同的弹簧,承受不同的弹力,对应不同的阻尼效果,有了这两个属性就可以唯一确定这个弹簧的弹动效果。SpringAnimation 将弹簧的弹动效果,通过这两个属性完美的诠释。

在一些极端情况下,例如无阻尼效果的时候,动画一旦开始,就不会再结束了,一直周而复始的弹动下去。

3、需要注意的

还记得 Animation 和 Animator 的区别吧。Animation 实际上改变的是 View 的『视觉位置』,而Animator 是真的从 View 的属性上改变了 View 的『物理位置』。

而SpringAnimation 既然被命名为一个 Animation,那么它实际上也只是改变了『视觉位置』,所以在做一些点击时间的时候,如果 finalPosition 不是被设置为 0 的话,要注意它实际还是在 “0” 的位置上。

这一点可以在开发者选项中,打开 『显示布局边界』来确定。

三、结语

Android 提供了新的 SpringAnimation,如果想要尝试的,记得在 build.gradle 文件中,添加对应的依赖库。

compile 'com.android.support:support-dynamic-animation:25.3.0'

SpringAnimation 使用起来非常的便利,可以帮开发者解决一些设计们需要的弹簧弹动的效果。但是具体使用场景,可以发挥自己的想象。

老规矩,完整的 Demo ,在公众号回复 『SpringAnimation』 获得。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存