diff options
author | Doris Liu <tianliu@google.com> | 2016-02-19 21:46:06 +0000 |
---|---|---|
committer | Doris Liu <tianliu@google.com> | 2016-02-19 13:52:41 -0800 |
commit | 8b083206aef627b6445a8c6be8bf5bb1d778a7f8 (patch) | |
tree | 3c4e5e18fbd6f1f6dd3400567b86e9e793fd2665 /libs/hwui/Animator.cpp | |
parent | c4bb185d41cfb960ed9a3178a4f8974c351abdb0 (diff) |
Revert "Revert "Check RenderNode's owning view before attaching animators""
This reverts commit eb40178af3b7c8d925eaf6c1aa0bef739c8ea47e.
Change-Id: I6838ecb35b50847746ee66ac204f14eb5f579b91
Diffstat (limited to 'libs/hwui/Animator.cpp')
-rw-r--r-- | libs/hwui/Animator.cpp | 37 |
1 files changed, 33 insertions, 4 deletions
diff --git a/libs/hwui/Animator.cpp b/libs/hwui/Animator.cpp index 372bcb3b2375..294edb6ecd46 100644 --- a/libs/hwui/Animator.cpp +++ b/libs/hwui/Animator.cpp @@ -33,6 +33,7 @@ namespace uirenderer { BaseRenderNodeAnimator::BaseRenderNodeAnimator(float finalValue) : mTarget(nullptr) + , mStagingTarget(nullptr) , mFinalValue(finalValue) , mDeltaValue(0) , mFromValue(0) @@ -82,7 +83,7 @@ void BaseRenderNodeAnimator::setStartDelay(nsecs_t startDelay) { } void BaseRenderNodeAnimator::attach(RenderNode* target) { - mTarget = target; + mStagingTarget = target; onAttached(); } @@ -145,6 +146,15 @@ void BaseRenderNodeAnimator::resolveStagingRequest(Request request) { } void BaseRenderNodeAnimator::pushStaging(AnimationContext& context) { + if (mStagingTarget) { + RenderNode* oldTarget = mTarget; + mTarget = mStagingTarget; + mStagingTarget = nullptr; + if (oldTarget && oldTarget != mTarget) { + oldTarget->onAnimatorTargetChanged(this); + } + } + if (!mHasStartValue) { doSetStartValue(getValue(mTarget)); } @@ -195,6 +205,7 @@ void BaseRenderNodeAnimator::pushStaging(AnimationContext& context) { } } } + onPushStaging(); } void BaseRenderNodeAnimator::transitionToRunning(AnimationContext& context) { @@ -309,18 +320,36 @@ RenderPropertyAnimator::RenderPropertyAnimator(RenderProperty property, float fi void RenderPropertyAnimator::onAttached() { if (!mHasStartValue - && mTarget->isPropertyFieldDirty(mPropertyAccess->dirtyMask)) { - setStartValue((mTarget->stagingProperties().*mPropertyAccess->getter)()); + && mStagingTarget->isPropertyFieldDirty(mPropertyAccess->dirtyMask)) { + setStartValue((mStagingTarget->stagingProperties().*mPropertyAccess->getter)()); } } void RenderPropertyAnimator::onStagingPlayStateChanged() { if (mStagingPlayState == PlayState::Running) { - (mTarget->mutateStagingProperties().*mPropertyAccess->setter)(finalValue()); + if (mStagingTarget) { + (mStagingTarget->mutateStagingProperties().*mPropertyAccess->setter)(finalValue()); + } else { + // In the case of start delay where stagingTarget has been sync'ed over and null'ed + // we delay the properties update to push staging. + mShouldUpdateStagingProperties = true; + } } else if (mStagingPlayState == PlayState::Finished) { // We're being canceled, so make sure that whatever values the UI thread // is observing for us is pushed over + mShouldSyncPropertyFields = true; + } +} + +void RenderPropertyAnimator::onPushStaging() { + if (mShouldUpdateStagingProperties) { + (mTarget->mutateStagingProperties().*mPropertyAccess->setter)(finalValue()); + mShouldUpdateStagingProperties = false; + } + + if (mShouldSyncPropertyFields) { mTarget->setPropertyFieldsDirty(dirtyMask()); + mShouldSyncPropertyFields = false; } } |