Visibility.java revision 9562a3b639225d406d736b64a12e2d75459259e3
1733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki/* 2733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * Copyright (C) 2016 The Android Open Source Project 3733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * 4733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * Licensed under the Apache License, Version 2.0 (the "License"); 5733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * you may not use this file except in compliance with the License. 6733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * You may obtain a copy of the License at 7733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * 8733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * http://www.apache.org/licenses/LICENSE-2.0 9733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * 10733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * Unless required by applicable law or agreed to in writing, software 11733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * distributed under the License is distributed on an "AS IS" BASIS, 12733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * See the License for the specific language governing permissions and 14733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * limitations under the License. 15733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki */ 16733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki 17733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Arakipackage android.support.transition; 18733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki 19733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Arakiimport android.animation.Animator; 20733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Arakiimport android.os.Build; 21733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Arakiimport android.support.annotation.NonNull; 22733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Arakiimport android.view.View; 23733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Arakiimport android.view.ViewGroup; 24733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki 25733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki/** 26733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * This transition tracks changes to the visibility of target views in the 27733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * start and end scenes. Visibility is determined not just by the 28733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * {@link View#setVisibility(int)} state of views, but also whether 29733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * views exist in the current view hierarchy. The class is intended to be a 309562a3b639225d406d736b64a12e2d75459259e3Alan Viverette * utility for subclasses such as {@link Fade}, which use this visibility 31733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * information to determine the specific animations to run when visibility 32733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * changes occur. Subclasses should implement one or both of the methods 33733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * {@link #onAppear(ViewGroup, TransitionValues, int, TransitionValues, int)}, 34733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * {@link #onDisappear(ViewGroup, TransitionValues, int, TransitionValues, int)}, 35733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki */ 36733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Arakipublic abstract class Visibility extends Transition implements VisibilityInterface { 37733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki 38733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki public Visibility() { 39733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki this(false); 40733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki } 41733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki 42733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki Visibility(boolean deferred) { 43733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki super(true); 44733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki if (!deferred) { 45733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki if (Build.VERSION.SDK_INT >= 19) { 46733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki mImpl = new VisibilityKitKat(); 47733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki } else { 48733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki mImpl = new VisibilityIcs(); 49733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki } 50733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki mImpl.init(this); 51733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki } 52733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki } 53733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki 54733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki @Override 55733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki public void captureEndValues(@NonNull TransitionValues transitionValues) { 56733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki mImpl.captureEndValues(transitionValues); 57733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki } 58733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki 59733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki @Override 60733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki public void captureStartValues(@NonNull TransitionValues transitionValues) { 61733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki mImpl.captureStartValues(transitionValues); 62733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki } 63733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki 64733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki /** 65733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * Returns whether the view is 'visible' according to the given values 66733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * object. This is determined by testing the same properties in the values 67733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * object that are used to determine whether the object is appearing or 68733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * disappearing in the {@link 69733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * Transition#createAnimator(ViewGroup, TransitionValues, TransitionValues)} 70733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * method. This method can be called by, for example, subclasses that want 71733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * to know whether the object is visible in the same way that Visibility 72733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * determines it for the actual animation. 73733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * 74733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * @param values The TransitionValues object that holds the information by 75733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * which visibility is determined. 76733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * @return True if the view reference by <code>values</code> is visible, 77733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * false otherwise. 78733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki */ 79733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki @Override 80733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki public boolean isVisible(TransitionValues values) { 81733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki return ((VisibilityImpl) mImpl).isVisible(values); 82733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki } 83733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki 84733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki /** 85733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * The default implementation of this method does nothing. Subclasses 86733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * should override if they need to create an Animator when targets appear. 87733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * The method should only be called by the Visibility class; it is 88733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * not intended to be called from external classes. 89733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * 90733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * @param sceneRoot The root of the transition hierarchy 91733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * @param startValues The target values in the start scene 92733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * @param startVisibility The target visibility in the start scene 93733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * @param endValues The target values in the end scene 94733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * @param endVisibility The target visibility in the end scene 95733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * @return An Animator to be started at the appropriate time in the 96733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * overall transition for this scene change. A null value means no animation 97733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * should be run. 98733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki */ 99733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki @Override 100733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki public Animator onAppear(ViewGroup sceneRoot, TransitionValues startValues, int startVisibility, 101733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki TransitionValues endValues, int endVisibility) { 102733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki return ((VisibilityImpl) mImpl).onAppear(sceneRoot, startValues, startVisibility, 103733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki endValues, endVisibility); 104733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki } 105733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki 106733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki /** 107733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * The default implementation of this method does nothing. Subclasses 108733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * should override if they need to create an Animator when targets disappear. 109733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * The method should only be called by the Visibility class; it is 110733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * not intended to be called from external classes. 111733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * 112733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * @param sceneRoot The root of the transition hierarchy 113733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * @param startValues The target values in the start scene 114733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * @param startVisibility The target visibility in the start scene 115733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * @param endValues The target values in the end scene 116733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * @param endVisibility The target visibility in the end scene 117733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * @return An Animator to be started at the appropriate time in the 118733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * overall transition for this scene change. A null value means no animation 119733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * should be run. 120733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki */ 121733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki @Override 122733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki public Animator onDisappear(ViewGroup sceneRoot, TransitionValues startValues, 123733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki int startVisibility, TransitionValues endValues, int endVisibility) { 124733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki return ((VisibilityImpl) mImpl).onDisappear(sceneRoot, startValues, startVisibility, 125733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki endValues, endVisibility); 126733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki } 127733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki 128733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki // TODO: Implement API 21; onAppear (4 params), onDisappear (4 params), getMode, setMode 129733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki // TODO: Implement API 23; isTransitionRequired 130733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki 131733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki} 132