summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author George Mount <mount@google.com> 2015-06-23 17:56:46 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2015-06-23 17:56:48 +0000
commitff0924c72dabc7072cd85a76a5b26f097107146c (patch)
treebd0e9e68014ee04703fd2bb598331cc1a5f60c76
parent1384d1d90030d568e1f1b8e7e95ae424ba40bcb5 (diff)
parent21290a62a58581eecd29f4895bb7319a0cb5721a (diff)
Merge "Suppress Layout during Visibility transitions" into mnc-dev
-rw-r--r--core/java/android/transition/Visibility.java43
1 files changed, 38 insertions, 5 deletions
diff --git a/core/java/android/transition/Visibility.java b/core/java/android/transition/Visibility.java
index 8b74a1e24a0d..585fc4e82583 100644
--- a/core/java/android/transition/Visibility.java
+++ b/core/java/android/transition/Visibility.java
@@ -504,13 +504,20 @@ public abstract class Visibility extends Transition {
private final boolean mIsForcedVisibility;
private final View mView;
private final int mFinalVisibility;
+ private final ViewGroup mParent;
+ private boolean mEnded;
boolean mCanceled = false;
public DisappearListener(View view, int finalVisibility, boolean isForcedVisibility) {
this.mView = view;
this.mIsForcedVisibility = isForcedVisibility;
this.mFinalVisibility = finalVisibility;
+ this.mParent = (ViewGroup) view.getParent();
+ if (!isForcedVisibility && mParent != null) {
+ // Prevent a layout from including mView in its calculation.
+ mParent.suppressLayout(true);
+ }
}
@Override
@@ -552,13 +559,39 @@ public abstract class Visibility extends Transition {
hideViewWhenNotCanceled();
}
+ @Override
+ public void onTransitionPause(Transition transition) {
+ if (mParent != null && !mIsForcedVisibility) {
+ mParent.suppressLayout(false);
+ }
+ }
+
+ @Override
+ public void onTransitionResume(Transition transition) {
+ if (mParent != null && !mIsForcedVisibility) {
+ mParent.suppressLayout(true);
+ }
+ }
+
private void hideViewWhenNotCanceled() {
- if (!mCanceled) {
- if (mIsForcedVisibility) {
- mView.setTransitionAlpha(0);
- } else {
- mView.setVisibility(mFinalVisibility);
+ if (!mEnded) {
+ if (!mCanceled) {
+ if (mIsForcedVisibility) {
+ mView.setTransitionAlpha(0);
+ } else {
+ // Recreate the parent's display list in case it includes mView.
+ mView.setTransitionVisibility(mFinalVisibility);
+ if (mParent != null) {
+ mParent.invalidate();
+ }
+ }
+ }
+ if (!mIsForcedVisibility && mParent != null) {
+ // Layout is allowed now that the View is in its final state
+ mParent.suppressLayout(false);
}
+ // Do this only once
+ mEnded = true;
}
}
}