1faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase/* 2faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * Copyright (C) 2013 The Android Open Source Project 3faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * 4faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * Licensed under the Apache License, Version 2.0 (the "License"); 5faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * you may not use this file except in compliance with the License. 6faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * You may obtain a copy of the License at 7faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * 8faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * http://www.apache.org/licenses/LICENSE-2.0 9faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * 10faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * Unless required by applicable law or agreed to in writing, software 11faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * distributed under the License is distributed on an "AS IS" BASIS, 12faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * See the License for the specific language governing permissions and 14faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * limitations under the License. 15faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase */ 166ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase 17d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haasepackage android.transition; 18faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase 19faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport android.animation.Animator; 20faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport android.view.View; 21faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport android.view.ViewGroup; 22faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase 23faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase/** 24faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * This transition tracks changes to the visibility of target views in the 25faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * start and end scenes. Visibility is determined not just by the 26faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * {@link View#setVisibility(int)} state of views, but also whether 27faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * views exist in the current view hierarchy. The class is intended to be a 28faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * utility for subclasses such as {@link Fade}, which use this visibility 29faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * information to determine the specific animations to run when visibility 3035a457a3bac0851a1fabd6cda58d1ea67f997b33Chet Haase * changes occur. Subclasses should implement one or both of the methods 31d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * {@link #onAppear(ViewGroup, TransitionValues, int, TransitionValues, int)}, 32d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * {@link #onDisappear(ViewGroup, TransitionValues, int, TransitionValues, int)}, 33faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase */ 34faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haasepublic abstract class Visibility extends Transition { 35faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase 36faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase private static final String PROPNAME_VISIBILITY = "android:visibility:visibility"; 37faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase private static final String PROPNAME_PARENT = "android:visibility:parent"; 38af78bdd615ecd5ce9d41a6160ce9f53fa269b119Chet Haase private static final String[] sTransitionProperties = { 39199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase PROPNAME_VISIBILITY, 40199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase PROPNAME_PARENT, 41199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase }; 42faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase 436ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase private static class VisibilityInfo { 446ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase boolean visibilityChange; 456ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase boolean fadeIn; 466ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase int startVisibility; 476ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase int endVisibility; 4835a457a3bac0851a1fabd6cda58d1ea67f997b33Chet Haase ViewGroup startParent; 4935a457a3bac0851a1fabd6cda58d1ea67f997b33Chet Haase ViewGroup endParent; 506ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase } 516ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase 52faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase @Override 53199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase public String[] getTransitionProperties() { 54199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase return sTransitionProperties; 55199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase } 56199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase 57d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase private void captureValues(TransitionValues transitionValues) { 58d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase int visibility = transitionValues.view.getVisibility(); 59d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase transitionValues.values.put(PROPNAME_VISIBILITY, visibility); 60d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase transitionValues.values.put(PROPNAME_PARENT, transitionValues.view.getParent()); 61d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase } 62d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase 63d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase @Override 64d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase public void captureStartValues(TransitionValues transitionValues) { 65d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase captureValues(transitionValues); 66d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase } 67d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase 68199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase @Override 69d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase public void captureEndValues(TransitionValues transitionValues) { 70d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase captureValues(transitionValues); 71faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 72faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase 73199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase /** 74199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase * Returns whether the view is 'visible' according to the given values 75199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase * object. This is determined by testing the same properties in the values 76199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase * object that are used to determine whether the object is appearing or 77199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase * disappearing in the {@link 78d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * Transition#createAnimator(ViewGroup, TransitionValues, TransitionValues)} 79199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase * method. This method can be called by, for example, subclasses that want 80199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase * to know whether the object is visible in the same way that Visibility 81199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase * determines it for the actual animation. 82199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase * 83199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase * @param values The TransitionValues object that holds the information by 84199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase * which visibility is determined. 85199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase * @return True if the view reference by <code>values</code> is visible, 86199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase * false otherwise. 87199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase */ 88199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase public boolean isVisible(TransitionValues values) { 89199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase if (values == null) { 90199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase return false; 91199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase } 92199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase int visibility = (Integer) values.values.get(PROPNAME_VISIBILITY); 93199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase View parent = (View) values.values.get(PROPNAME_PARENT); 94199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase 95199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase return visibility == View.VISIBLE && parent != null; 96199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase } 97199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase 986ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase private VisibilityInfo getVisibilityChangeInfo(TransitionValues startValues, 99faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase TransitionValues endValues) { 1007660d121b2ef21164ed33e6091e5dd50f5d0f939Chet Haase final VisibilityInfo visInfo = new VisibilityInfo(); 1016ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase visInfo.visibilityChange = false; 1026ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase visInfo.fadeIn = false; 103faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase if (startValues != null) { 1046ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase visInfo.startVisibility = (Integer) startValues.values.get(PROPNAME_VISIBILITY); 10535a457a3bac0851a1fabd6cda58d1ea67f997b33Chet Haase visInfo.startParent = (ViewGroup) startValues.values.get(PROPNAME_PARENT); 106faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } else { 1076ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase visInfo.startVisibility = -1; 1086ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase visInfo.startParent = null; 109faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 110faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase if (endValues != null) { 1116ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase visInfo.endVisibility = (Integer) endValues.values.get(PROPNAME_VISIBILITY); 11235a457a3bac0851a1fabd6cda58d1ea67f997b33Chet Haase visInfo.endParent = (ViewGroup) endValues.values.get(PROPNAME_PARENT); 113faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } else { 1146ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase visInfo.endVisibility = -1; 1156ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase visInfo.endParent = null; 116faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 117faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase if (startValues != null && endValues != null) { 1186ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase if (visInfo.startVisibility == visInfo.endVisibility && 1196ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase visInfo.startParent == visInfo.endParent) { 1206ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase return visInfo; 121faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } else { 1226ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase if (visInfo.startVisibility != visInfo.endVisibility) { 1236ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase if (visInfo.startVisibility == View.VISIBLE) { 1246ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase visInfo.fadeIn = false; 1256ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase visInfo.visibilityChange = true; 1266ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase } else if (visInfo.endVisibility == View.VISIBLE) { 1276ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase visInfo.fadeIn = true; 1286ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase visInfo.visibilityChange = true; 129faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 130faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase // no visibilityChange if going between INVISIBLE and GONE 1316ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase } else if (visInfo.startParent != visInfo.endParent) { 1326ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase if (visInfo.endParent == null) { 1336ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase visInfo.fadeIn = false; 1346ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase visInfo.visibilityChange = true; 1356ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase } else if (visInfo.startParent == null) { 1366ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase visInfo.fadeIn = true; 1376ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase visInfo.visibilityChange = true; 138faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 139faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 140faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 141faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 142faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase if (startValues == null) { 1436ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase visInfo.fadeIn = true; 1446ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase visInfo.visibilityChange = true; 145faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } else if (endValues == null) { 1466ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase visInfo.fadeIn = false; 1476ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase visInfo.visibilityChange = true; 148faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 1496ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase return visInfo; 150faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 151faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase 152faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase @Override 153d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase public Animator createAnimator(ViewGroup sceneRoot, TransitionValues startValues, 154faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase TransitionValues endValues) { 1556ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase VisibilityInfo visInfo = getVisibilityChangeInfo(startValues, endValues); 1566ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase if (visInfo.visibilityChange) { 15735a457a3bac0851a1fabd6cda58d1ea67f997b33Chet Haase // Only transition views that are either targets of this transition 15835a457a3bac0851a1fabd6cda58d1ea67f997b33Chet Haase // or whose parent hierarchies remain stable between scenes 15935a457a3bac0851a1fabd6cda58d1ea67f997b33Chet Haase boolean isTarget = false; 160d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase if (mTargets.size() > 0 || mTargetIds.size() > 0) { 16135a457a3bac0851a1fabd6cda58d1ea67f997b33Chet Haase View startView = startValues != null ? startValues.view : null; 16235a457a3bac0851a1fabd6cda58d1ea67f997b33Chet Haase View endView = endValues != null ? endValues.view : null; 16335a457a3bac0851a1fabd6cda58d1ea67f997b33Chet Haase int startId = startView != null ? startView.getId() : -1; 16435a457a3bac0851a1fabd6cda58d1ea67f997b33Chet Haase int endId = endView != null ? endView.getId() : -1; 16535a457a3bac0851a1fabd6cda58d1ea67f997b33Chet Haase isTarget = isValidTarget(startView, startId) || isValidTarget(endView, endId); 16635a457a3bac0851a1fabd6cda58d1ea67f997b33Chet Haase } 167b7a7fc9d233bad507ce893882352618b13647058Chet Haase if (isTarget || ((visInfo.startParent != null || visInfo.endParent != null))) { 16835a457a3bac0851a1fabd6cda58d1ea67f997b33Chet Haase if (visInfo.fadeIn) { 169d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase return onAppear(sceneRoot, startValues, visInfo.startVisibility, 17035a457a3bac0851a1fabd6cda58d1ea67f997b33Chet Haase endValues, visInfo.endVisibility); 17135a457a3bac0851a1fabd6cda58d1ea67f997b33Chet Haase } else { 172d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase return onDisappear(sceneRoot, startValues, visInfo.startVisibility, 17335a457a3bac0851a1fabd6cda58d1ea67f997b33Chet Haase endValues, visInfo.endVisibility 17435a457a3bac0851a1fabd6cda58d1ea67f997b33Chet Haase ); 175faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 176faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 177faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 178faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase return null; 179faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 180faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase 181faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase /** 182faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * The default implementation of this method does nothing. Subclasses 183d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * should override if they need to create an Animator when targets appear. 184d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * The method should only be called by the Visibility class; it is 185d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * not intended to be called from external classes. 186faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * 187d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * @param sceneRoot The root of the transition hierarchy 188d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * @param startValues The target values in the start scene 189d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * @param startVisibility The target visibility in the start scene 190d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * @param endValues The target values in the end scene 191d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * @param endVisibility The target visibility in the end scene 192d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * @return An Animator to be started at the appropriate time in the 193d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * overall transition for this scene change. A null value means no animation 194d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * should be run. 195faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase */ 196d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase public Animator onAppear(ViewGroup sceneRoot, 1976ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase TransitionValues startValues, int startVisibility, 1986ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase TransitionValues endValues, int endVisibility) { 1992ea7f8b9c5f903050d42c1af57406bf528979f45Chet Haase return null; 200faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 201faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase 202faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase /** 203faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * The default implementation of this method does nothing. Subclasses 204d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * should override if they need to create an Animator when targets disappear. 205d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * The method should only be called by the Visibility class; it is 206d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * not intended to be called from external classes. 207d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * 2086ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase * 209d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * @param sceneRoot The root of the transition hierarchy 210d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * @param startValues The target values in the start scene 211d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * @param startVisibility The target visibility in the start scene 212d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * @param endValues The target values in the end scene 213d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * @param endVisibility The target visibility in the end scene 214d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * @return An Animator to be started at the appropriate time in the 215d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * overall transition for this scene change. A null value means no animation 216d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * should be run. 217faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase */ 218d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase public Animator onDisappear(ViewGroup sceneRoot, 2196ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase TransitionValues startValues, int startVisibility, 2206ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase TransitionValues endValues, int endVisibility) { 2216ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase return null; 2226ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase } 223faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase} 224