package com.joker.rxweather.ui.animation; import android.annotation.TargetApi; import android.os.Build; import android.view.View; import com.nineoldandroids.animation.Animator; import com.nineoldandroids.animation.ObjectAnimator; import com.nineoldandroids.util.FloatProperty; import java.lang.ref.WeakReference; import static android.os.Build.VERSION.SDK_INT; import static android.os.Build.VERSION_CODES.LOLLIPOP; public class ViewAnimationUtils { private final static boolean LOLLIPOP_PLUS = SDK_INT >= LOLLIPOP; public static final int SCALE_UP_DURATION = 500; private static FloatProperty<RevealAnimator> floatProperty = new FloatProperty<RevealAnimator>("revealRadius") { @Override public void setValue(RevealAnimator object, float value) { object.setRevealRadius(value); } @Override public Float get(RevealAnimator object) { return object.getRevealRadius(); } }; /** * Returns an Animator which can animate a clipping circle. * <p> * Any shadow cast by the View will respect the circular clip from this animator. * <p> * Only a single non-rectangular clip can be applied on a View at any time. * Views clipped by a circular reveal animation take priority over * {@link View#setClipToOutline(boolean) View Outline clipping}. * <p> * Note that the animation returned here is a one-shot animation. It cannot * be re-used, and once started it cannot be paused or resumed. * * @param view The View will be clipped to the animating circle. * @param centerX The x coordinate of the center of the animating circle. * @param centerY The y coordinate of the center of the animating circle. * @param startRadius The starting radius of the animating circle. * @param endRadius The ending radius of the animating circle. */ @TargetApi(Build.VERSION_CODES.LOLLIPOP) public static SupportAnimator createCircularReveal( View view, int centerX, int centerY, float startRadius, float endRadius) { if (!(view.getParent() instanceof RevealAnimator)) { throw new IllegalArgumentException( "View must be inside RevealFrameLayout or RevealLinearLayout."); } RevealAnimator revealLayout = (RevealAnimator) view.getParent(); revealLayout.initRevealInfo( new RevealAnimator.RevealInfo(centerX, centerY, startRadius, endRadius, new WeakReference<>(view))); if (LOLLIPOP_PLUS) { return new SupportAnimatorLollipop( android.view.ViewAnimationUtils.createCircularReveal(view, centerX, centerY, startRadius, endRadius), revealLayout); } ObjectAnimator revealAnimator = ObjectAnimator.ofFloat(revealLayout, floatProperty, startRadius, endRadius); revealAnimator.addListener(getRevealFinishListener(revealLayout)); return new SupportAnimatorPreL(revealAnimator, revealLayout); } private static Animator.AnimatorListener getRevealFinishListener(RevealAnimator target) { if (SDK_INT >= 18) { return new RevealAnimator.RevealFinishedJellyBeanMr2(target); } else if (SDK_INT >= 14) { return new RevealAnimator.RevealFinishedIceCreamSandwich(target); } else { return new RevealAnimator.RevealFinishedGingerbread(target); } } static class SimpleAnimationListener implements Animator.AnimatorListener { @Override public void onAnimationStart(Animator animation) { } @Override public void onAnimationEnd(Animator animation) { } @Override public void onAnimationCancel(Animator animation) { } @Override public void onAnimationRepeat(Animator animation) { } } }