package com.xdroid.animation.anim; import com.xdroid.animation.base.AnimationBase; import com.xdroid.animation.interfaces.Duration; import com.xdroid.animation.utils.ViewHelper; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.view.View; import android.view.animation.AccelerateDecelerateInterpolator; /** * Puff Animation, zoom and gradient at the same time * * @author Robin * @since 2015-08-06 17:27:41 * */ public class PuffAnimation extends AnimationBase<PuffAnimation> { float originalScaleX = 0f , originalScaleY = 0f , originalAlpha = 0f; int puffMode = PuffMode.IN; public interface PuffMode { public static final int IN = 0x01, OUT = 0x02; } /* * ================================================================== * Constructor * ================================================================== */ public PuffAnimation(View targetView) { this.targetView = targetView; interpolator = new AccelerateDecelerateInterpolator(); duration = Duration.DURATION_LONG; listener = null; } /* * ================================================================== * Override CombinableMethod * ================================================================== */ @Override public void animate() { ViewHelper.setClipChildren(targetView, false); float scaleX = 0f, scaleY = 0f, alpha = 0f; switch (puffMode) { case PuffMode.IN: targetView.setScaleX(4f); targetView.setScaleY(4f); targetView.setAlpha(0f); scaleX = 1f; scaleY = 1f; alpha = 1f; break; case PuffMode.OUT: originalScaleX = targetView.getScaleX(); originalScaleY = targetView.getScaleY(); originalAlpha = targetView.getAlpha(); scaleX = 4f; scaleY = 4f; alpha = 0f; break; } targetView.animate().scaleX(scaleX).scaleY(scaleY).alpha(alpha).setInterpolator(interpolator) .setDuration(duration).setListener(new AnimatorListenerAdapter() { @Override public void onAnimationStart(Animator animation) { switch (puffMode) { case PuffMode.IN: targetView.setVisibility(View.VISIBLE); break; case PuffMode.OUT: break; } if (listener != null) { listener.onAnimationStart(animation); } } @Override public void onAnimationEnd(Animator animation) { switch (puffMode) { case PuffMode.IN: break; case PuffMode.OUT: targetView.setVisibility(View.INVISIBLE); targetView.setScaleX(originalScaleX); targetView.setScaleY(originalScaleY); targetView.setAlpha(originalAlpha); break; } if (listener != null) { listener.onAnimationEnd(animation); } } @Override public void onAnimationCancel(Animator animation) { if (listener != null) { listener.onAnimationCancel(animation); } } @Override public void onAnimationRepeat(Animator animation) { if (listener != null) { listener.onAnimationRepeat(animation); } } }); } @Override public AnimatorSet createAnimatorSet() { return null; } /* * ================================================================== * Getter And Setter * ================================================================== */ public int getPuffMode() { return puffMode; } public PuffAnimation setPuffMode(int puffMode) { this.puffMode = puffMode; return this; } }