diff options
Diffstat (limited to 'WordPress/src/main/java/org/wordpress/android/util/AniUtils.java')
-rw-r--r-- | WordPress/src/main/java/org/wordpress/android/util/AniUtils.java | 252 |
1 files changed, 252 insertions, 0 deletions
diff --git a/WordPress/src/main/java/org/wordpress/android/util/AniUtils.java b/WordPress/src/main/java/org/wordpress/android/util/AniUtils.java new file mode 100644 index 000000000..57a4f0072 --- /dev/null +++ b/WordPress/src/main/java/org/wordpress/android/util/AniUtils.java @@ -0,0 +1,252 @@ +package org.wordpress.android.util; + +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.ObjectAnimator; +import android.animation.PropertyValuesHolder; +import android.content.Context; +import android.view.View; +import android.view.animation.AccelerateDecelerateInterpolator; +import android.view.animation.AccelerateInterpolator; +import android.view.animation.Animation; +import android.view.animation.Animation.AnimationListener; +import android.view.animation.AnimationUtils; +import android.view.animation.DecelerateInterpolator; +import android.view.animation.LinearInterpolator; +import android.view.animation.TranslateAnimation; + +import org.wordpress.android.R; + +public class AniUtils { + + public enum Duration { + SHORT, + MEDIUM, + LONG; + + public long toMillis(Context context) { + switch (this) { + case LONG: + return context.getResources().getInteger(android.R.integer.config_longAnimTime); + case MEDIUM: + return context.getResources().getInteger(android.R.integer.config_mediumAnimTime); + default: + return context.getResources().getInteger(android.R.integer.config_shortAnimTime); + } + } + } + + public interface AnimationEndListener { + void onAnimationEnd(); + } + + private AniUtils() { + throw new AssertionError(); + } + + public static void startAnimation(View target, int aniResId) { + startAnimation(target, aniResId, null); + } + + public static void startAnimation(View target, int aniResId, int duration) { + if (target == null) return; + + Animation animation = AnimationUtils.loadAnimation(target.getContext(), aniResId); + if (animation != null) { + animation.setDuration(duration); + target.startAnimation(animation); + } + } + + public static void startAnimation(View target, int aniResId, AnimationListener listener) { + if (target == null) return; + + Animation animation = AnimationUtils.loadAnimation(target.getContext(), aniResId); + if (animation != null) { + if (listener != null) { + animation.setAnimationListener(listener); + } + target.startAnimation(animation); + } + } + + /* + * in/out animation for floating action button + */ + public static void showFab(final View view, final boolean show) { + if (view == null) return; + + Context context = view.getContext(); + int fabHeight = context.getResources().getDimensionPixelSize(android.support.design.R.dimen.design_fab_size_normal); + int fabMargin = context.getResources().getDimensionPixelSize(R.dimen.fab_margin); + int max = (fabHeight + fabMargin) * 2; + float fromY = (show ? max : 0f); + float toY = (show ? 0f : max); + + ObjectAnimator anim = ObjectAnimator.ofFloat(view, View.TRANSLATION_Y, fromY, toY); + if (show) { + anim.setInterpolator(new DecelerateInterpolator()); + } else { + anim.setInterpolator(new AccelerateInterpolator()); + } + anim.setDuration(show ? Duration.LONG.toMillis(context) : Duration.SHORT.toMillis(context)); + + anim.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationStart(Animator animation) { + super.onAnimationStart(animation); + if (view.getVisibility() != View.VISIBLE) { + view.setVisibility(View.VISIBLE); + } + } + @Override + public void onAnimationEnd(Animator animation) { + super.onAnimationEnd(animation); + if (!show) { + view.setVisibility(View.GONE); + } + } + }); + + anim.start(); + } + + /* + * used when animating a toolbar in/out + */ + public static void animateTopBar(View view, boolean show) { + animateBar(view, show, true); + } + + public static void animateBottomBar(View view, boolean show) { + animateBar(view, show, false); + } + + private static void animateBar(final View view, + final boolean show, + final boolean isTopBar) { + int newVisibility = (show ? View.VISIBLE : View.GONE); + if (view == null || view.getVisibility() == newVisibility) { + return; + } + + float fromY; + float toY; + if (isTopBar) { + fromY = (show ? -1f : 0f); + toY = (show ? 0f : -1f); + } else { + fromY = (show ? 1f : 0f); + toY = (show ? 0f : 1f); + } + Animation animation = new TranslateAnimation( + Animation.RELATIVE_TO_SELF, 0.0f, + Animation.RELATIVE_TO_SELF, 0.0f, + Animation.RELATIVE_TO_SELF, fromY, + Animation.RELATIVE_TO_SELF, toY); + + long durationMillis = Duration.SHORT.toMillis(view.getContext()); + animation.setDuration(durationMillis); + + if (show) { + animation.setInterpolator(new DecelerateInterpolator()); + } else { + animation.setInterpolator(new AccelerateInterpolator()); + } + + view.clearAnimation(); + view.startAnimation(animation); + view.setVisibility(newVisibility); + } + + private static ObjectAnimator getFadeInAnim(final View target, Duration duration) { + ObjectAnimator fadeIn = ObjectAnimator.ofFloat(target, View.ALPHA, 0.0f, 1.0f); + fadeIn.setDuration(duration.toMillis(target.getContext())); + fadeIn.setInterpolator(new LinearInterpolator()); + fadeIn.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationStart(Animator animation) { + target.setVisibility(View.VISIBLE); + } + }); + return fadeIn; + } + + private static ObjectAnimator getFadeOutAnim(final View target, Duration duration) { + ObjectAnimator fadeOut = ObjectAnimator.ofFloat(target, View.ALPHA, 1.0f, 0.0f); + fadeOut.setDuration(duration.toMillis(target.getContext())); + fadeOut.setInterpolator(new LinearInterpolator()); + fadeOut.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + target.setVisibility(View.GONE); + } + }); + return fadeOut; + } + + public static void fadeIn(final View target, Duration duration) { + if (target != null && duration != null) { + getFadeInAnim(target, duration).start(); + } + } + + public static void fadeOut(final View target, Duration duration) { + if (target != null && duration != null) { + getFadeOutAnim(target, duration).start(); + } + } + + public static void scaleIn(final View target, Duration duration) { + if (target == null || duration == null) { + return; + } + + PropertyValuesHolder scaleX = PropertyValuesHolder.ofFloat(View.SCALE_X, 0f, 1f); + PropertyValuesHolder scaleY = PropertyValuesHolder.ofFloat(View.SCALE_Y, 0f, 1f); + + ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(target, scaleX, scaleY); + animator.setDuration(duration.toMillis(target.getContext())); + animator.setInterpolator(new AccelerateDecelerateInterpolator()); + + animator.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationStart(Animator animation) { + target.setVisibility(View.VISIBLE); + } + }); + + animator.start(); + } + + public static void scaleOut(final View target, Duration duration) { + scaleOut(target, View.GONE, duration, null); + } + public static void scaleOut(final View target, + final int endVisibility, + Duration duration, + final AnimationEndListener endListener) { + if (target == null || duration == null) { + return; + } + + PropertyValuesHolder scaleX = PropertyValuesHolder.ofFloat(View.SCALE_X, 1f, 0f); + PropertyValuesHolder scaleY = PropertyValuesHolder.ofFloat(View.SCALE_Y, 1f, 0f); + + ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(target, scaleX, scaleY); + animator.setDuration(duration.toMillis(target.getContext())); + animator.setInterpolator(new AccelerateInterpolator()); + + animator.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + target.setVisibility(endVisibility); + if (endListener != null) { + endListener.onAnimationEnd(); + } + } + }); + + animator.start(); + } +} |