调用方式:
AnimUtils.kickBackAnim(view,200,2000,1500);
AnimUtils类
/**
* AnimUtils
*/
public class AnimUtils {
/**
* 回弹效果动画
*
* @param delayTime 延迟时间
* @param view
* @param durationTime 动画持续时长
* @param defoutRange 回弹幅度
*/
public static void kickBackAnim( final View view, int delayTime,int durationTime,int defoutRange ,String propertyName) {
view.setVisibility(View.INVISIBLE);
view.postDelayed(new Runnable() {
@Override
public void run() {
//时长
view.setVisibility(View.VISIBLE);
ValueAnimator fadeAnim = null;
switch (propertyName.toLowerCase()) {
case "x":
fadeAnim = ObjectAnimator.ofFloat(view, "translationX", defoutRange, 0);
break;
case "y":
fadeAnim = ObjectAnimator.ofFloat(view, "translationY", defoutRange, 0);
break;
} fadeAnim.setDuration(duration);
KickBackAnimator kickAnimator = new KickBackAnimator();
kickAnimator.setDuration(durationTime);
fadeAnim.setEvaluator(kickAnimator);
fadeAnim.start();
fadeAnim.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
view.clearAnimation();
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
}
}, delayTime);
}
}
KickBackAnimator类:
/**
* 上下回弹动画
*/
public class KickBackAnimator implements TypeEvaluator<Float> {
private final float s = 1.70158f;
float mDuration = 0f;
public void setDuration(float duration) {
mDuration = duration;
}
public Float evaluate(float fraction, Float startValue, Float endValue) {
float t = mDuration * fraction;
float b = startValue.floatValue();
float c = endValue.floatValue() - startValue.floatValue();
float d = mDuration;
float result = calculate(t, b, c, d);
return result;
}
public Float calculate(float t, float b, float c, float d) {
return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b;
}
}