Android SpringAnimation 弹性动画的实现

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)

效果如下:
在这里插入图片描述


版权声明:本文为qq_39347285原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。