Don't blink in views that haven't transitioned yet.
Bug 16959262 Views that hadn't animated in during the enter transition were being stripped from the exit transition. This caused them to blink in as the enter transition was canceled. This pauses the entering transition so that the view positions are properly captured for the exit transition and aren't stripped. Change-Id: I39cc94ed3bf92a51f8c5fe741f0aa5456b704bf0
This commit is contained in:
@@ -239,7 +239,7 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver {
|
||||
return mWindow;
|
||||
}
|
||||
|
||||
protected ViewGroup getDecor() {
|
||||
public ViewGroup getDecor() {
|
||||
return (mWindow == null) ? null : (ViewGroup) mWindow.getDecorView();
|
||||
}
|
||||
|
||||
|
||||
@@ -17,9 +17,11 @@ package android.app;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.os.ResultReceiver;
|
||||
import android.transition.Transition;
|
||||
import android.util.ArrayMap;
|
||||
import android.util.SparseArray;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.Window;
|
||||
|
||||
import java.lang.ref.WeakReference;
|
||||
@@ -245,13 +247,23 @@ class ActivityTransitionState {
|
||||
} else {
|
||||
if (!mHasExited) {
|
||||
mHasExited = true;
|
||||
Transition enterViewsTransition = null;
|
||||
ViewGroup decor = null;
|
||||
if (mEnterTransitionCoordinator != null) {
|
||||
enterViewsTransition = mEnterTransitionCoordinator.getEnterViewsTransition();
|
||||
decor = mEnterTransitionCoordinator.getDecor();
|
||||
mEnterTransitionCoordinator.cancelEnter();
|
||||
mEnterTransitionCoordinator = null;
|
||||
if (enterViewsTransition != null && decor != null) {
|
||||
enterViewsTransition.pause(decor);
|
||||
}
|
||||
}
|
||||
|
||||
ExitTransitionCoordinator exitCoordinator =
|
||||
new ExitTransitionCoordinator(activity, mEnteringNames, null, null, true);
|
||||
if (enterViewsTransition != null && decor != null) {
|
||||
enterViewsTransition.resume(decor);
|
||||
}
|
||||
exitCoordinator.startExit(activity.mResultCode, activity.mResultData);
|
||||
}
|
||||
return true;
|
||||
|
||||
@@ -59,6 +59,7 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
|
||||
private boolean mIsViewsTransitionComplete;
|
||||
private boolean mIsSharedElementTransitionComplete;
|
||||
private ArrayList<Matrix> mSharedElementParentMatrices;
|
||||
private Transition mEnterViewsTransition;
|
||||
|
||||
public EnterTransitionCoordinator(Activity activity, ResultReceiver resultReceiver,
|
||||
ArrayList<String> sharedElementNames, boolean isReturning) {
|
||||
@@ -104,6 +105,10 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
|
||||
triggerViewsReady(mapNamedElements(accepted, localNames));
|
||||
}
|
||||
|
||||
public Transition getEnterViewsTransition() {
|
||||
return mEnterViewsTransition;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void viewsReady(ArrayMap<String, View> sharedElements) {
|
||||
super.viewsReady(sharedElements);
|
||||
@@ -399,10 +404,17 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
|
||||
viewTransitionComplete();
|
||||
} else {
|
||||
viewsTransition.forceVisibility(View.INVISIBLE, true);
|
||||
setTransitionAlpha(mTransitioningViews, 1);
|
||||
viewsTransition.addListener(new ContinueTransitionListener() {
|
||||
@Override
|
||||
public void onTransitionStart(Transition transition) {
|
||||
mEnterViewsTransition = transition;
|
||||
setTransitionAlpha(mTransitioningViews, 1);
|
||||
super.onTransitionStart(transition);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTransitionEnd(Transition transition) {
|
||||
mEnterViewsTransition = null;
|
||||
transition.removeListener(this);
|
||||
viewTransitionComplete();
|
||||
super.onTransitionEnd(transition);
|
||||
|
||||
Reference in New Issue
Block a user