Android SpringAnimation 弹性动画的实现
之前提到了android中动画分3大种,首先是逐帧动画和补间动画(具体可以查看逐帧动画和补间动画),后又推出了属性动画的概念(其中又牵扯到组合动画的使用,具体可以查看组合动画),然而我们在开发过程中往往会遇到一些这样的需求,如实现一个类似于弹簧效果一样的动画,如:
这一类动画就是弹性动画(SpringAnimation),我们想要实现这一类动画,可以使用插值器,也可以使用SpringAnimation类。
1.使用插值器实现
这里我先给出一个网站可视化插值器,这个网站的插值器可视化以及动画效果做得很不错,并且可以自己调节参数,得到自己想要的效果,并得到具体的公式,把公式直接写入插值器就可以使用,非常的方便。
/**
* 弹性插值器
*/
public class SpringScaleInterpolator implements Interpolator {
//弹性因数
private float factor;
public SpringScaleInterpolator(float factor) {
this.factor = factor;
}
@Override
public float getInterpolation(float input) {
return (float) (pow(2, -8 * input) * sin((input - factor / 4) * (2 * PI) / factor));
}
}
Animation animation= new TranslateAnimation(0,50,0,0);
animation.setFillAfter(true);
animation.setDuration(4000);
animation.setInterpolator(new SpringScaleInterpolator((float) 0.1));
mMoon.startAnimation(animation);
效果如下:
2.使用SpringAnimation类实现
SpringAnimation 类是(25.3.0版本)才添加在支持库中的一个类,它主要是为了让实现弹性动画变得更加方便。
SpringAnimation的基本用法
先导入必要的包:
compile 'com.android.support:support-dynamic-animation:25.3.0'
SpringForce springForce=new SpringForce(0)
.setDampingRatio(0)
.setStiffness(0.5f);
final SpringAnimation animation=new SpringAnimation(mSpringIv,SpringAnimation.ROTATION_X)
.setSpring(springForce);
mSpringBt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
animation.cancel();
//animation.setStartValue(-200);
animation.setStartVelocity(500);
animation.start();
}
});
我们首先定义了一个用于设置弹性参数的 SpringForce 对象,其构造参数中的 0 表示被作用对象的最终位置。setDampingRatio(float dampingRatio)方法设置弹性阻尼,dampingRatio越大,摆动次数越少,当到1的时候完全不摆动,注意它体验出来的最明显的特征是摆动次数这个概念,SpringForce类中预定义了几个dampingRatio常量:
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;
setStiffness(float stiffness)方法设置弹性的生硬度,stiffness值越小,弹簧越容易摆动,摆动的时间越长,反之摆动时间越短,注意它体验出来的最明显的特征是摆动时间这个概念。SpringForce类中预定义了几个stiffness的常量:
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;
定义好了SpringForce对象,我们就可以定义SpringAnimation了,将被作用的view和变化属性传递给SpringAnimation的构造函数,然后调用setSpring设置我们定义好了的SpringForce对象。最后调用SpringAnimation的start()方法开始动画。
值得一提的是SpringAnimation可以作用的属性:
TRANSLATION_X
TRANSLATION_Y
TRANSLATION_Z
SCALE_X
SCALE_Y
ROTATION
ROTATION_X
ROTATION_Y
X
Y
Z
ALPHA
SCROLL_X
SCROLL_Y
要让view按着x轴旋转,则可以这样写:
new SpringAnimation(mSpringIv,SpringAnimation.ROTATION_X)
效果如下: