blob: da9ac080f6c810bf815add1558e340b0cd6e03d2 [file] [log] [blame]
/*
* Copyright (C) 2016 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.support.transition;
import android.os.Build;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.ViewGroup;
/**
* This class manages the set of transitions that fire when there is a
* change of {@link Scene}. To use the manager, add scenes along with
* transition objects with calls to {@link #setTransition(Scene, Transition)}
* or {@link #setTransition(Scene, Scene, Transition)}. Setting specific
* transitions for scene changes is not required; by default, a Scene change
* will use {@link AutoTransition} to do something reasonable for most
* situations. Specifying other transitions for particular scene changes is
* only necessary if the application wants different transition behavior
* in these situations.
*
* <p>Unlike the platform version, this does not support declaration by XML resources.</p>
*/
public class TransitionManager {
private static TransitionManagerStaticsImpl sImpl;
static {
if (Build.VERSION.SDK_INT < 19) {
sImpl = new TransitionManagerStaticsIcs();
} else {
sImpl = new TransitionManagerStaticsKitKat();
}
}
private TransitionManagerImpl mImpl;
public TransitionManager() {
if (Build.VERSION.SDK_INT < 19) {
mImpl = new TransitionManagerIcs();
} else {
mImpl = new TransitionManagerKitKat();
}
}
/**
* Convenience method to simply change to the given scene using
* the default transition for TransitionManager.
*
* @param scene The Scene to change to
*/
public static void go(@NonNull Scene scene) {
sImpl.go(scene.mImpl);
}
/**
* Convenience method to simply change to the given scene using
* the given transition.
*
* <p>Passing in <code>null</code> for the transition parameter will
* result in the scene changing without any transition running, and is
* equivalent to calling {@link Scene#exit()} on the scene root's
* current scene, followed by {@link Scene#enter()} on the scene
* specified by the <code>scene</code> parameter.</p>
*
* @param scene The Scene to change to
* @param transition The transition to use for this scene change. A
* value of null causes the scene change to happen with no transition.
*/
public static void go(@NonNull Scene scene, @Nullable Transition transition) {
sImpl.go(scene.mImpl, transition == null ? null : transition.mImpl);
}
/**
* Convenience method to animate, using the default transition,
* to a new scene defined by all changes within the given scene root between
* calling this method and the next rendering frame.
* Equivalent to calling {@link #beginDelayedTransition(ViewGroup, Transition)}
* with a value of <code>null</code> for the <code>transition</code> parameter.
*
* @param sceneRoot The root of the View hierarchy to run the transition on.
*/
public static void beginDelayedTransition(@NonNull final ViewGroup sceneRoot) {
sImpl.beginDelayedTransition(sceneRoot);
}
/**
* Convenience method to animate to a new scene defined by all changes within
* the given scene root between calling this method and the next rendering frame.
* Calling this method causes TransitionManager to capture current values in the
* scene root and then post a request to run a transition on the next frame.
* At that time, the new values in the scene root will be captured and changes
* will be animated. There is no need to create a Scene; it is implied by
* changes which take place between calling this method and the next frame when
* the transition begins.
*
* <p>Calling this method several times before the next frame (for example, if
* unrelated code also wants to make dynamic changes and run a transition on
* the same scene root), only the first call will trigger capturing values
* and exiting the current scene. Subsequent calls to the method with the
* same scene root during the same frame will be ignored.</p>
*
* <p>Passing in <code>null</code> for the transition parameter will
* cause the TransitionManager to use its default transition.</p>
*
* @param sceneRoot The root of the View hierarchy to run the transition on.
* @param transition The transition to use for this change. A
* value of null causes the TransitionManager to use the default transition.
*/
public static void beginDelayedTransition(@NonNull final ViewGroup sceneRoot,
@Nullable Transition transition) {
sImpl.beginDelayedTransition(sceneRoot, transition == null ? null : transition.mImpl);
}
/**
* Sets a specific transition to occur when the given scene is entered.
*
* @param scene The scene which, when applied, will cause the given
* transition to run.
* @param transition The transition that will play when the given scene is
* entered. A value of null will result in the default behavior of
* using the default transition instead.
*/
public void setTransition(@NonNull Scene scene, @Nullable Transition transition) {
mImpl.setTransition(scene.mImpl, transition == null ? null : transition.mImpl);
}
/**
* Sets a specific transition to occur when the given pair of scenes is
* exited/entered.
*
* @param fromScene The scene being exited when the given transition will
* be run
* @param toScene The scene being entered when the given transition will
* be run
* @param transition The transition that will play when the given scene is
* entered. A value of null will result in the default behavior of
* using the default transition instead.
*/
public void setTransition(@NonNull Scene fromScene, @NonNull Scene toScene,
@Nullable Transition transition) {
mImpl.setTransition(fromScene.mImpl, toScene.mImpl,
transition == null ? null : transition.mImpl);
}
/**
* Change to the given scene, using the
* appropriate transition for this particular scene change
* (as specified to the TransitionManager, or the default
* if no such transition exists).
*
* @param scene The Scene to change to
*/
public void transitionTo(@NonNull Scene scene) {
mImpl.transitionTo(scene.mImpl);
}
}