package net.coding.program.maopao.item; import android.animation.TypeEvaluator; import android.animation.ValueAnimator; import android.graphics.PointF; import android.view.View; import android.view.animation.DecelerateInterpolator; /** * Created by chenchao on 15/9/14. * 冒泡点赞动画 */ public class MaopaoLikeAnimation { public static void playAnimation(final View viewSelf, View startView) { ValueAnimator valueAnimator = new ValueAnimator(); valueAnimator.setDuration(2000); float pivotX = (startView.getLeft() + startView.getRight()) / 2 - viewSelf.getWidth() / 2; float pivotY = (startView.getTop() + startView.getBottom()) / 2 - viewSelf.getHeight() / 2; valueAnimator.setObjectValues( new PointScal(pivotX, pivotY, 0), new PointScal(pivotX, pivotY, 0) ); valueAnimator.setInterpolator(new DecelerateInterpolator()); valueAnimator.setEvaluator(new TypeEvaluator<PointScal>() { @Override public PointScal evaluate(float fraction, PointScal start, PointScal endValue) { PointF pointStart = start.mPoint; PointF point = new PointF(); point.x = 33 * (fraction * 3) * (fraction * 3) + pointStart.x; point.y = -200 * (fraction * 3) + pointStart.y; return new PointScal(point, fraction); } }); valueAnimator.start(); valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { PointScal pointScal = (PointScal) animation.getAnimatedValue(); PointF point = pointScal.mPoint; viewSelf.setX(point.x); viewSelf.setY(point.y); float value = pointScal.mFraction; float alpha = 1 - value * 2f; if (alpha < 0) { alpha = 0; } viewSelf.setAlpha(alpha); viewSelf.setRotation(value * 60); float scal = value * 2 + 1; viewSelf.setScaleX(scal); viewSelf.setScaleY(scal); } }); } private static class PointScal { public PointF mPoint; public Float mFraction; public PointScal(PointF mPoint, float mFraction) { this.mPoint = mPoint; this.mFraction = mFraction; } public PointScal(float x, float y, float frac) { this(new PointF(x, y), frac); } } }