summaryrefslogtreecommitdiff
path: root/libs/hwui/AnimatorManager.cpp
diff options
context:
space:
mode:
authorDoris Liu <tianliu@google.com>2016-02-19 21:46:06 +0000
committerDoris Liu <tianliu@google.com>2016-02-19 13:52:41 -0800
commit8b083206aef627b6445a8c6be8bf5bb1d778a7f8 (patch)
tree3c4e5e18fbd6f1f6dd3400567b86e9e793fd2665 /libs/hwui/AnimatorManager.cpp
parentc4bb185d41cfb960ed9a3178a4f8974c351abdb0 (diff)
Revert "Revert "Check RenderNode's owning view before attaching animators""
This reverts commit eb40178af3b7c8d925eaf6c1aa0bef739c8ea47e. Change-Id: I6838ecb35b50847746ee66ac204f14eb5f579b91
Diffstat (limited to 'libs/hwui/AnimatorManager.cpp')
-rw-r--r--libs/hwui/AnimatorManager.cpp42
1 files changed, 25 insertions, 17 deletions
diff --git a/libs/hwui/AnimatorManager.cpp b/libs/hwui/AnimatorManager.cpp
index 2b49b4743d89..2198fcc95fe5 100644
--- a/libs/hwui/AnimatorManager.cpp
+++ b/libs/hwui/AnimatorManager.cpp
@@ -42,7 +42,23 @@ AnimatorManager::~AnimatorManager() {
}
void AnimatorManager::addAnimator(const sp<BaseRenderNodeAnimator>& animator) {
+ RenderNode* stagingTarget = animator->stagingTarget();
+ if (stagingTarget == &mParent) {
+ return;
+ }
mNewAnimators.emplace_back(animator.get());
+ // If the animator is already attached to other RenderNode, remove it from that RenderNode's
+ // new animator list. This ensures one animator only ends up in one newAnimatorList during one
+ // frame, even when it's added multiple times to multiple targets.
+ if (stagingTarget) {
+ stagingTarget->removeAnimator(animator);
+ }
+ animator->attach(&mParent);
+}
+
+void AnimatorManager::removeAnimator(const sp<BaseRenderNodeAnimator>& animator) {
+ mNewAnimators.erase(std::remove(mNewAnimators.begin(), mNewAnimators.end(), animator),
+ mNewAnimators.end());
}
void AnimatorManager::setAnimationHandle(AnimationHandle* handle) {
@@ -58,21 +74,12 @@ void AnimatorManager::pushStaging() {
LOG_ALWAYS_FATAL_IF(!mAnimationHandle,
"Trying to start new animators on %p (%s) without an animation handle!",
&mParent, mParent.getName());
- // Only add animators that are not already in the on-going animator list.
- for (auto& animator : mNewAnimators) {
- RenderNode* targetRenderNode = animator->target();
- if (targetRenderNode == &mParent) {
- // Animator already in the animator list: skip adding again
- continue;
- }
- if (targetRenderNode){
- // If the animator is already in another RenderNode's animator list, remove animator from
- // that list and add animator to current RenderNode's list.
- targetRenderNode->animators().removeActiveAnimator(animator);
+ // Only add new animators that are not already in the mAnimators list
+ for (auto& anim : mNewAnimators) {
+ if (anim->target() != &mParent) {
+ mAnimators.push_back(std::move(anim));
}
- animator->attach(&mParent);
- mAnimators.push_back(std::move(animator));
}
mNewAnimators.clear();
}
@@ -81,6 +88,11 @@ void AnimatorManager::pushStaging() {
}
}
+void AnimatorManager::onAnimatorTargetChanged(BaseRenderNodeAnimator* animator) {
+ LOG_ALWAYS_FATAL_IF(animator->target() == &mParent, "Target has not been changed");
+ mAnimators.erase(std::remove(mAnimators.begin(), mAnimators.end(), animator), mAnimators.end());
+}
+
class AnimateFunctor {
public:
AnimateFunctor(TreeInfo& info, AnimationContext& context)
@@ -154,10 +166,6 @@ void AnimatorManager::endAllStagingAnimators() {
mNewAnimators.clear();
}
-void AnimatorManager::removeActiveAnimator(const sp<BaseRenderNodeAnimator>& animator) {
- std::remove(mAnimators.begin(), mAnimators.end(), animator);
-}
-
class EndActiveAnimatorsFunctor {
public:
EndActiveAnimatorsFunctor(AnimationContext& context) : mContext(context) {}