SetupAnimationHelper.java revision 1abddd9f6225298066094e20a6c29061b6af4590
11abddd9f6225298066094e20a6c29061b6af4590Nick Chalko/* 21abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Copyright (C) 2015 The Android Open Source Project 31abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * 41abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Licensed under the Apache License, Version 2.0 (the "License"); 51abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * you may not use this file except in compliance with the License. 61abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * You may obtain a copy of the License at 71abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * 81abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * http://www.apache.org/licenses/LICENSE-2.0 91abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * 101abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Unless required by applicable law or agreed to in writing, software 111abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * distributed under the License is distributed on an "AS IS" BASIS, 121abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * See the License for the specific language governing permissions and 141abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * limitations under the License. 151abddd9f6225298066094e20a6c29061b6af4590Nick Chalko */ 161abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 171abddd9f6225298066094e20a6c29061b6af4590Nick Chalkopackage com.android.tv.common.ui.setup.animation; 181abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 191abddd9f6225298066094e20a6c29061b6af4590Nick Chalkoimport android.animation.Animator; 201abddd9f6225298066094e20a6c29061b6af4590Nick Chalkoimport android.animation.AnimatorListenerAdapter; 211abddd9f6225298066094e20a6c29061b6af4590Nick Chalkoimport android.animation.AnimatorSet; 221abddd9f6225298066094e20a6c29061b6af4590Nick Chalkoimport android.animation.ObjectAnimator; 231abddd9f6225298066094e20a6c29061b6af4590Nick Chalkoimport android.animation.TypeEvaluator; 241abddd9f6225298066094e20a6c29061b6af4590Nick Chalkoimport android.transition.Transition; 251abddd9f6225298066094e20a6c29061b6af4590Nick Chalkoimport android.transition.TransitionSet; 261abddd9f6225298066094e20a6c29061b6af4590Nick Chalkoimport android.view.Gravity; 271abddd9f6225298066094e20a6c29061b6af4590Nick Chalkoimport android.view.View; 281abddd9f6225298066094e20a6c29061b6af4590Nick Chalkoimport android.widget.ImageView; 291abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 301abddd9f6225298066094e20a6c29061b6af4590Nick Chalko/** 311abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * A helper class for setup animation. 321abddd9f6225298066094e20a6c29061b6af4590Nick Chalko */ 331abddd9f6225298066094e20a6c29061b6af4590Nick Chalkopublic final class SetupAnimationHelper { 341abddd9f6225298066094e20a6c29061b6af4590Nick Chalko public static final long DELAY_BETWEEN_SIBLINGS_MS = applyAnimationTimeScale(33); 351abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 361abddd9f6225298066094e20a6c29061b6af4590Nick Chalko private static final float ANIMATION_SCALE = 1.0f; 371abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 381abddd9f6225298066094e20a6c29061b6af4590Nick Chalko private static long sFragmentTransitionDuration; 391abddd9f6225298066094e20a6c29061b6af4590Nick Chalko private static int sFragmentTransitionDistance; 401abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 411abddd9f6225298066094e20a6c29061b6af4590Nick Chalko private SetupAnimationHelper() { } 421abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 431abddd9f6225298066094e20a6c29061b6af4590Nick Chalko /** 441abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Sets the duration of the fragment transition. 451abddd9f6225298066094e20a6c29061b6af4590Nick Chalko */ 461abddd9f6225298066094e20a6c29061b6af4590Nick Chalko public static void setFragmentTransitionDuration(long duration) { 471abddd9f6225298066094e20a6c29061b6af4590Nick Chalko sFragmentTransitionDuration = duration; 481abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 491abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 501abddd9f6225298066094e20a6c29061b6af4590Nick Chalko /** 511abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Sets the distance of the fragment transition. 521abddd9f6225298066094e20a6c29061b6af4590Nick Chalko */ 531abddd9f6225298066094e20a6c29061b6af4590Nick Chalko public static void setFragmentTransitionDistance(int distance) { 541abddd9f6225298066094e20a6c29061b6af4590Nick Chalko sFragmentTransitionDistance = distance; 551abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 561abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 571abddd9f6225298066094e20a6c29061b6af4590Nick Chalko public static class TransitionBuilder { 581abddd9f6225298066094e20a6c29061b6af4590Nick Chalko private int mSlideEdge = Gravity.START; 591abddd9f6225298066094e20a6c29061b6af4590Nick Chalko private int mDistance = sFragmentTransitionDistance; 601abddd9f6225298066094e20a6c29061b6af4590Nick Chalko private long mDuration = sFragmentTransitionDuration; 611abddd9f6225298066094e20a6c29061b6af4590Nick Chalko private int[] mParentIdForDelay; 621abddd9f6225298066094e20a6c29061b6af4590Nick Chalko private int[] mExcludeIds; 631abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 641abddd9f6225298066094e20a6c29061b6af4590Nick Chalko /** 651abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Sets the edge of the slide transition. 661abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * 671abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * @see android.transition.Slide#setSlideEdge 681abddd9f6225298066094e20a6c29061b6af4590Nick Chalko */ 691abddd9f6225298066094e20a6c29061b6af4590Nick Chalko public TransitionBuilder setSlideEdge(int slideEdge) { 701abddd9f6225298066094e20a6c29061b6af4590Nick Chalko mSlideEdge = slideEdge; 711abddd9f6225298066094e20a6c29061b6af4590Nick Chalko return this; 721abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 731abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 741abddd9f6225298066094e20a6c29061b6af4590Nick Chalko /** 751abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Sets the duration of the transition. 761abddd9f6225298066094e20a6c29061b6af4590Nick Chalko */ 771abddd9f6225298066094e20a6c29061b6af4590Nick Chalko public TransitionBuilder setDuration(long duration) { 781abddd9f6225298066094e20a6c29061b6af4590Nick Chalko mDuration = duration; 791abddd9f6225298066094e20a6c29061b6af4590Nick Chalko return this; 801abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 811abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 821abddd9f6225298066094e20a6c29061b6af4590Nick Chalko /** 831abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Sets the ID of the view whose descendants will perform delayed move. 841abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * 851abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * @see android.view.ViewGroup#isTransitionGroup 861abddd9f6225298066094e20a6c29061b6af4590Nick Chalko */ 871abddd9f6225298066094e20a6c29061b6af4590Nick Chalko public TransitionBuilder setParentIdsForDelay(int[] parentIdForDelay) { 881abddd9f6225298066094e20a6c29061b6af4590Nick Chalko mParentIdForDelay = parentIdForDelay; 891abddd9f6225298066094e20a6c29061b6af4590Nick Chalko return this; 901abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 911abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 921abddd9f6225298066094e20a6c29061b6af4590Nick Chalko /** 931abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Sets the ID's of the views which will not be included in the transition. 941abddd9f6225298066094e20a6c29061b6af4590Nick Chalko */ 951abddd9f6225298066094e20a6c29061b6af4590Nick Chalko public TransitionBuilder setExcludeIds(int[] excludeIds) { 961abddd9f6225298066094e20a6c29061b6af4590Nick Chalko mExcludeIds = excludeIds; 971abddd9f6225298066094e20a6c29061b6af4590Nick Chalko return this; 981abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 991abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 1001abddd9f6225298066094e20a6c29061b6af4590Nick Chalko /** 1011abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Builds and returns the {@link android.transition.Transition}. 1021abddd9f6225298066094e20a6c29061b6af4590Nick Chalko */ 1031abddd9f6225298066094e20a6c29061b6af4590Nick Chalko public Transition build() { 1041abddd9f6225298066094e20a6c29061b6af4590Nick Chalko FadeAndShortSlide transition = new FadeAndShortSlide(mSlideEdge, mParentIdForDelay); 1051abddd9f6225298066094e20a6c29061b6af4590Nick Chalko transition.setDistance(mDistance); 1061abddd9f6225298066094e20a6c29061b6af4590Nick Chalko transition.setDuration(mDuration); 1071abddd9f6225298066094e20a6c29061b6af4590Nick Chalko if (mExcludeIds != null) { 1081abddd9f6225298066094e20a6c29061b6af4590Nick Chalko for (int id : mExcludeIds) { 1091abddd9f6225298066094e20a6c29061b6af4590Nick Chalko transition.excludeTarget(id, true); 1101abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 1111abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 1121abddd9f6225298066094e20a6c29061b6af4590Nick Chalko return transition; 1131abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 1141abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 1151abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 1161abddd9f6225298066094e20a6c29061b6af4590Nick Chalko /** 1171abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Applies the animation scale to the given {@code animator}. 1181abddd9f6225298066094e20a6c29061b6af4590Nick Chalko */ 1191abddd9f6225298066094e20a6c29061b6af4590Nick Chalko public static Animator applyAnimationTimeScale(Animator animator) { 1201abddd9f6225298066094e20a6c29061b6af4590Nick Chalko if (animator instanceof AnimatorSet) { 1211abddd9f6225298066094e20a6c29061b6af4590Nick Chalko for (Animator child : ((AnimatorSet) animator).getChildAnimations()) { 1221abddd9f6225298066094e20a6c29061b6af4590Nick Chalko applyAnimationTimeScale(child); 1231abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 1241abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 1251abddd9f6225298066094e20a6c29061b6af4590Nick Chalko if (animator.getDuration() > 0) { 1261abddd9f6225298066094e20a6c29061b6af4590Nick Chalko animator.setDuration((long) (animator.getDuration() * ANIMATION_SCALE)); 1271abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 1281abddd9f6225298066094e20a6c29061b6af4590Nick Chalko animator.setStartDelay((long) (animator.getStartDelay() * ANIMATION_SCALE)); 1291abddd9f6225298066094e20a6c29061b6af4590Nick Chalko return animator; 1301abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 1311abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 1321abddd9f6225298066094e20a6c29061b6af4590Nick Chalko /** 1331abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Applies the animation scale to the given {@code transition}. 1341abddd9f6225298066094e20a6c29061b6af4590Nick Chalko */ 1351abddd9f6225298066094e20a6c29061b6af4590Nick Chalko public static Transition applyAnimationTimeScale(Transition transition) { 1361abddd9f6225298066094e20a6c29061b6af4590Nick Chalko if (transition instanceof TransitionSet) { 1371abddd9f6225298066094e20a6c29061b6af4590Nick Chalko TransitionSet set = (TransitionSet) transition; 1381abddd9f6225298066094e20a6c29061b6af4590Nick Chalko int count = set.getTransitionCount(); 1391abddd9f6225298066094e20a6c29061b6af4590Nick Chalko for (int i = 0; i < count; ++i) { 1401abddd9f6225298066094e20a6c29061b6af4590Nick Chalko applyAnimationTimeScale(set.getTransitionAt(i)); 1411abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 1421abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 1431abddd9f6225298066094e20a6c29061b6af4590Nick Chalko if (transition.getDuration() > 0) { 1441abddd9f6225298066094e20a6c29061b6af4590Nick Chalko transition.setDuration((long) (transition.getDuration() * ANIMATION_SCALE)); 1451abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 1461abddd9f6225298066094e20a6c29061b6af4590Nick Chalko transition.setStartDelay((long) (transition.getStartDelay() * ANIMATION_SCALE)); 1471abddd9f6225298066094e20a6c29061b6af4590Nick Chalko return transition; 1481abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 1491abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 1501abddd9f6225298066094e20a6c29061b6af4590Nick Chalko /** 1511abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Applies the animation scale to the given {@code time}. 1521abddd9f6225298066094e20a6c29061b6af4590Nick Chalko */ 1531abddd9f6225298066094e20a6c29061b6af4590Nick Chalko public static long applyAnimationTimeScale(long time) { 1541abddd9f6225298066094e20a6c29061b6af4590Nick Chalko return (long) (time * ANIMATION_SCALE); 1551abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 1561abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 1571abddd9f6225298066094e20a6c29061b6af4590Nick Chalko /** 1581abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Returns an animator which animate the source image of the {@link ImageView}. 1591abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * 1601abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * <p>The frame rate is 60 fps. 1611abddd9f6225298066094e20a6c29061b6af4590Nick Chalko */ 1621abddd9f6225298066094e20a6c29061b6af4590Nick Chalko public static ObjectAnimator createFrameAnimator(ImageView imageView, int[] frames) { 1631abddd9f6225298066094e20a6c29061b6af4590Nick Chalko return createFrameAnimatorWithDelay(imageView, frames, 0); 1641abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 1651abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 1661abddd9f6225298066094e20a6c29061b6af4590Nick Chalko /** 1671abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Returns an animator which animate the source image of the {@link ImageView} with start delay. 1681abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * 1691abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * <p>The frame rate is 60 fps. 1701abddd9f6225298066094e20a6c29061b6af4590Nick Chalko */ 1711abddd9f6225298066094e20a6c29061b6af4590Nick Chalko public static ObjectAnimator createFrameAnimatorWithDelay(ImageView imageView, int[] frames, 1721abddd9f6225298066094e20a6c29061b6af4590Nick Chalko long startDelay) { 1731abddd9f6225298066094e20a6c29061b6af4590Nick Chalko ObjectAnimator animator = ObjectAnimator.ofInt(imageView, "imageResource", frames); 1741abddd9f6225298066094e20a6c29061b6af4590Nick Chalko // Make it 60 fps. 1751abddd9f6225298066094e20a6c29061b6af4590Nick Chalko animator.setDuration(frames.length * 1000 / 60); 1761abddd9f6225298066094e20a6c29061b6af4590Nick Chalko animator.setInterpolator(null); 1771abddd9f6225298066094e20a6c29061b6af4590Nick Chalko animator.setStartDelay(startDelay); 1781abddd9f6225298066094e20a6c29061b6af4590Nick Chalko animator.setEvaluator(new TypeEvaluator<Integer>() { 1791abddd9f6225298066094e20a6c29061b6af4590Nick Chalko @Override 1801abddd9f6225298066094e20a6c29061b6af4590Nick Chalko public Integer evaluate(float fraction, Integer startValue, Integer endValue) { 1811abddd9f6225298066094e20a6c29061b6af4590Nick Chalko return startValue; 1821abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 1831abddd9f6225298066094e20a6c29061b6af4590Nick Chalko }); 1841abddd9f6225298066094e20a6c29061b6af4590Nick Chalko return animator; 1851abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 1861abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 1871abddd9f6225298066094e20a6c29061b6af4590Nick Chalko /** 1881abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Creates a fade out animator. 1891abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * 1901abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * @param view The view which will be animated. 1911abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * @param duration The duration of the animation. 1921abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * @param makeVisibleAfterAnimation If {@code true}, the view will become visible after the 1931abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * animation ends. 1941abddd9f6225298066094e20a6c29061b6af4590Nick Chalko */ 1951abddd9f6225298066094e20a6c29061b6af4590Nick Chalko public static Animator createFadeOutAnimator(final View view, int duration, 1961abddd9f6225298066094e20a6c29061b6af4590Nick Chalko boolean makeVisibleAfterAnimation) { 1971abddd9f6225298066094e20a6c29061b6af4590Nick Chalko ObjectAnimator animator = ObjectAnimator.ofFloat(view, View.ALPHA, 1.0f, 0.0f); 1981abddd9f6225298066094e20a6c29061b6af4590Nick Chalko if (makeVisibleAfterAnimation) { 1991abddd9f6225298066094e20a6c29061b6af4590Nick Chalko animator.addListener(new AnimatorListenerAdapter() { 2001abddd9f6225298066094e20a6c29061b6af4590Nick Chalko @Override 2011abddd9f6225298066094e20a6c29061b6af4590Nick Chalko public void onAnimationEnd(Animator animation) { 2021abddd9f6225298066094e20a6c29061b6af4590Nick Chalko view.setAlpha(1.0f); 2031abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 2041abddd9f6225298066094e20a6c29061b6af4590Nick Chalko }); 2051abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 2061abddd9f6225298066094e20a6c29061b6af4590Nick Chalko return animator; 2071abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 2081abddd9f6225298066094e20a6c29061b6af4590Nick Chalko} 209