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:
George Mount
2014-08-12 10:16:20 -07:00
parent a5e2e5e48a
commit a2bbbb3bac
3 changed files with 26 additions and 2 deletions

View File

@@ -239,7 +239,7 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver {
return mWindow;
}
protected ViewGroup getDecor() {
public ViewGroup getDecor() {
return (mWindow == null) ? null : (ViewGroup) mWindow.getDecorView();
}

View File

@@ -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;

View File

@@ -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);