diff options
author | George Mount <mount@google.com> | 2015-06-05 16:47:45 -0700 |
---|---|---|
committer | George Mount <mount@google.com> | 2015-06-05 17:21:40 -0700 |
commit | e5a93aa81ce79bf7fa529b09b50d7473f07a74a2 (patch) | |
tree | 3c145d35f63964fb8cdc70f8b606f99f96bfe2ac /core/java | |
parent | 44fdcf26421c4c2a59888739fa003a14e09e8391 (diff) | |
download | frameworks_base-e5a93aa81ce79bf7fa529b09b50d7473f07a74a2.zip frameworks_base-e5a93aa81ce79bf7fa529b09b50d7473f07a74a2.tar.gz frameworks_base-e5a93aa81ce79bf7fa529b09b50d7473f07a74a2.tar.bz2 |
Don't cause requestLayout when transition changes Visibility.
Bug 21400515
When a Visibility transition temporarily changes a View's
visibility, it should not cause a requestLayout or any other
action, such as focus change. This adds a hidden method to
View to allow it to tweak the visibility without causing
other side-effects.
Change-Id: I5a06149983051319080130e5b5e7cc7edda8dd3e
Diffstat (limited to 'core/java')
-rw-r--r-- | core/java/android/transition/Visibility.java | 10 | ||||
-rw-r--r-- | core/java/android/view/GhostView.java | 10 | ||||
-rw-r--r-- | core/java/android/view/View.java | 14 |
3 files changed, 22 insertions, 12 deletions
diff --git a/core/java/android/transition/Visibility.java b/core/java/android/transition/Visibility.java index ed7fd86..684c59e 100644 --- a/core/java/android/transition/Visibility.java +++ b/core/java/android/transition/Visibility.java @@ -445,7 +445,7 @@ public abstract class Visibility extends Transition { mForcedEndVisibility != -1; if (!isForcedVisibility) { originalVisibility = viewToKeep.getVisibility(); - viewToKeep.setVisibility(View.VISIBLE); + viewToKeep.setTransitionVisibility(View.VISIBLE); } Animator animator = onDisappear(sceneRoot, viewToKeep, startValues, endValues); if (animator != null) { @@ -454,7 +454,7 @@ public abstract class Visibility extends Transition { animator.addListener(disappearListener); addListener(disappearListener); } else if (!isForcedVisibility) { - viewToKeep.setVisibility(originalVisibility); + viewToKeep.setTransitionVisibility(originalVisibility); } return animator; } @@ -516,14 +516,14 @@ public abstract class Visibility extends Transition { @Override public void onAnimationPause(Animator animation) { if (!mCanceled && !mIsForcedVisibility) { - mView.setVisibility(mFinalVisibility); + mView.setTransitionVisibility(mFinalVisibility); } } @Override public void onAnimationResume(Animator animation) { if (!mCanceled && !mIsForcedVisibility) { - mView.setVisibility(View.VISIBLE); + mView.setTransitionVisibility(View.VISIBLE); } } @@ -557,7 +557,7 @@ public abstract class Visibility extends Transition { if (mIsForcedVisibility) { mView.setTransitionAlpha(0); } else { - mView.setVisibility(mFinalVisibility); + mView.setTransitionVisibility(mFinalVisibility); } } } diff --git a/core/java/android/view/GhostView.java b/core/java/android/view/GhostView.java index 41502b6..d1b96ba 100644 --- a/core/java/android/view/GhostView.java +++ b/core/java/android/view/GhostView.java @@ -39,7 +39,7 @@ public class GhostView extends View { mView = view; mView.mGhostView = this; final ViewGroup parent = (ViewGroup) mView.getParent(); - setGhostedVisibility(View.INVISIBLE); + mView.setTransitionVisibility(View.INVISIBLE); parent.invalidate(); } @@ -66,19 +66,15 @@ public class GhostView extends View { super.setVisibility(visibility); if (mView.mGhostView == this) { int inverseVisibility = (visibility == View.VISIBLE) ? View.INVISIBLE : View.VISIBLE; - setGhostedVisibility(inverseVisibility); + mView.setTransitionVisibility(inverseVisibility); } } - private void setGhostedVisibility(int visibility) { - mView.mViewFlags = (mView.mViewFlags & ~View.VISIBILITY_MASK) | visibility; - } - @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); if (!mBeingMoved) { - setGhostedVisibility(View.VISIBLE); + mView.setTransitionVisibility(View.VISIBLE); mView.mGhostView = null; final ViewGroup parent = (ViewGroup) mView.getParent(); if (parent != null) { diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 126540f..5082b18c 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -8786,6 +8786,20 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } /** + * Change the visibility of the View without triggering any other changes. This is + * important for transitions, where visibility changes should not adjust focus or + * trigger a new layout. This is only used when the visibility has already been changed + * and we need a transient value during an animation. When the animation completes, + * the original visibility value is always restored. + * + * @param visibility One of {@link #VISIBLE}, {@link #INVISIBLE}, or {@link #GONE}. + * @hide + */ + public void setTransitionVisibility(@Visibility int visibility) { + mViewFlags = (mViewFlags & ~View.VISIBILITY_MASK) | visibility; + } + + /** * Reset the flag indicating the accessibility state of the subtree rooted * at this view changed. */ |