Put VD animators on paused list when RT stops drawing
When we stop scheduling for new frames on RenderThread, we should put the running animations on pause, rather than purge the list of the running animations, such that in the next full sync, the animations that were paused will continue to run. BUG: 30226711 Change-Id: I36ff6f5d26ffa7999f60ca0ff676a35157577dc2
This commit is contained in:
@@ -242,6 +242,16 @@ public:
|
||||
mPausedVDAnimators.clear();
|
||||
}
|
||||
|
||||
// Move all the animators to the paused list, and send a delayed message to notify the finished
|
||||
// listener.
|
||||
void pauseAnimators() {
|
||||
mPausedVDAnimators.insert(mRunningVDAnimators.begin(), mRunningVDAnimators.end());
|
||||
for (auto& anim : mRunningVDAnimators) {
|
||||
detachVectorDrawableAnimator(anim.get());
|
||||
}
|
||||
mRunningVDAnimators.clear();
|
||||
}
|
||||
|
||||
void doAttachAnimatingNodes(AnimationContext* context) {
|
||||
for (size_t i = 0; i < mPendingAnimatingRenderNodes.size(); i++) {
|
||||
RenderNode* node = mPendingAnimatingRenderNodes[i].get();
|
||||
@@ -415,8 +425,8 @@ public:
|
||||
postOnFinishedEvents();
|
||||
}
|
||||
|
||||
virtual void detachAnimators() override {
|
||||
mRootNode->detachAnimators();
|
||||
virtual void pauseAnimators() override {
|
||||
mRootNode->pauseAnimators();
|
||||
}
|
||||
|
||||
virtual void callOnFinished(BaseRenderNodeAnimator* animator, AnimationListener* listener) {
|
||||
@@ -426,7 +436,7 @@ public:
|
||||
|
||||
virtual void destroy() {
|
||||
AnimationContext::destroy();
|
||||
detachAnimators();
|
||||
mRootNode->detachAnimators();
|
||||
postOnFinishedEvents();
|
||||
}
|
||||
|
||||
|
||||
@@ -100,7 +100,7 @@ public:
|
||||
|
||||
ANDROID_API virtual void destroy();
|
||||
|
||||
ANDROID_API virtual void detachAnimators() {}
|
||||
ANDROID_API virtual void pauseAnimators() {}
|
||||
|
||||
private:
|
||||
friend class AnimationHandle;
|
||||
|
||||
@@ -326,7 +326,7 @@ void CanvasContext::prepareTree(TreeInfo& info, int64_t* uiFrameInfo,
|
||||
|
||||
void CanvasContext::stopDrawing() {
|
||||
mRenderThread.removeFrameCallback(this);
|
||||
mAnimationContext->detachAnimators();
|
||||
mAnimationContext->pauseAnimators();
|
||||
}
|
||||
|
||||
void CanvasContext::notifyFramePending() {
|
||||
|
||||
Reference in New Issue
Block a user