diff options
| author | 2011-09-07 08:46:23 -0700 | |
|---|---|---|
| committer | 2011-09-07 10:51:00 -0700 | |
| commit | d56c6951755a902a354e13e5fa05fb0984132cc6 (patch) | |
| tree | a8e24dd9ee1771a339ec694b2ba8b9d6cf18cff0 | |
| parent | cbdc9d2e9cba355de4f57eaa926a2d51aa343ac8 (diff) | |
Add end functionality to LayoutTransition
This new hidden API is called by ViewRootImpl when there is a pending
transition but the parent window is not visible.
Change-Id: Idd6a0959b391fae542e675e8740b6a16f8963678
| -rw-r--r-- | core/java/android/animation/LayoutTransition.java | 21 | ||||
| -rw-r--r-- | core/java/android/view/ViewRootImpl.java | 20 |
2 files changed, 33 insertions, 8 deletions
diff --git a/core/java/android/animation/LayoutTransition.java b/core/java/android/animation/LayoutTransition.java index 9e2b8330638e..355b1fcc68de 100644 --- a/core/java/android/animation/LayoutTransition.java +++ b/core/java/android/animation/LayoutTransition.java @@ -793,7 +793,9 @@ public class LayoutTransition { * @hide */ public void startChangingAnimations() { - for (Animator anim : currentChangingAnimations.values()) { + LinkedHashMap<View, Animator> currentAnimCopy = + (LinkedHashMap<View, Animator>) currentChangingAnimations.clone(); + for (Animator anim : currentAnimCopy.values()) { if (anim instanceof ObjectAnimator) { ((ObjectAnimator) anim).setCurrentPlayTime(0); } @@ -802,6 +804,23 @@ public class LayoutTransition { } /** + * Ends the animations that are set up for a CHANGING transition. This is a variant of + * startChangingAnimations() which is called when the window the transition is playing in + * is not visible. We need to make sure the animations put their targets in their end states + * and that the transition finishes to remove any mid-process state (such as isRunning()). + * + * @hide + */ + public void endChangingAnimations() { + LinkedHashMap<View, Animator> currentAnimCopy = + (LinkedHashMap<View, Animator>) currentChangingAnimations.clone(); + for (Animator anim : currentAnimCopy.values()) { + anim.start(); + anim.end(); + } + } + + /** * Returns true if animations are running which animate layout-related properties. This * essentially means that either CHANGE_APPEARING or CHANGE_DISAPPEARING animations * are running, since these animations operate on layout-related properties. diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 2e2b3d6d3a3a..b3dd071f51da 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -1575,13 +1575,13 @@ public final class ViewRootImpl extends Handler implements ViewParent, boolean cancelDraw = attachInfo.mTreeObserver.dispatchOnPreDraw() || viewVisibility != View.VISIBLE; - if (mPendingTransitions != null && mPendingTransitions.size() > 0) { - for (int i = 0; i < mPendingTransitions.size(); ++i) { - mPendingTransitions.get(i).startChangingAnimations(); - } - mPendingTransitions.clear(); - } if (!cancelDraw && !newSurface) { + if (mPendingTransitions != null && mPendingTransitions.size() > 0) { + for (int i = 0; i < mPendingTransitions.size(); ++i) { + mPendingTransitions.get(i).startChangingAnimations(); + } + mPendingTransitions.clear(); + } mFullRedrawNeeded = false; final long drawStartTime; @@ -1619,7 +1619,13 @@ public final class ViewRootImpl extends Handler implements ViewParent, } } } else { - + // End any pending transitions on this non-visible window + if (mPendingTransitions != null && mPendingTransitions.size() > 0) { + for (int i = 0; i < mPendingTransitions.size(); ++i) { + mPendingTransitions.get(i).endChangingAnimations(); + } + mPendingTransitions.clear(); + } // We were supposed to report when we are done drawing. Since we canceled the // draw, remember it here. if ((relayoutResult&WindowManagerImpl.RELAYOUT_FIRST_TIME) != 0) { |