package com.fastaccess.helper; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ObjectAnimator; import android.graphics.Rect; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.annotation.UiThread; import android.support.v4.view.ViewCompat; import android.view.View; import android.view.ViewPropertyAnimator; import android.view.ViewTreeObserver; import android.view.animation.AccelerateDecelerateInterpolator; import android.view.animation.AccelerateInterpolator; import android.view.animation.Interpolator; import android.view.animation.LinearInterpolator; import java.util.Arrays; import java.util.List; import io.codetail.animation.ViewAnimationUtils; /** * Created by Kosh on 27 May 2016, 9:04 PM */ public class AnimHelper { public interface AnimationCallback { void onAnimationEnd(); void onAnimationStart(); } private static final Interpolator interpolator = new LinearInterpolator(); @UiThread public static void animateVisibility(@Nullable final View view, final boolean show) { animateVisibility(view, show, null); } @UiThread public static void animateVisibility(@Nullable final View view, final boolean show, @Nullable final AnimationCallback callback) { if (view == null) { return; } if (!ViewCompat.isAttachedToWindow(view)) { view.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { view.getViewTreeObserver().removeOnPreDrawListener(this); animateSafeVisibility(show, view, callback); return true; } }); } else { animateSafeVisibility(show, view, callback); } } @UiThread private static void animateSafeVisibility(final boolean show, @NonNull final View view, @Nullable final AnimationCallback callback) { view.clearAnimation(); if (view.getAnimation() != null) view.getAnimation().cancel(); ViewPropertyAnimator animator = view.animate().setDuration(200).alpha(show ? 1F : 0F).setInterpolator(new AccelerateInterpolator()) .setListener(new AnimatorListenerAdapter() { @Override public void onAnimationStart(Animator animation) { super.onAnimationStart(animation); if (callback != null) callback.onAnimationStart(); if (show) { view.setScaleX(1); view.setScaleY(1); view.setVisibility(View.VISIBLE); } } @Override public void onAnimationEnd(@NonNull Animator animation) { super.onAnimationEnd(animation); if (!show) { view.setVisibility(View.GONE); view.setScaleX(0); view.setScaleY(0); } if (callback != null) callback.onAnimationEnd(); animation.removeListener(this); view.clearAnimation(); } }); animator.scaleX(show ? 1 : 0).scaleY(show ? 1 : 0); } @UiThread @NonNull private static List<ObjectAnimator> getBeats(@NonNull View view) { ObjectAnimator[] animator = new ObjectAnimator[]{ ObjectAnimator.ofFloat(view, "scaleY", 1, 1.1f, 1), ObjectAnimator.ofFloat(view, "scaleX", 1, 1.1f, 1) }; return Arrays.asList(animator); } @UiThread public static void startBeatsAnimation(@NonNull View view) { view.clearAnimation(); if (view.getAnimation() != null) { view.getAnimation().cancel(); } List<ObjectAnimator> animators = getBeats(view); for (ObjectAnimator anim : animators) { anim.setDuration(300).start(); anim.setInterpolator(interpolator); } } @UiThread public static void circularReveal(final View mRevealView, final View from, final boolean show) { if (ViewCompat.isAttachedToWindow(mRevealView)) { if (show) { if (mRevealView.isShown()) return; } else { if (!mRevealView.isShown()) { return; } } reveal(mRevealView, show, from); } else { mRevealView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { mRevealView.getViewTreeObserver().removeOnPreDrawListener(this); if (show) { if (mRevealView.isShown()) return true; } else { if (!mRevealView.isShown()) { return true; } } reveal(mRevealView, show, from); return true; } }); } } @UiThread private static void reveal(final View mRevealView, final boolean show, View from) { Rect rect = ViewHelper.getLayoutPosition(from); int x = (int) rect.exactCenterX(); int y = (int) rect.exactCenterY(); Animator animator = ViewAnimationUtils.createCircularReveal(mRevealView, x, y, 0, Math.max(rect.width(), rect.height())); animator.setDuration(400L); animator.setInterpolator(new AccelerateDecelerateInterpolator()); mRevealView.setVisibility(View.VISIBLE); if (!show) { animator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); mRevealView.setVisibility(View.GONE); animation.removeListener(this); } }); animator.start(); } } }