TransitionSet.java revision ff58f92a0a77ad849ba714b5adac96790eca0048
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 19d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haaseimport android.animation.TimeInterpolator; 20faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport android.util.AndroidRuntimeException; 21d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haaseimport android.view.View; 22faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport android.view.ViewGroup; 23faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase 24faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport java.util.ArrayList; 25faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase 26faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase/** 27d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * A TransitionSet is a parent of child transitions (including other 28d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * TransitionSets). Using TransitionSets enables more complex 29d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * choreography of transitions, where some sets play {@link #ORDERING_TOGETHER} and 30d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * others play {@link #ORDERING_SEQUENTIAL}. For example, {@link AutoTransition} 31d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * uses a TransitionSet to sequentially play a Fade(Fade.OUT), followed by 32d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * a {@link ChangeBounds}, followed by a Fade(Fade.OUT) transition. 33faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase */ 34d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haasepublic class TransitionSet extends Transition { 35faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase 36faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase ArrayList<Transition> mTransitions = new ArrayList<Transition>(); 37faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase private boolean mPlayTogether = true; 38faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase int mCurrentListeners; 39faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase boolean mStarted = false; 40faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase 41faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase /** 42d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * A flag used to indicate that the child transitions of this set 43faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * should all start at the same time. 44faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase */ 45d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase public static final int ORDERING_TOGETHER = 0; 46faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase /** 47d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * A flag used to indicate that the child transitions of this set should 48faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * play in sequence; when one child transition ends, the next child 49faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * transition begins. Note that a transition does not end until all 50faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * instances of it (which are playing on all applicable targets of the 51faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * transition) end. 52faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase */ 53d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase public static final int ORDERING_SEQUENTIAL = 1; 54faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase 55faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase /** 56d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * Constructs an empty transition set. Add child transitions to the 57d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * set by calling {@link #addTransition(Transition)} )}. By default, 58d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * child transitions will play {@link #ORDERING_TOGETHER together}. 59faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase */ 60d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase public TransitionSet() { 61faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 62faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase 63faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase /** 64d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * Sets the play order of this set's child transitions. 65faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * 66d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * @param ordering {@link #ORDERING_TOGETHER} to play this set's child 67d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * transitions together, {@link #ORDERING_SEQUENTIAL} to play the child 68faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * transitions in sequence. 69d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * @return This transitionSet object. 70faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase */ 71d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase public TransitionSet setOrdering(int ordering) { 72faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase switch (ordering) { 73d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase case ORDERING_SEQUENTIAL: 74faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase mPlayTogether = false; 75faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase break; 76d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase case ORDERING_TOGETHER: 77faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase mPlayTogether = true; 78faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase break; 79faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase default: 80d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase throw new AndroidRuntimeException("Invalid parameter for TransitionSet " + 81faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase "ordering: " + ordering); 82faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 83d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase return this; 84faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 85faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase 86faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase /** 87d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * Returns the ordering of this TransitionSet. By default, the value is 88d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * {@link #ORDERING_TOGETHER}. 89d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * 90d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * @return {@link #ORDERING_TOGETHER} if child transitions will play at the same 91d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * time, {@link #ORDERING_SEQUENTIAL} if they will play in sequence. 92faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * 93d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * @see #setOrdering(int) 94faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase */ 95d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase public int getOrdering() { 96d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase return mPlayTogether ? ORDERING_TOGETHER : ORDERING_SEQUENTIAL; 97d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase } 98d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase 99d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase /** 100d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * Adds child transition to this set. The order in which this child transition 101d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * is added relative to other child transitions that are added, in addition to 102d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * the {@link #getOrdering() ordering} property, determines the 103d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * order in which the transitions are started. 104d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * 105d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * <p>If this transitionSet has a {@link #getDuration() duration} set on it, the 106d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * child transition will inherit that duration. Transitions are assumed to have 107d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * a maximum of one transitionSet parent.</p> 108d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * 109d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * @param transition A non-null child transition to be added to this set. 110d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * @return This transitionSet object. 111d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase */ 112d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase public TransitionSet addTransition(Transition transition) { 113d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase if (transition != null) { 114d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase mTransitions.add(transition); 115d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase transition.mParent = this; 116d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase if (mDuration >= 0) { 117d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase transition.setDuration(mDuration); 118faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 119faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 120d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase return this; 121faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 122faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase 123faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase /** 124d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * Setting a non-negative duration on a TransitionSet causes all of the child 125867a86613d4152a93423300f83597300e6ebeebeChet Haase * transitions (current and future) to inherit this duration. 126867a86613d4152a93423300f83597300e6ebeebeChet Haase * 127867a86613d4152a93423300f83597300e6ebeebeChet Haase * @param duration The length of the animation, in milliseconds. 128d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * @return This transitionSet object. 129867a86613d4152a93423300f83597300e6ebeebeChet Haase */ 130867a86613d4152a93423300f83597300e6ebeebeChet Haase @Override 131d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase public TransitionSet setDuration(long duration) { 132867a86613d4152a93423300f83597300e6ebeebeChet Haase super.setDuration(duration); 133867a86613d4152a93423300f83597300e6ebeebeChet Haase if (mDuration >= 0) { 134867a86613d4152a93423300f83597300e6ebeebeChet Haase int numTransitions = mTransitions.size(); 135867a86613d4152a93423300f83597300e6ebeebeChet Haase for (int i = 0; i < numTransitions; ++i) { 136867a86613d4152a93423300f83597300e6ebeebeChet Haase mTransitions.get(i).setDuration(duration); 137867a86613d4152a93423300f83597300e6ebeebeChet Haase } 138867a86613d4152a93423300f83597300e6ebeebeChet Haase } 139867a86613d4152a93423300f83597300e6ebeebeChet Haase return this; 140867a86613d4152a93423300f83597300e6ebeebeChet Haase } 141867a86613d4152a93423300f83597300e6ebeebeChet Haase 142d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase @Override 143d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase public TransitionSet setStartDelay(long startDelay) { 144d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase return (TransitionSet) super.setStartDelay(startDelay); 145d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase } 146d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase 147d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase @Override 148d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase public TransitionSet setInterpolator(TimeInterpolator interpolator) { 149d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase return (TransitionSet) super.setInterpolator(interpolator); 150d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase } 151d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase 152d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase @Override 153d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase public TransitionSet addTarget(View target) { 154d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase return (TransitionSet) super.addTarget(target); 155d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase } 156d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase 157d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase @Override 158ff58f92a0a77ad849ba714b5adac96790eca0048Chet Haase public TransitionSet addTarget(int targetId) { 159ff58f92a0a77ad849ba714b5adac96790eca0048Chet Haase return (TransitionSet) super.addTarget(targetId); 160d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase } 161d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase 162d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase @Override 163d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase public TransitionSet addListener(TransitionListener listener) { 164d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase return (TransitionSet) super.addListener(listener); 165d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase } 166d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase 167d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase @Override 168ff58f92a0a77ad849ba714b5adac96790eca0048Chet Haase public TransitionSet removeTarget(int targetId) { 169ff58f92a0a77ad849ba714b5adac96790eca0048Chet Haase return (TransitionSet) super.removeTarget(targetId); 170d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase } 171d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase 172d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase @Override 173d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase public TransitionSet removeTarget(View target) { 174d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase return (TransitionSet) super.removeTarget(target); 175d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase } 176d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase 177d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase @Override 178d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase public TransitionSet removeListener(TransitionListener listener) { 179d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase return (TransitionSet) super.removeListener(listener); 180d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase } 181d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase 182867a86613d4152a93423300f83597300e6ebeebeChet Haase /** 183d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * Removes the specified child transition from this set. 184faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * 185faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * @param transition The transition to be removed. 186d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * @return This transitionSet object. 187faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase */ 188d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase public TransitionSet removeTransition(Transition transition) { 189faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase mTransitions.remove(transition); 1906ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase transition.mParent = null; 191d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase return this; 192faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 193faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase 194faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase /** 195faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * Sets up listeners for each of the child transitions. This is used to 196d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * determine when this transition set is finished (all child transitions 197faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * must finish first). 198faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase */ 199faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase private void setupStartEndListeners() { 200d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase TransitionSetListener listener = new TransitionSetListener(this); 201faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase for (Transition childTransition : mTransitions) { 2026ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase childTransition.addListener(listener); 203faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 204faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase mCurrentListeners = mTransitions.size(); 205faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 206faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase 207faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase /** 208faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * This listener is used to detect when all child transitions are done, at 209d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * which point this transition set is also done. 210faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase */ 211d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase static class TransitionSetListener extends TransitionListenerAdapter { 212d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase TransitionSet mTransitionSet; 213d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase TransitionSetListener(TransitionSet transitionSet) { 214d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase mTransitionSet = transitionSet; 2156ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase } 216faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase @Override 217faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase public void onTransitionStart(Transition transition) { 218d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase if (!mTransitionSet.mStarted) { 219d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase mTransitionSet.start(); 220d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase mTransitionSet.mStarted = true; 221faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 222faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 223faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase 224faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase @Override 225faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase public void onTransitionEnd(Transition transition) { 226d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase --mTransitionSet.mCurrentListeners; 227d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase if (mTransitionSet.mCurrentListeners == 0) { 228faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase // All child trans 229d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase mTransitionSet.mStarted = false; 230d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase mTransitionSet.end(); 231faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 232faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase transition.removeListener(this); 233faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 2346ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase } 235faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase 236faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase /** 237faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * @hide 238faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase */ 239faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase @Override 240d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase protected void createAnimators(ViewGroup sceneRoot, TransitionValuesMaps startValues, 2416ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase TransitionValuesMaps endValues) { 242faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase for (Transition childTransition : mTransitions) { 243d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase childTransition.createAnimators(sceneRoot, startValues, endValues); 244faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 245faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 246faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase 247faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase /** 248faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * @hide 249faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase */ 250faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase @Override 251d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase protected void runAnimators() { 252faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase setupStartEndListeners(); 253faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase if (!mPlayTogether) { 254faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase // Setup sequence with listeners 255faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase // TODO: Need to add listeners in such a way that we can remove them later if canceled 256faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase for (int i = 1; i < mTransitions.size(); ++i) { 257faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase Transition previousTransition = mTransitions.get(i - 1); 258faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase final Transition nextTransition = mTransitions.get(i); 259faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase previousTransition.addListener(new TransitionListenerAdapter() { 260faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase @Override 261faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase public void onTransitionEnd(Transition transition) { 262d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase nextTransition.runAnimators(); 263faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase transition.removeListener(this); 264faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 265faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase }); 266faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 267faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase Transition firstTransition = mTransitions.get(0); 268faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase if (firstTransition != null) { 269d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase firstTransition.runAnimators(); 270faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 271faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } else { 272faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase for (Transition childTransition : mTransitions) { 273d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase childTransition.runAnimators(); 274faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 275faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 276faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 277faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase 278faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase @Override 279d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase public void captureStartValues(TransitionValues transitionValues) { 280faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase int targetId = transitionValues.view.getId(); 281ff58f92a0a77ad849ba714b5adac96790eca0048Chet Haase if (isValidTarget(transitionValues.view, targetId)) { 282ff58f92a0a77ad849ba714b5adac96790eca0048Chet Haase for (Transition childTransition : mTransitions) { 283ff58f92a0a77ad849ba714b5adac96790eca0048Chet Haase if (childTransition.isValidTarget(transitionValues.view, targetId)) { 284ff58f92a0a77ad849ba714b5adac96790eca0048Chet Haase childTransition.captureStartValues(transitionValues); 285ff58f92a0a77ad849ba714b5adac96790eca0048Chet Haase } 286d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase } 287d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase } 288d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase } 289d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase 290d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase @Override 291d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase public void captureEndValues(TransitionValues transitionValues) { 292d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase int targetId = transitionValues.view.getId(); 293ff58f92a0a77ad849ba714b5adac96790eca0048Chet Haase if (isValidTarget(transitionValues.view, targetId)) { 294ff58f92a0a77ad849ba714b5adac96790eca0048Chet Haase for (Transition childTransition : mTransitions) { 295ff58f92a0a77ad849ba714b5adac96790eca0048Chet Haase if (childTransition.isValidTarget(transitionValues.view, targetId)) { 296ff58f92a0a77ad849ba714b5adac96790eca0048Chet Haase childTransition.captureEndValues(transitionValues); 297ff58f92a0a77ad849ba714b5adac96790eca0048Chet Haase } 298faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 299faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 300faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 301faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase 302199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase /** @hide */ 303faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase @Override 304199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase public void pause() { 305199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase super.pause(); 306e9d32ea13ee14fc0eb4e45ca627ca77729d38bfeChet Haase int numTransitions = mTransitions.size(); 307e9d32ea13ee14fc0eb4e45ca627ca77729d38bfeChet Haase for (int i = 0; i < numTransitions; ++i) { 308199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase mTransitions.get(i).pause(); 309199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase } 310199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase } 311199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase 312199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase /** @hide */ 313199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase @Override 314199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase public void resume() { 315199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase super.resume(); 316199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase int numTransitions = mTransitions.size(); 317199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase for (int i = 0; i < numTransitions; ++i) { 318199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase mTransitions.get(i).resume(); 319199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase } 320199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase } 321199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase 322d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase /** @hide */ 323199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase @Override 324199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase protected void cancel() { 325199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase super.cancel(); 326199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase int numTransitions = mTransitions.size(); 327199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase for (int i = 0; i < numTransitions; ++i) { 328199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase mTransitions.get(i).cancel(); 329e9d32ea13ee14fc0eb4e45ca627ca77729d38bfeChet Haase } 330e9d32ea13ee14fc0eb4e45ca627ca77729d38bfeChet Haase } 331e9d32ea13ee14fc0eb4e45ca627ca77729d38bfeChet Haase 332e9d32ea13ee14fc0eb4e45ca627ca77729d38bfeChet Haase @Override 333d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase TransitionSet setSceneRoot(ViewGroup sceneRoot) { 3346ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase super.setSceneRoot(sceneRoot); 3356ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase int numTransitions = mTransitions.size(); 3366ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase for (int i = 0; i < numTransitions; ++i) { 3376ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase mTransitions.get(i).setSceneRoot(sceneRoot); 3386ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase } 339d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase return (TransitionSet) this; 3406ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase } 3416ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase 3426ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase @Override 343faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase String toString(String indent) { 344faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase String result = super.toString(indent); 345faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase for (int i = 0; i < mTransitions.size(); ++i) { 346faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase result += "\n" + mTransitions.get(i).toString(indent + " "); 347faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 348faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase return result; 349faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 350faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase 3516ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase @Override 352d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase public TransitionSet clone() { 353d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase TransitionSet clone = (TransitionSet) super.clone(); 3546ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase clone.mTransitions = new ArrayList<Transition>(); 3556ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase int numTransitions = mTransitions.size(); 3566ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase for (int i = 0; i < numTransitions; ++i) { 3576ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase clone.mTransitions.add((Transition) mTransitions.get(i).clone()); 3586ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase } 3596ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase return clone; 3606ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase } 3616ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase 362faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase} 363