AnimationContext.h revision 1bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52
1/* 2 * Copyright (C) 2014 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16#ifndef TREEANIMATIONTRACKER_H_ 17#define TREEANIMATIONTRACKER_H_ 18 19#include <cutils/compiler.h> 20#include <utils/RefBase.h> 21#include <utils/StrongPointer.h> 22 23#include "TreeInfo.h" 24#include "renderthread/TimeLord.h" 25#include "utils/Macros.h" 26 27namespace android { 28namespace uirenderer { 29 30class AnimationContext; 31class AnimationListener; 32class BaseRenderNodeAnimator; 33class RenderNode; 34 35/* 36 * AnimationHandle is several classes merged into one. 37 * 1: It maintains the reference to the AnimationContext required to run animators. 38 * 2: It keeps a strong reference to RenderNodes with animators so that 39 * we don't lose them if they are no longer in the display tree. This is 40 * required so that we can keep animating them, and properly notify listeners 41 * of onAnimationFinished. 42 * 3: It forms a doubly linked list so that we can cheaply move between states. 43 */ 44class AnimationHandle { 45 PREVENT_COPY_AND_ASSIGN(AnimationHandle); 46 47public: 48 AnimationContext& context() { return mContext; } 49 50 // Called by the RenderNode when it has internally pulsed its own animations 51 // this frame and does not need to be run again this frame. 52 void notifyAnimationsRan(); 53 54 // Stops tracking the RenderNode and destroys the handle. The node must be 55 // re-attached to the AnimationContext to receive managed animation 56 // pulses. 57 void release(); 58 59private: 60 friend class AnimationContext; 61 explicit AnimationHandle(AnimationContext& context); 62 AnimationHandle(RenderNode& animatingNode, AnimationContext& context); 63 ~AnimationHandle(); 64 65 void insertAfter(AnimationHandle* prev); 66 void removeFromList(); 67 68 sp<RenderNode> mRenderNode; 69 70 AnimationContext& mContext; 71 72 AnimationHandle* mPreviousHandle; 73 AnimationHandle* mNextHandle; 74}; 75 76class AnimationContext { 77 PREVENT_COPY_AND_ASSIGN(AnimationContext); 78 79public: 80 ANDROID_API explicit AnimationContext(renderthread::TimeLord& clock); 81 ANDROID_API virtual ~AnimationContext(); 82 83 nsecs_t frameTimeMs() { return mFrameTimeMs; } 84 bool hasAnimations() { 85 return mCurrentFrameAnimations.mNextHandle || mNextFrameAnimations.mNextHandle; 86 } 87 88 // Will always add to the next frame list, which is swapped when 89 // startFrame() is called 90 ANDROID_API void addAnimatingRenderNode(RenderNode& node); 91 92 // Marks the start of a frame, which will update the frame time and move all 93 // next frame animations into the current frame 94 ANDROID_API virtual void startFrame(TreeInfo::TraversalMode mode); 95 96 // Runs any animations still left in mCurrentFrameAnimations that were not run 97 // as part of the standard RenderNode:prepareTree pass. 98 ANDROID_API virtual void runRemainingAnimations(TreeInfo& info); 99 100 ANDROID_API virtual void callOnFinished(BaseRenderNodeAnimator* animator, 101 AnimationListener* listener); 102 103 ANDROID_API virtual void destroy(); 104 105 ANDROID_API virtual void pauseAnimators() {} 106 107private: 108 friend class AnimationHandle; 109 void addAnimationHandle(AnimationHandle* handle); 110 111 renderthread::TimeLord& mClock; 112 113 // Animations left to run this frame, at the end of the frame this should 114 // be null 115 AnimationHandle mCurrentFrameAnimations; 116 // Animations queued for next frame 117 AnimationHandle mNextFrameAnimations; 118 119 nsecs_t mFrameTimeMs; 120}; 121 122} /* namespace uirenderer */ 123} /* namespace android */ 124 125#endif /* TREEANIMATIONTRACKER_H_ */ 126