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