TransitionHelperKitkat.java revision 95400e6d31a1ac09e48cb8944a79b7250484aa4c
155c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout/* 255c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout * Copyright (C) 2014 The Android Open Source Project 355c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout * 455c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 555c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout * in compliance with the License. You may obtain a copy of the License at 655c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout * 755c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout * http://www.apache.org/licenses/LICENSE-2.0 855c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout * 955c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout * Unless required by applicable law or agreed to in writing, software distributed under the License 1055c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 1155c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout * or implied. See the License for the specific language governing permissions and limitations under 1255c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout * the License. 1355c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout */ 1495400e6d31a1ac09e48cb8944a79b7250484aa4cDake Gupackage android.support.v17.leanback.transition; 1555c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout 163c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Guimport android.animation.Animator; 176f8c0cb076a103d044b18fc58117e37d2319d9ebCraig Stoutimport android.animation.TimeInterpolator; 1855c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stoutimport android.content.Context; 199240e796bc63422c28f2707840bd99c48573279bDake Guimport android.transition.AutoTransition; 203c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Guimport android.transition.ChangeBounds; 213c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Guimport android.transition.Fade; 2255c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stoutimport android.transition.Scene; 2355c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stoutimport android.transition.Transition; 2455c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stoutimport android.transition.TransitionManager; 253c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Guimport android.transition.TransitionSet; 263c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Guimport android.transition.TransitionValues; 273c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Guimport android.util.SparseBooleanArray; 283c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Guimport android.util.SparseIntArray; 299240e796bc63422c28f2707840bd99c48573279bDake Guimport android.view.View; 3055c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stoutimport android.view.ViewGroup; 3155c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout 323c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Guimport java.util.ArrayList; 333c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Guimport java.util.HashMap; 343c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu 3595400e6d31a1ac09e48cb8944a79b7250484aa4cDake Gufinal class TransitionHelperKitkat { 363c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu 37e34cae48707e70442aca13e1b4ab55757292828dDake Gu TransitionHelperKitkat() { 3855c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout } 3955c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout 409240e796bc63422c28f2707840bd99c48573279bDake Gu Object createScene(ViewGroup sceneRoot, Runnable enterAction) { 4155c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout Scene scene = new Scene(sceneRoot); 429240e796bc63422c28f2707840bd99c48573279bDake Gu scene.setEnterAction(enterAction); 439240e796bc63422c28f2707840bd99c48573279bDake Gu return scene; 4455c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout } 4555c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout 463c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu Object createTransitionSet(boolean sequential) { 473c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu TransitionSet set = new TransitionSet(); 483c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu set.setOrdering(sequential ? TransitionSet.ORDERING_SEQUENTIAL : 493c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu TransitionSet.ORDERING_TOGETHER); 503c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu return set; 513c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 523c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu 533c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu void addTransition(Object transitionSet, Object transition) { 543c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu ((TransitionSet) transitionSet).addTransition((Transition) transition); 553c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 563c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu 579240e796bc63422c28f2707840bd99c48573279bDake Gu Object createAutoTransition() { 589240e796bc63422c28f2707840bd99c48573279bDake Gu return new AutoTransition(); 599240e796bc63422c28f2707840bd99c48573279bDake Gu } 609240e796bc63422c28f2707840bd99c48573279bDake Gu 612f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu Object createSlide(SlideCallback callback) { 622f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu Slide slide = new Slide(); 632f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu slide.setCallback(callback); 642f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu return slide; 652f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu } 662f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu 673c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu Object createFadeTransition(int fadingMode) { 683c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu Fade fade = new Fade(fadingMode); 693c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu return fade; 703c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 713c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu 723c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu /** 733c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu * change bounds that support customized start delay. 743c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu */ 7595400e6d31a1ac09e48cb8944a79b7250484aa4cDake Gu static class CustomChangeBounds extends ChangeBounds { 763c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu 773c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu int mDefaultStartDelay; 783c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu // View -> delay 793c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu final HashMap<View, Integer> mViewStartDelays = new HashMap<View, Integer>(); 803c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu // id -> delay 813c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu final SparseIntArray mIdStartDelays = new SparseIntArray(); 823c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu // Class.getName() -> delay 833c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu final HashMap<String, Integer> mClassStartDelays = new HashMap<String, Integer>(); 843c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu 853c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu private int getDelay(View view) { 863c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu Integer delay = mViewStartDelays.get(view); 873c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu if (delay != null) { 883c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu return delay; 893c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 903c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu int idStartDelay = mIdStartDelays.get(view.getId(), -1); 913c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu if (idStartDelay != -1) { 923c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu return idStartDelay; 933c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 943c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu delay = mClassStartDelays.get(view.getClass().getName()); 953c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu if (delay != null) { 963c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu return delay; 973c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 983c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu return mDefaultStartDelay; 993c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 1003c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu 1013c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu @Override 1023c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu public Animator createAnimator(ViewGroup sceneRoot, TransitionValues startValues, 1033c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu TransitionValues endValues) { 1043c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu Animator animator = super.createAnimator(sceneRoot, startValues, endValues); 1053c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu if (animator != null && endValues != null && endValues.view != null) { 1063c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu animator.setStartDelay(getDelay(endValues.view)); 1073c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 1083c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu return animator; 1093c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 1103c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu 1113c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu public void setStartDelay(View view, int startDelay) { 1123c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu mViewStartDelays.put(view, startDelay); 1133c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 1143c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu 1153c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu public void setStartDelay(int viewId, int startDelay) { 1163c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu mIdStartDelays.put(viewId, startDelay); 1173c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 1183c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu 1193c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu public void setStartDelay(String className, int startDelay) { 1203c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu mClassStartDelays.put(className, startDelay); 1213c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 1223c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu 1233c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu public void setDefaultStartDelay(int startDelay) { 1243c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu mDefaultStartDelay = startDelay; 1253c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 1263c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 1273c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu 1283c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu Object createChangeBounds(boolean reparent) { 1293c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu CustomChangeBounds changeBounds = new CustomChangeBounds(); 1303c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu changeBounds.setReparent(reparent); 1313c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu return changeBounds; 1323c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 1333c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu 1343c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu void setChangeBoundsStartDelay(Object changeBounds, int viewId, int startDelay) { 1353c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu ((CustomChangeBounds) changeBounds).setStartDelay(viewId, startDelay); 1363c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 1373c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu 1383c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu void setChangeBoundsStartDelay(Object changeBounds, View view, int startDelay) { 1393c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu ((CustomChangeBounds) changeBounds).setStartDelay(view, startDelay); 1403c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 1413c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu 1423c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu void setChangeBoundsStartDelay(Object changeBounds, String className, int startDelay) { 1433c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu ((CustomChangeBounds) changeBounds).setStartDelay(className, startDelay); 1443c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 1453c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu 1463c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu void setChangeBoundsDefaultStartDelay(Object changeBounds, int startDelay) { 1473c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu ((CustomChangeBounds) changeBounds).setDefaultStartDelay(startDelay); 1483c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 1493c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu 1502f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu void setStartDelay(Object transition, long startDelay) { 1512f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu ((Transition)transition).setStartDelay(startDelay); 1522f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu } 1532f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu 1542f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu void setDuration(Object transition, long duration) { 1552f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu ((Transition)transition).setDuration(duration); 1562f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu } 1572f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu 1583c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu void exclude(Object transition, int targetId, boolean exclude) { 1593c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu ((Transition) transition).excludeTarget(targetId, exclude); 1603c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 1613c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu 1623c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu void exclude(Object transition, View targetView, boolean exclude) { 1633c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu ((Transition) transition).excludeTarget(targetView, exclude); 1643c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 1653c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu 1669240e796bc63422c28f2707840bd99c48573279bDake Gu void excludeChildren(Object transition, int targetId, boolean exclude) { 1679240e796bc63422c28f2707840bd99c48573279bDake Gu ((Transition) transition).excludeChildren(targetId, exclude); 1689240e796bc63422c28f2707840bd99c48573279bDake Gu } 1699240e796bc63422c28f2707840bd99c48573279bDake Gu 1709240e796bc63422c28f2707840bd99c48573279bDake Gu void excludeChildren(Object transition, View targetView, boolean exclude) { 1719240e796bc63422c28f2707840bd99c48573279bDake Gu ((Transition) transition).excludeChildren(targetView, exclude); 1729240e796bc63422c28f2707840bd99c48573279bDake Gu } 1739240e796bc63422c28f2707840bd99c48573279bDake Gu 1743c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu void include(Object transition, int targetId) { 1753c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu ((Transition) transition).addTarget(targetId); 1763c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 1773c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu 1783c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu void include(Object transition, View targetView) { 1793c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu ((Transition) transition).addTarget(targetView); 1803c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 1813c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu 1822f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu public void setTransitionListener(Object transition, final TransitionListener listener) { 1839240e796bc63422c28f2707840bd99c48573279bDake Gu Transition t = (Transition) transition; 1849240e796bc63422c28f2707840bd99c48573279bDake Gu t.addListener(new Transition.TransitionListener() { 1859240e796bc63422c28f2707840bd99c48573279bDake Gu 1869240e796bc63422c28f2707840bd99c48573279bDake Gu @Override 1879240e796bc63422c28f2707840bd99c48573279bDake Gu public void onTransitionStart(Transition transition) { 1882f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu listener.onTransitionStart(transition); 1899240e796bc63422c28f2707840bd99c48573279bDake Gu } 1909240e796bc63422c28f2707840bd99c48573279bDake Gu 1919240e796bc63422c28f2707840bd99c48573279bDake Gu @Override 1929240e796bc63422c28f2707840bd99c48573279bDake Gu public void onTransitionResume(Transition transition) { 1939240e796bc63422c28f2707840bd99c48573279bDake Gu } 1949240e796bc63422c28f2707840bd99c48573279bDake Gu 1959240e796bc63422c28f2707840bd99c48573279bDake Gu @Override 1969240e796bc63422c28f2707840bd99c48573279bDake Gu public void onTransitionPause(Transition transition) { 1979240e796bc63422c28f2707840bd99c48573279bDake Gu } 1989240e796bc63422c28f2707840bd99c48573279bDake Gu 1999240e796bc63422c28f2707840bd99c48573279bDake Gu @Override 2009240e796bc63422c28f2707840bd99c48573279bDake Gu public void onTransitionEnd(Transition transition) { 2012f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu listener.onTransitionEnd(transition); 2029240e796bc63422c28f2707840bd99c48573279bDake Gu } 2039240e796bc63422c28f2707840bd99c48573279bDake Gu 2049240e796bc63422c28f2707840bd99c48573279bDake Gu @Override 2059240e796bc63422c28f2707840bd99c48573279bDake Gu public void onTransitionCancel(Transition transition) { 2069240e796bc63422c28f2707840bd99c48573279bDake Gu } 2079240e796bc63422c28f2707840bd99c48573279bDake Gu }); 2089240e796bc63422c28f2707840bd99c48573279bDake Gu } 2099240e796bc63422c28f2707840bd99c48573279bDake Gu 2109240e796bc63422c28f2707840bd99c48573279bDake Gu void runTransition(Object scene, Object transition) { 2119240e796bc63422c28f2707840bd99c48573279bDake Gu TransitionManager.go((Scene) scene, (Transition) transition); 21255c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout } 2136f8c0cb076a103d044b18fc58117e37d2319d9ebCraig Stout 2146f8c0cb076a103d044b18fc58117e37d2319d9ebCraig Stout void setInterpolator(Object transition, Object timeInterpolator) { 2156f8c0cb076a103d044b18fc58117e37d2319d9ebCraig Stout ((Transition) transition).setInterpolator((TimeInterpolator) timeInterpolator); 2166f8c0cb076a103d044b18fc58117e37d2319d9ebCraig Stout } 21755c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout} 218