
介绍:
SpringAnimation类是一个动画库。
是由Android Support Library v25.3.0·引入的一个新模块。主要是为了更加方便的实现弹簧动画。
我们先来介绍一下SpringAnimation的用法。
因为早期做过后端的开发,所以第一次听到Spring打头的时候就想到了大名鼎鼎的Spring框架,以及它的SpingMVC。后来一查,原来Spring除了春天,还有弹簧的意思。嗦嘚死内
这个库非常,非常,非常轻量。
放张图片自己看
其中SpringAnimation是DynamicAnimation的子类
DynamicAnimation--符合动力学的动画,即物理动画。也是物理动画类的基类
在实际使用中,我们接触到的类也就SpringForceSpringAnimation和DynamicAnimation.ViewPorperty三个。
其中DynamicAnimaiton.ViewPorperty是已经定义好的静态常量类。 它定义的内容就是3.0之后的属性动画中的属性Porperty。
比如:Translation,Rotation,Scale....
使用的话只需要通过类名直接访问即可。
下面我们来看看例子:
实践出真知
第一步 : 导包
compile 'com.android.support:support-dynamic-animation:25.3.0'
第二步 : sample
场景: 一个Acitivity
在这个Activity的布局中声明一个ImageView
在Activity中findViewById...
给这个ImageView添加点击事件
点击ImageView执行动画(往下平移100单位)
代码很简单我就不贴了。主要贴一下点击事件的动画代码
mImg.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view)
{ SpringForce springForce = new SpringForce(200);
//设置阻尼比例 springForce.setDampingRatio(SpringForce.DAMPING_RATIO_HIGH_BOUNCY);
//设置生硬度 springForce.setStiffness(SpringForce.STIFFNESS_VERY_LOW);
//声明动画对象
SpringAnimation animation = new SpringAnimation(mImg,SpringAnimation.TRANSLATION_Y); animation.setSpring(springForce);
//开始动画
animation.start();
} });
图片
动画的开始位置是ImageView所在的原本的位置。
动画的结束位置则是SpringForce构造函数中传入的finalPositon参数。
分析
以上总共使用了两个类:
Class
Description
Spring
Animation
弹簧动画类。可设置动画开始和结束、动画开始坐标、动画类型等
Srping
Force
弹性描述类。可设置弹力的阻尼,生硬度、动画终点坐标
SpringAnimation
SpringAnimation的构造函数有两个:
通过第二个构造函数传入第三个参数finalPositon(终点坐标),SpringAnimation在内部也维护了一个SpringForce对象。所以上面的写法我们可以改成:
mImg.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { SpringAnimation animation = new SpringAnimation(mImg,SpringAnimation.TRANSLATION_Y,200); animation.getSpring().setDampingRatio(SpringForce.DAMPING_RATIO_HIGH_BOUNCY); animation.getSpring().setStiffness(SpringForce.STIFFNESS_VERY_LOW); animation.start(); } });
效果是一样的,就不贴图了。
值得注意的是,如果finalPosition如果传入的是0的话。动画是没有任何效果的。因为默认的动画起始坐标也是0,起点是0,终点是0,所以没有效果。
除非使用SpringAnimation的setStartValue()方法设置动画的开始坐标为一个非0的值即可。
总之开始坐标和传入的finalPosition的值不一致就可以了。
继续看SpringAnimation的构造函数。它的第二个参数ViewProperty其实就是DynamicAnimation.ViewProperty。直接通过子类的类名访问即可。
这个类定义了SpringAnimation可以作用的属性,大多数都包含X,Y两个轴,也有包含Z轴的:
ROTATION // 旋转 SCALE // 缩放 Translation // 平移 Alpha // 透明度
也有一个比较有意思的属性:
Scroll // 滚动
这个动画让我们来看看效果:
这个动画是在View的宽高大小内进行内容的水平和垂直的移动。
动画的执行是View的内容而不是View本身。当图片内容比实际图片的显示区域大的时候可能才有用武之地吧。
SpringForc
SpringForce是用来调整动画执行过程的一些参数,使得动画的效果最适合。 其中最重要的两个:
// 设置阻尼比例 public SpringForce setDampingRatio(@FloatRange(from = 0.0) float dampingRatio) { ... } // 设置生硬度 public SpringForce setStiffness(@FloatRange(from = 0.0) float stiffness) { ... }
阻尼的取值范围是在[0,1]之间。值越大,动画摆动的幅度越小,反之亦然。如果你传入最大值1。结果就是一个平移动画跟正常用属性动画实现的平移动画没有任何区别。
生硬度的取值是一个比1大的正数即可。stiffness的值越小,弹簧更容易摆动,摆动的时间越长。反过来,stiffness的值越大,摆动的时间越短。这个值,决定了动画的摆动时间。
具体,各位看官稍微试一下,立马就能理解了。
SpringForce默认帮我们定义了一些这个两个参数的取值:
//高弹性 public static final float DAMPING_RATIO_HIGH_BOUNCY = 0.2f; //中等弹性 public static final float DAMPING_RATIO_MEDIUM_BOUNCY = 0.5f; //低弹性 public static final float DAMPING_RATIO_LOW_BOUNCY = 0.75f; //没有弹性 public static final float DAMPING_RATIO_NO_BOUNCY = 1f; //高生硬度 public static final float STIFFNESS_HIGH = 10_000f; //中生硬度 public static final float STIFFNESS_MEDIUM = 1500f; //低生硬度 public static final float STIFFNESS_LOW = 200f; //很低生硬度 public static final float STIFFNESS_VERY_LOW = 50f;
实战
我们用一个FaceBook的例子来实验一下。
代码也很简单:
springAnimationX = new SpringAnimation(mImg, SpringAnimation.SCALE_X, 0.5f); springAnimationY = new SpringAnimation(mImg, SpringAnimation.SCALE_Y, 0.5f); mImg.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: springAnimationY.getSpring().setDampingRatio(getDamping()); springAnimationY.getSpring().setStiffness(getStiffness()); springAnimationY.getSpring().setFinalPosition(0.5f); springAnimationX.getSpring().setDampingRatio(getDamping()); springAnimationX.getSpring().setStiffness(getStiffness()); springAnimationX.getSpring().setFinalPosition(0.5f); springAnimationY.start(); springAnimationX.start(); return true; case MotionEvent.ACTION_UP: springAnimationY.cancel(); springAnimationX.cancel(); springAnimationY.getSpring().setFinalPosition(1f); springAnimationX.getSpring().setFinalPosition(1f); springAnimationY.start(); springAnimationX.start(); return true; } return false; } });
得到的效果是这样:

优缺点
优点:
· 实现效果。从实现效果上来说比之使用插值器实现的动画流畅度和自然度更高,符合人的视觉习惯。能带来比较好的视觉体验。
· 轻量。一个中小型项目有它没它,对于最终导出的APK来说,大小上并没有多少区别。
· 直接作用在View上。调用者只需要关心阻尼和生硬度两个参数而已。就可以实现大部分场景下的弹簧动画需求。
· API简单,源码通俗易懂,学习成本低。
不足:
· 如果要实现一些组合的动画效果。可能需要创建多个SpringAnimation对象。在复杂场景下不易于管理。
12
往期精彩



