/* * Copyright (C) 2016 Google Inc. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.android.apps.santatracker.doodles.shared; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.PropertyValuesHolder; import android.animation.TimeInterpolator; import android.animation.ValueAnimator; import android.animation.ValueAnimator.AnimatorUpdateListener; import android.view.View; import android.view.animation.AccelerateDecelerateInterpolator; import android.widget.TextView; /** * Utility class for working with Android views. */ public final class UIUtil { private UIUtil() { // Don't instantiate this class. } /** * Shortcut to create a ValuesAnimator with the given configuration. */ public static ValueAnimator animator(long durationMillis, TimeInterpolator interpolator, AnimatorUpdateListener listener, PropertyValuesHolder... propertyValuesHolders) { ValueAnimator tween = ValueAnimator.ofPropertyValuesHolder(propertyValuesHolders); tween.setDuration(durationMillis); tween.setInterpolator(interpolator); tween.addUpdateListener(listener); return tween; } /** * Shortcut for making a PropertyValuesHolder for floats. */ public static PropertyValuesHolder floatValue(String name, float start, float end) { return PropertyValuesHolder.ofFloat(name, start, end); } public static void fadeOutAndHide(final View v, long durationMs, float startAlpha, final Runnable onFinishRunnable) { if (v.getVisibility() != View.VISIBLE) { return; // Already hidden. } ValueAnimator fadeOut = animator(durationMs, new AccelerateDecelerateInterpolator(), new AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator valueAnimator) { v.setAlpha((float) valueAnimator.getAnimatedValue("alpha")); } }, floatValue("alpha", startAlpha, 0) ); fadeOut.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { v.setVisibility(View.INVISIBLE); if (onFinishRunnable != null) { onFinishRunnable.run(); } } }); fadeOut.start(); } public static void fadeOutAndHide(final View v, long durationMs, float startAlpha) { fadeOutAndHide(v, durationMs, startAlpha, null); } public static void fadeOutAndHide(final View v, long durationMs) { fadeOutAndHide(v, durationMs, 1); } public static void showAndFadeIn(final View v, long durationMs, float endAlpha) { if (v.getVisibility() == View.VISIBLE) { return; // Already visible. } v.setAlpha(0); v.setVisibility(View.VISIBLE); ValueAnimator fadeIn = animator(durationMs, new AccelerateDecelerateInterpolator(), new AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator valueAnimator) { v.setAlpha((float) valueAnimator.getAnimatedValue("alpha")); } }, floatValue("alpha", 0, endAlpha) ); fadeIn.start(); } public static void showAndFadeIn(final View v, long durationMs) { showAndFadeIn(v, durationMs, 1); } public static void fitToBounds(TextView textView, float widthPx, float heightPx) { textView.measure(0, 0); float currentWidthPx = textView.getMeasuredWidth(); float currentHeightPx = textView.getMeasuredHeight(); float textSize = textView.getTextSize(); float scale = Math.min(widthPx / currentWidthPx, heightPx / currentHeightPx); textView.setTextSize(textSize * scale); } /** * Translates in Y from startPercent to endPercent (expecting 0 for 0%, 1 for 100%). * Hides at the end based on hideOnEnd. */ public static void panUpAndHide(final View v, float startPercent, float endPercent, long durationMs, boolean hideOnEnd) { if (v.getVisibility() != View.VISIBLE) { return; // Already hidden. } ValueAnimator panUp = animator(durationMs, new AccelerateDecelerateInterpolator(), new AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator valueAnimator) { v.setY(((float) valueAnimator.getAnimatedValue()) * v.getHeight()); } }, floatValue("translateY", startPercent, endPercent) ); if (hideOnEnd) { panUp.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { v.setVisibility(View.INVISIBLE); } }); } panUp.start(); } }