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) {
}
}
}