说到插值器 Interpolator,相信每个人都会或多或少知道一些。在此我也总结一下吧!
其实Android动画系统中自带的都有很多种类的插值器,例如:
插值器种类 对应java类 | xml资源id | 说明 |
---|---|---|
AccelerateDecelerateInterpolator | @android:anim/accelerate_decelerate_interpolator | 其变化开始和结束速率较慢,中间加速 |
AccelerateInterpolator | @android:anim/accelerate_interpolator | 其变化开始速率较慢,后面加速 |
DecelerateInterpolator | @android:anim/decelerate_interpolator | 其变化开始速率较快,后面减速 |
LinearInterpolator | @android:anim/linear_interpolator | 其变化速率恒定 |
AnticipateInterpolator | @android:anim/anticipate_interpolator | 其变化开始向后甩,然后向前 |
AnticipateOvershootInterpolator | @android:anim/anticipate_overshoot_interpolator | 其变化开始向后甩,然后向前甩,过冲到目标值,最后又回到了终值 |
OvershootInterpolator | @android:anim/overshoot_interpolator | 其变化开始向前甩,过冲到目标值,最后又回到了终值 |
BounceInterpolator | @android:anim/bounce_interpolator | 其变化在结束时反弹 |
CycleInterpolator | @android:anim/cycle_interpolator | 循环播放,其速率为正弦曲线 |
TimeInterpolator | 一个接口,可以自定义插值器 |
下面我们展示一下 这个插值器 BounceInterpolator 的效果展示:
ps:仿快手app点赞小红心的效果,哈哈
其实这个动画效果也是比较好实现的,大概思路就是:先把view放大再缩小,当动画执行结束之后,再执行透明度从1到0的动画。
光说思路,能把上面的动画效果实现方式,贴出了,岂不是更好!那话不多说,代码如下:(其实在看到一种效果之前,如果能自己先想想实现方式,也是一中很好的习惯哦)
private void likeAnimation(final View view) {
view.setVisibility(View.VISIBLE);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.playTogether(
ObjectAnimator.ofFloat(view, "scaleX", 2f, 1f).setDuration(1 * 1000),
ObjectAnimator.ofFloat(view, "scaleY", 2f, 1f).setDuration(1 * 1000)
//ObjectAnimator.ofFloat(view, "alpha", 0f).setDuration(2 * 1000)
);
//animatorSet.setInterpolator(new FastOutLinearInInterpolator());
//animatorSet.setInterpolator(new AccelerateDecelerateInterpolator());
// animatorSet.setInterpolator(new AnticipateOvershootInterpolator());//其变化开始向后甩,然后向前甩,过冲到目标值,最后又回到了终值
animatorSet.setInterpolator(new BounceInterpolator());//其变化在结束时反弹
animatorSet.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
Log.i(TAG, "onAnimationStart: ");
}
@Override
public void onAnimationEnd(Animator animation) {
Log.i(TAG, "onAnimationEnd: ");
ObjectAnimator objectAnimator = ObjectAnimator
.ofFloat(view, "alpha", 0f)
.setDuration(1 * 1000);
objectAnimator.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
Log.i(TAG, "onAnimationEnd: ");
view.setVisibility(View.GONE);
view.setAlpha(1f);//切记:在动画执行完毕后,要把控件的透明度再设置回来,这样每次点击都有效果。
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
objectAnimator.start();
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
Log.i(TAG, "onAnimationRepeat: ");
}
});
animatorSet.start();
}
AnticipateOvershootInterpolator 插值器效果
ps:这是同样的代码哦,只是插值器用的不同,不知细心的你有没有看到 和 BounceInterpolator 插值器的不同之处。
如果你想自定义插值器,当然也可以:
public class SpringScaleInterpolator implements Interpolator {
private float factor;
public SpringScaleInterpolator(float factor) {
this.factor = factor;
}
@Override
public float getInterpolation(float x) {
return (float) (pow(2, -10 * x) * sin((x - factor / 4) * (2 * PI) / factor) + 1);
//这个公式在http://inloop.github.io/interpolator/中测试获取
}
}
参考博客:
插值器测试查看网站 http://inloop.github.io/interpolator/
ps:挺不错
不错值得研究一下
Android绘制点赞心形