Gradle dependencies
compile group: 'androidx.transition', name: 'transition', version: '1.4.1'
- groupId: androidx.transition
- artifactId: transition
- version: 1.4.1
Artifact androidx.transition:transition:1.4.1 it located at Google repository (https://maven.google.com/)
Androidx artifact mapping:
androidx.transition:transition com.android.support:transition
Androidx class mapping:
androidx.transition.FragmentTransitionSupport android.support.transition.FragmentTransitionSupport
Summary
Methods |
---|
public abstract void | addTarget(java.lang.Object transitionObj, View view)
Adds a View target to a transition. |
public abstract void | addTargets(java.lang.Object transitionObj, java.util.ArrayList<View> views)
This method adds views as targets to the transition, but only if the transition
doesn't already have a target. |
public abstract void | beginDelayedTransition(ViewGroup sceneRoot, java.lang.Object transition)
Calls TransitionManager#beginDelayedTransition(ViewGroup, Transition). |
public abstract boolean | canHandle(java.lang.Object transition)
Returns true if this implementation can handle the specified . |
public abstract java.lang.Object | cloneTransition(java.lang.Object transition)
Returns a clone of a transition or null if it is null |
public abstract java.lang.Object | mergeTransitionsInSequence(java.lang.Object exitTransitionObj, java.lang.Object enterTransitionObj, java.lang.Object sharedElementTransitionObj)
Combines enter, exit, and shared element transition so that they play in the proper
sequence. |
public abstract java.lang.Object | mergeTransitionsTogether(java.lang.Object transition1, java.lang.Object transition2, java.lang.Object transition3)
Creates a TransitionSet that plays all passed transitions together. |
public abstract void | removeTarget(java.lang.Object transitionObj, View view)
Remove a View target to a transition. |
public abstract void | replaceTargets(java.lang.Object transitionObj, java.util.ArrayList<View> oldTargets, java.util.ArrayList<View> newTargets)
This method removes the views from transitions that target ONLY those views and
replaces them with the new targets list. |
public abstract void | scheduleHideFragmentView(java.lang.Object exitTransitionObj, View fragmentView, java.util.ArrayList<View> exitingViews)
After the transition completes, the fragment's view is set to GONE and the exiting
views are set to VISIBLE. |
public abstract void | scheduleRemoveTargets(java.lang.Object overallTransitionObj, java.lang.Object enterTransition, java.util.ArrayList<View> enteringViews, java.lang.Object exitTransition, java.util.ArrayList<View> exitingViews, java.lang.Object sharedElementTransition, java.util.ArrayList<View> sharedElementsIn)
After the transition has started, remove all targets that we added to the transitions
so that the transitions are left in a clean state. |
public abstract void | setEpicenter(java.lang.Object transitionObj, Rect epicenter)
Sets the epicenter of a transition to a rect object. |
public abstract void | setEpicenter(java.lang.Object transitionObj, Rect epicenter)
Sets the epicenter of a transition to a rect object. |
public void | setListenerForTransitionEnd(Fragment outFragment, java.lang.Object transition, CancellationSignal signal, java.lang.Runnable transitionCompleteRunnable)
If either exitingViews or SharedElementsOut contain a view, an
Transition.TransitionListener.onTransitionEnd(Transition) listener is added that calls
run once the Transition ends. |
public abstract void | setSharedElementTargets(java.lang.Object transitionObj, View nonExistentView, java.util.ArrayList<View> sharedViews)
Finds all children of the shared elements and sets the wrapping TransitionSet
targets to point to those. |
public abstract void | swapSharedElementTargets(java.lang.Object sharedElementTransitionObj, java.util.ArrayList<View> sharedElementsOut, java.util.ArrayList<View> sharedElementsIn)
Swap the targets for the shared element transition from those Views in sharedElementsOut
to those in sharedElementsIn |
public abstract java.lang.Object | wrapTransitionInSet(java.lang.Object transition)
Wraps a transition in a TransitionSet and returns the set. |
from FragmentTransitionImpl | bfsAddViewChildren, getBoundsOnScreen, isNullOrEmpty, setEpicenter |
from java.lang.Object | clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
Constructors
public
FragmentTransitionSupport()
Methods
public abstract boolean
canHandle(java.lang.Object transition)
Returns true if this implementation can handle the specified .
public abstract java.lang.Object
cloneTransition(java.lang.Object transition)
Returns a clone of a transition or null if it is null
public abstract java.lang.Object
wrapTransitionInSet(java.lang.Object transition)
Wraps a transition in a TransitionSet and returns the set. If transition is null, null is
returned.
public abstract void
setSharedElementTargets(java.lang.Object transitionObj, View nonExistentView, java.util.ArrayList<View> sharedViews)
Finds all children of the shared elements and sets the wrapping TransitionSet
targets to point to those. It also limits transitions that have no targets to the
specific shared elements. This allows developers to target child views of the
shared elements specifically, but this doesn't happen by default.
public abstract void
setEpicenter(java.lang.Object transitionObj, Rect epicenter)
Sets the epicenter of a transition to a rect object. The object can be modified until
the transition runs.
public abstract void
addTargets(java.lang.Object transitionObj, java.util.ArrayList<View> views)
This method adds views as targets to the transition, but only if the transition
doesn't already have a target. It is best for views to contain one View object
that does not exist in the view hierarchy (state.nonExistentView) so that
when they are removed later, a list match will suffice to remove the targets.
Otherwise, if you happened to have targeted the exact views for the transition,
the replaceTargets call will remove them unexpectedly.
public abstract java.lang.Object
mergeTransitionsTogether(java.lang.Object transition1, java.lang.Object transition2, java.lang.Object transition3)
Creates a TransitionSet that plays all passed transitions together. Any null
transitions passed will not be added to the set. If all are null, then an empty
TransitionSet will be returned.
public abstract void
scheduleHideFragmentView(java.lang.Object exitTransitionObj, View fragmentView, java.util.ArrayList<View> exitingViews)
After the transition completes, the fragment's view is set to GONE and the exiting
views are set to VISIBLE.
public abstract java.lang.Object
mergeTransitionsInSequence(java.lang.Object exitTransitionObj, java.lang.Object enterTransitionObj, java.lang.Object sharedElementTransitionObj)
Combines enter, exit, and shared element transition so that they play in the proper
sequence. First the exit transition plays along with the shared element transition.
When the exit transition completes, the enter transition starts. The shared element
transition can continue running while the enter transition plays.
Returns:
A TransitionSet with all of enter, exit, and shared element transitions in
it (modulo null values), ordered such that they play in the proper sequence.
public abstract void
beginDelayedTransition(ViewGroup sceneRoot, java.lang.Object transition)
Calls TransitionManager#beginDelayedTransition(ViewGroup, Transition).
public abstract void
scheduleRemoveTargets(java.lang.Object overallTransitionObj, java.lang.Object enterTransition, java.util.ArrayList<View> enteringViews, java.lang.Object exitTransition, java.util.ArrayList<View> exitingViews, java.lang.Object sharedElementTransition, java.util.ArrayList<View> sharedElementsIn)
After the transition has started, remove all targets that we added to the transitions
so that the transitions are left in a clean state.
public void
setListenerForTransitionEnd(
Fragment outFragment, java.lang.Object transition,
CancellationSignal signal, java.lang.Runnable transitionCompleteRunnable)
If either exitingViews or SharedElementsOut contain a view, an
Transition.TransitionListener.onTransitionEnd(Transition) listener is added that calls
run
once the Transition ends.
If CancellationSignal.cancel() is called on the given signal, the transition calls
Transition.cancel().
public abstract void
swapSharedElementTargets(java.lang.Object sharedElementTransitionObj, java.util.ArrayList<View> sharedElementsOut, java.util.ArrayList<View> sharedElementsIn)
Swap the targets for the shared element transition from those Views in sharedElementsOut
to those in sharedElementsIn
public abstract void
replaceTargets(java.lang.Object transitionObj, java.util.ArrayList<View> oldTargets, java.util.ArrayList<View> newTargets)
This method removes the views from transitions that target ONLY those views and
replaces them with the new targets list.
The views list should match those added in addTargets and should contain
one view that is not in the view hierarchy (state.nonExistentView).
public abstract void
addTarget(java.lang.Object transitionObj, View view)
Adds a View target to a transition. If transitionObj is null, nothing is done.
public abstract void
removeTarget(java.lang.Object transitionObj, View view)
Remove a View target to a transition. If transitionObj is null, nothing is done.
public abstract void
setEpicenter(java.lang.Object transitionObj, Rect epicenter)
Sets the epicenter of a transition to a rect object. The object can be modified until
the transition runs.
Source
/*
* Copyright (C) 2017 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 androidx.transition;
import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.annotation.SuppressLint;
import android.graphics.Rect;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.RestrictTo;
import androidx.core.os.CancellationSignal;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentTransitionImpl;
import java.util.ArrayList;
import java.util.List;
/**
* @hide
*/
// This is instantiated in androidx.fragment.app.FragmentTransition
@SuppressWarnings("unused")
@RestrictTo(LIBRARY_GROUP_PREFIX)
@SuppressLint("RestrictedApi") // remove once fragment lib would be released with the new
// LIBRARY_GROUP_PREFIX restriction. tracking in b/127286008
public class FragmentTransitionSupport extends FragmentTransitionImpl {
@Override
public boolean canHandle(Object transition) {
return transition instanceof Transition;
}
@Override
public Object cloneTransition(Object transition) {
Transition copy = null;
if (transition != null) {
copy = ((Transition) transition).clone();
}
return copy;
}
@Override
public Object wrapTransitionInSet(Object transition) {
if (transition == null) {
return null;
}
TransitionSet transitionSet = new TransitionSet();
transitionSet.addTransition((Transition) transition);
return transitionSet;
}
@Override
public void setSharedElementTargets(Object transitionObj,
View nonExistentView, ArrayList<View> sharedViews) {
TransitionSet transition = (TransitionSet) transitionObj;
final List<View> views = transition.getTargets();
views.clear();
final int count = sharedViews.size();
for (int i = 0; i < count; i++) {
final View view = sharedViews.get(i);
bfsAddViewChildren(views, view);
}
views.add(nonExistentView);
sharedViews.add(nonExistentView);
addTargets(transition, sharedViews);
}
@Override
public void setEpicenter(Object transitionObj, View view) {
if (view != null) {
Transition transition = (Transition) transitionObj;
final Rect epicenter = new Rect();
getBoundsOnScreen(view, epicenter);
transition.setEpicenterCallback(new Transition.EpicenterCallback() {
@Override
public Rect onGetEpicenter(@NonNull Transition transition) {
return epicenter;
}
});
}
}
@Override
public void addTargets(Object transitionObj, ArrayList<View> views) {
Transition transition = (Transition) transitionObj;
if (transition == null) {
return;
}
if (transition instanceof TransitionSet) {
TransitionSet set = (TransitionSet) transition;
int numTransitions = set.getTransitionCount();
for (int i = 0; i < numTransitions; i++) {
Transition child = set.getTransitionAt(i);
addTargets(child, views);
}
} else if (!hasSimpleTarget(transition)) {
List<View> targets = transition.getTargets();
if (isNullOrEmpty(targets)) {
// We can just add the target views
int numViews = views.size();
for (int i = 0; i < numViews; i++) {
transition.addTarget(views.get(i));
}
}
}
}
private static boolean hasSimpleTarget(Transition transition) {
return !isNullOrEmpty(transition.getTargetIds())
|| !isNullOrEmpty(transition.getTargetNames())
|| !isNullOrEmpty(transition.getTargetTypes());
}
@Override
public Object mergeTransitionsTogether(Object transition1, Object transition2,
Object transition3) {
TransitionSet transitionSet = new TransitionSet();
if (transition1 != null) {
transitionSet.addTransition((Transition) transition1);
}
if (transition2 != null) {
transitionSet.addTransition((Transition) transition2);
}
if (transition3 != null) {
transitionSet.addTransition((Transition) transition3);
}
return transitionSet;
}
@Override
public void scheduleHideFragmentView(Object exitTransitionObj, final View fragmentView,
final ArrayList<View> exitingViews) {
Transition exitTransition = (Transition) exitTransitionObj;
exitTransition.addListener(new Transition.TransitionListener() {
@Override
public void onTransitionStart(@NonNull Transition transition) {
// If any of the exiting views are not shared elements, the TransitionManager
// adds additional listeners to the this transition. If those listeners are
// DisappearListeners for a view that is going away, they can change the state of
// views after our onTransitionEnd callback.
// We need to make sure this listener gets the onTransitionEnd callback last to
// ensure that exiting views are made visible once the Transition is complete.
transition.removeListener(this);
transition.addListener(this);
}
@Override
public void onTransitionEnd(@NonNull Transition transition) {
transition.removeListener(this);
fragmentView.setVisibility(View.GONE);
final int numViews = exitingViews.size();
for (int i = 0; i < numViews; i++) {
exitingViews.get(i).setVisibility(View.VISIBLE);
}
}
@Override
public void onTransitionCancel(@NonNull Transition transition) {
}
@Override
public void onTransitionPause(@NonNull Transition transition) {
}
@Override
public void onTransitionResume(@NonNull Transition transition) {
}
});
}
@Override
public Object mergeTransitionsInSequence(Object exitTransitionObj,
Object enterTransitionObj, Object sharedElementTransitionObj) {
// First do exit, then enter, but allow shared element transition to happen
// during both.
Transition staggered = null;
final Transition exitTransition = (Transition) exitTransitionObj;
final Transition enterTransition = (Transition) enterTransitionObj;
final Transition sharedElementTransition = (Transition) sharedElementTransitionObj;
if (exitTransition != null && enterTransition != null) {
staggered = new TransitionSet()
.addTransition(exitTransition)
.addTransition(enterTransition)
.setOrdering(TransitionSet.ORDERING_SEQUENTIAL);
} else if (exitTransition != null) {
staggered = exitTransition;
} else if (enterTransition != null) {
staggered = enterTransition;
}
if (sharedElementTransition != null) {
TransitionSet together = new TransitionSet();
if (staggered != null) {
together.addTransition(staggered);
}
together.addTransition(sharedElementTransition);
return together;
} else {
return staggered;
}
}
@Override
public void beginDelayedTransition(ViewGroup sceneRoot, Object transition) {
TransitionManager.beginDelayedTransition(sceneRoot, (Transition) transition);
}
@Override
public void scheduleRemoveTargets(final Object overallTransitionObj,
final Object enterTransition, final ArrayList<View> enteringViews,
final Object exitTransition, final ArrayList<View> exitingViews,
final Object sharedElementTransition, final ArrayList<View> sharedElementsIn) {
final Transition overallTransition = (Transition) overallTransitionObj;
overallTransition.addListener(new TransitionListenerAdapter() {
@Override
public void onTransitionStart(@NonNull Transition transition) {
if (enterTransition != null) {
replaceTargets(enterTransition, enteringViews, null);
}
if (exitTransition != null) {
replaceTargets(exitTransition, exitingViews, null);
}
if (sharedElementTransition != null) {
replaceTargets(sharedElementTransition, sharedElementsIn, null);
}
}
@Override
public void onTransitionEnd(@NonNull Transition transition) {
transition.removeListener(this);
}
});
}
/**
* {@inheritDoc}
*
* If either exitingViews or SharedElementsOut contain a view, an
* {@link Transition.TransitionListener#onTransitionEnd} listener is added that calls
* {@link Runnable#run()} once the Transition ends.
*
* If {@link CancellationSignal#cancel()} is called on the given signal, the transition calls
* {@link Transition#cancel()}.
*/
@Override
public void setListenerForTransitionEnd(@NonNull final Fragment outFragment,
@NonNull final Object transition, @NonNull final CancellationSignal signal,
@NonNull final Runnable transitionCompleteRunnable) {
final Transition realTransition = ((Transition) transition);
signal.setOnCancelListener(new CancellationSignal.OnCancelListener() {
@Override
public void onCancel() {
realTransition.cancel();
}
});
realTransition.addListener(new Transition.TransitionListener() {
@Override
public void onTransitionStart(@NonNull Transition transition) { }
@Override
public void onTransitionEnd(@NonNull Transition transition) {
transitionCompleteRunnable.run();
}
@Override
public void onTransitionCancel(@NonNull Transition transition) { }
@Override
public void onTransitionPause(@NonNull Transition transition) { }
@Override
public void onTransitionResume(@NonNull Transition transition) { }
});
}
@Override
public void swapSharedElementTargets(Object sharedElementTransitionObj,
ArrayList<View> sharedElementsOut, ArrayList<View> sharedElementsIn) {
TransitionSet sharedElementTransition = (TransitionSet) sharedElementTransitionObj;
if (sharedElementTransition != null) {
sharedElementTransition.getTargets().clear();
sharedElementTransition.getTargets().addAll(sharedElementsIn);
replaceTargets(sharedElementTransition, sharedElementsOut, sharedElementsIn);
}
}
@Override
public void replaceTargets(Object transitionObj, ArrayList<View> oldTargets,
ArrayList<View> newTargets) {
Transition transition = (Transition) transitionObj;
if (transition instanceof TransitionSet) {
TransitionSet set = (TransitionSet) transition;
int numTransitions = set.getTransitionCount();
for (int i = 0; i < numTransitions; i++) {
Transition child = set.getTransitionAt(i);
replaceTargets(child, oldTargets, newTargets);
}
} else if (!hasSimpleTarget(transition)) {
List<View> targets = transition.getTargets();
if (targets.size() == oldTargets.size()
&& targets.containsAll(oldTargets)) {
// We have an exact match. We must have added these earlier in addTargets
final int targetCount = newTargets == null ? 0 : newTargets.size();
for (int i = 0; i < targetCount; i++) {
transition.addTarget(newTargets.get(i));
}
for (int i = oldTargets.size() - 1; i >= 0; i--) {
transition.removeTarget(oldTargets.get(i));
}
}
}
}
@Override
public void addTarget(Object transitionObj, View view) {
if (transitionObj != null) {
Transition transition = (Transition) transitionObj;
transition.addTarget(view);
}
}
@Override
public void removeTarget(Object transitionObj, View view) {
if (transitionObj != null) {
Transition transition = (Transition) transitionObj;
transition.removeTarget(view);
}
}
@Override
public void setEpicenter(Object transitionObj, final Rect epicenter) {
if (transitionObj != null) {
Transition transition = (Transition) transitionObj;
transition.setEpicenterCallback(new Transition.EpicenterCallback() {
@Override
public Rect onGetEpicenter(@NonNull Transition transition) {
if (epicenter == null || epicenter.isEmpty()) {
return null;
}
return epicenter;
}
});
}
}
}