Animator.h revision 52244fff29042926e21fa897ef5ab11148e35299
1e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck/* 2e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * Copyright (C) 2014 The Android Open Source Project 3e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * 4e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * Licensed under the Apache License, Version 2.0 (the "License"); 5e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * you may not use this file except in compliance with the License. 6e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * You may obtain a copy of the License at 7e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * 8e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * http://www.apache.org/licenses/LICENSE-2.0 9e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * 10e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * Unless required by applicable law or agreed to in writing, software 11e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * distributed under the License is distributed on an "AS IS" BASIS, 12e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * See the License for the specific language governing permissions and 14e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * limitations under the License. 15e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck */ 16e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#ifndef ANIMATOR_H 17e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#define ANIMATOR_H 18e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 19e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#include <cutils/compiler.h> 2052244fff29042926e21fa897ef5ab11148e35299John Reck#include <utils/StrongPointer.h> 21e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 2252244fff29042926e21fa897ef5ab11148e35299John Reck#include "CanvasProperty.h" 23e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#include "Interpolator.h" 24e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#include "TreeInfo.h" 2552244fff29042926e21fa897ef5ab11148e35299John Reck#include "utils/Macros.h" 26e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#include "utils/VirtualLightRefBase.h" 27e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 28e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Recknamespace android { 29e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Recknamespace uirenderer { 30e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 3152244fff29042926e21fa897ef5ab11148e35299John Reckclass RenderNode; 32e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckclass RenderProperties; 33e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 3452244fff29042926e21fa897ef5ab11148e35299John Reckclass AnimationListener : public VirtualLightRefBase { 3552244fff29042926e21fa897ef5ab11148e35299John Reckpublic: 3652244fff29042926e21fa897ef5ab11148e35299John Reck ANDROID_API virtual void onAnimationFinished(BaseAnimator*) = 0; 3752244fff29042926e21fa897ef5ab11148e35299John Reckprotected: 3852244fff29042926e21fa897ef5ab11148e35299John Reck ANDROID_API virtual ~AnimationListener() {} 3952244fff29042926e21fa897ef5ab11148e35299John Reck}; 4052244fff29042926e21fa897ef5ab11148e35299John Reck 4152244fff29042926e21fa897ef5ab11148e35299John Reck// Helper class to contain generic animator helpers 4252244fff29042926e21fa897ef5ab11148e35299John Reckclass BaseAnimator : public VirtualLightRefBase { 4352244fff29042926e21fa897ef5ab11148e35299John Reck PREVENT_COPY_AND_ASSIGN(BaseAnimator); 4452244fff29042926e21fa897ef5ab11148e35299John Reckpublic: 4552244fff29042926e21fa897ef5ab11148e35299John Reck 4652244fff29042926e21fa897ef5ab11148e35299John Reck ANDROID_API void setInterpolator(Interpolator* interpolator); 4752244fff29042926e21fa897ef5ab11148e35299John Reck ANDROID_API void setDuration(nsecs_t durationInMs); 4852244fff29042926e21fa897ef5ab11148e35299John Reck ANDROID_API void setListener(AnimationListener* listener) { 4952244fff29042926e21fa897ef5ab11148e35299John Reck mListener = listener; 5052244fff29042926e21fa897ef5ab11148e35299John Reck } 5152244fff29042926e21fa897ef5ab11148e35299John Reck 5252244fff29042926e21fa897ef5ab11148e35299John Reck bool isFinished() { return mPlayState == FINISHED; } 5352244fff29042926e21fa897ef5ab11148e35299John Reck 5452244fff29042926e21fa897ef5ab11148e35299John Reckprotected: 5552244fff29042926e21fa897ef5ab11148e35299John Reck BaseAnimator(); 5652244fff29042926e21fa897ef5ab11148e35299John Reck virtual ~BaseAnimator(); 5752244fff29042926e21fa897ef5ab11148e35299John Reck 5852244fff29042926e21fa897ef5ab11148e35299John Reck // This is the main animation entrypoint that subclasses should call 5952244fff29042926e21fa897ef5ab11148e35299John Reck // to generate the onAnimation* lifecycle events 6052244fff29042926e21fa897ef5ab11148e35299John Reck // Returns true if the animation has finished, false otherwise 6152244fff29042926e21fa897ef5ab11148e35299John Reck bool animateFrame(TreeInfo& info); 6252244fff29042926e21fa897ef5ab11148e35299John Reck 6352244fff29042926e21fa897ef5ab11148e35299John Reck // Called when PlayState switches from PENDING to RUNNING 6452244fff29042926e21fa897ef5ab11148e35299John Reck virtual void onAnimationStarted() {} 6552244fff29042926e21fa897ef5ab11148e35299John Reck virtual void onAnimationUpdated(float fraction) = 0; 6652244fff29042926e21fa897ef5ab11148e35299John Reck virtual void onAnimationFinished() {} 6752244fff29042926e21fa897ef5ab11148e35299John Reck 6852244fff29042926e21fa897ef5ab11148e35299John Reckprivate: 6952244fff29042926e21fa897ef5ab11148e35299John Reck void callOnFinishedListener(TreeInfo& info); 7052244fff29042926e21fa897ef5ab11148e35299John Reck 7152244fff29042926e21fa897ef5ab11148e35299John Reck enum PlayState { 7252244fff29042926e21fa897ef5ab11148e35299John Reck PENDING, 7352244fff29042926e21fa897ef5ab11148e35299John Reck RUNNING, 7452244fff29042926e21fa897ef5ab11148e35299John Reck FINISHED, 7552244fff29042926e21fa897ef5ab11148e35299John Reck }; 7652244fff29042926e21fa897ef5ab11148e35299John Reck 7752244fff29042926e21fa897ef5ab11148e35299John Reck Interpolator* mInterpolator; 7852244fff29042926e21fa897ef5ab11148e35299John Reck PlayState mPlayState; 7952244fff29042926e21fa897ef5ab11148e35299John Reck long mStartTime; 8052244fff29042926e21fa897ef5ab11148e35299John Reck long mDuration; 8152244fff29042926e21fa897ef5ab11148e35299John Reck 8252244fff29042926e21fa897ef5ab11148e35299John Reck sp<AnimationListener> mListener; 8352244fff29042926e21fa897ef5ab11148e35299John Reck}; 8452244fff29042926e21fa897ef5ab11148e35299John Reck 8552244fff29042926e21fa897ef5ab11148e35299John Reckclass BaseRenderNodeAnimator : public BaseAnimator { 86e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckpublic: 87e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck // Since the UI thread doesn't necessarily know what the current values 88e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck // actually are and thus can't do the calculations, this is used to inform 89e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck // the animator how to lazy-resolve the input value 90e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck enum DeltaValueType { 91e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck // The delta value represents an absolute value endpoint 92e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck // mDeltaValue needs to be recalculated to be mDelta = (mDelta - fromValue) 93e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck // in onAnimationStarted() 94e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck ABSOLUTE = 0, 95e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck // The final value represents an offset from the current value 96e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck // No recalculation is needed 97e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck DELTA, 98e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck }; 99e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 10052244fff29042926e21fa897ef5ab11148e35299John Reck bool animate(RenderNode* target, TreeInfo& info); 10152244fff29042926e21fa897ef5ab11148e35299John Reck 10252244fff29042926e21fa897ef5ab11148e35299John Reckprotected: 10352244fff29042926e21fa897ef5ab11148e35299John Reck BaseRenderNodeAnimator(DeltaValueType deltaType, float deltaValue); 10452244fff29042926e21fa897ef5ab11148e35299John Reck 10552244fff29042926e21fa897ef5ab11148e35299John Reck RenderNode* target() const { return mTarget; } 10652244fff29042926e21fa897ef5ab11148e35299John Reck virtual float getValue() const = 0; 10752244fff29042926e21fa897ef5ab11148e35299John Reck virtual void setValue(float value) = 0; 10852244fff29042926e21fa897ef5ab11148e35299John Reck 10952244fff29042926e21fa897ef5ab11148e35299John Reckprivate: 11052244fff29042926e21fa897ef5ab11148e35299John Reck virtual void onAnimationStarted(); 11152244fff29042926e21fa897ef5ab11148e35299John Reck virtual void onAnimationUpdated(float fraction); 11252244fff29042926e21fa897ef5ab11148e35299John Reck 11352244fff29042926e21fa897ef5ab11148e35299John Reck // mTarget is only valid inside animate() 11452244fff29042926e21fa897ef5ab11148e35299John Reck RenderNode* mTarget; 11552244fff29042926e21fa897ef5ab11148e35299John Reck 11652244fff29042926e21fa897ef5ab11148e35299John Reck BaseRenderNodeAnimator::DeltaValueType mDeltaValueType; 11752244fff29042926e21fa897ef5ab11148e35299John Reck float mDeltaValue; 11852244fff29042926e21fa897ef5ab11148e35299John Reck float mFromValue; 11952244fff29042926e21fa897ef5ab11148e35299John Reck}; 12052244fff29042926e21fa897ef5ab11148e35299John Reck 12152244fff29042926e21fa897ef5ab11148e35299John Reckclass RenderPropertyAnimator : public BaseRenderNodeAnimator { 12252244fff29042926e21fa897ef5ab11148e35299John Reckpublic: 123e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck enum RenderProperty { 124e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck TRANSLATION_X = 0, 125e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck TRANSLATION_Y, 126e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck TRANSLATION_Z, 127e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck SCALE_X, 128e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck SCALE_Y, 129e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck ROTATION, 130e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck ROTATION_X, 131e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck ROTATION_Y, 132e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck X, 133e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck Y, 134e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck Z, 135e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck ALPHA, 136e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck }; 137e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 13852244fff29042926e21fa897ef5ab11148e35299John Reck ANDROID_API RenderPropertyAnimator(RenderProperty property, 13952244fff29042926e21fa897ef5ab11148e35299John Reck DeltaValueType deltaType, float deltaValue); 14052244fff29042926e21fa897ef5ab11148e35299John Reck 14152244fff29042926e21fa897ef5ab11148e35299John Reckprotected: 14252244fff29042926e21fa897ef5ab11148e35299John Reck ANDROID_API virtual float getValue() const; 14352244fff29042926e21fa897ef5ab11148e35299John Reck ANDROID_API virtual void setValue(float value); 14452244fff29042926e21fa897ef5ab11148e35299John Reck 14552244fff29042926e21fa897ef5ab11148e35299John Reckprivate: 14652244fff29042926e21fa897ef5ab11148e35299John Reck typedef void (RenderProperties::*SetFloatProperty)(float value); 14752244fff29042926e21fa897ef5ab11148e35299John Reck typedef float (RenderProperties::*GetFloatProperty)() const; 148e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 14952244fff29042926e21fa897ef5ab11148e35299John Reck struct PropertyAccessors { 15052244fff29042926e21fa897ef5ab11148e35299John Reck GetFloatProperty getter; 15152244fff29042926e21fa897ef5ab11148e35299John Reck SetFloatProperty setter; 15252244fff29042926e21fa897ef5ab11148e35299John Reck }; 15352244fff29042926e21fa897ef5ab11148e35299John Reck 15452244fff29042926e21fa897ef5ab11148e35299John Reck PropertyAccessors mPropertyAccess; 15552244fff29042926e21fa897ef5ab11148e35299John Reck 15652244fff29042926e21fa897ef5ab11148e35299John Reck static const PropertyAccessors PROPERTY_ACCESSOR_LUT[]; 15752244fff29042926e21fa897ef5ab11148e35299John Reck}; 158e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 15952244fff29042926e21fa897ef5ab11148e35299John Reckclass CanvasPropertyPrimitiveAnimator : public BaseRenderNodeAnimator { 16052244fff29042926e21fa897ef5ab11148e35299John Reckpublic: 16152244fff29042926e21fa897ef5ab11148e35299John Reck ANDROID_API CanvasPropertyPrimitiveAnimator(CanvasPropertyPrimitive* property, 16252244fff29042926e21fa897ef5ab11148e35299John Reck DeltaValueType deltaType, float deltaValue); 163e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckprotected: 16452244fff29042926e21fa897ef5ab11148e35299John Reck ANDROID_API virtual float getValue() const; 16552244fff29042926e21fa897ef5ab11148e35299John Reck ANDROID_API virtual void setValue(float value); 16652244fff29042926e21fa897ef5ab11148e35299John Reckprivate: 16752244fff29042926e21fa897ef5ab11148e35299John Reck sp<CanvasPropertyPrimitive> mProperty; 16852244fff29042926e21fa897ef5ab11148e35299John Reck}; 16952244fff29042926e21fa897ef5ab11148e35299John Reck 17052244fff29042926e21fa897ef5ab11148e35299John Reckclass CanvasPropertyPaintAnimator : public BaseRenderNodeAnimator { 17152244fff29042926e21fa897ef5ab11148e35299John Reckpublic: 17252244fff29042926e21fa897ef5ab11148e35299John Reck enum PaintField { 17352244fff29042926e21fa897ef5ab11148e35299John Reck STROKE_WIDTH = 0, 17452244fff29042926e21fa897ef5ab11148e35299John Reck ALPHA, 17552244fff29042926e21fa897ef5ab11148e35299John Reck }; 176e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 17752244fff29042926e21fa897ef5ab11148e35299John Reck ANDROID_API CanvasPropertyPaintAnimator(CanvasPropertyPaint* property, 17852244fff29042926e21fa897ef5ab11148e35299John Reck PaintField field, DeltaValueType deltaType, float deltaValue); 17952244fff29042926e21fa897ef5ab11148e35299John Reckprotected: 18052244fff29042926e21fa897ef5ab11148e35299John Reck ANDROID_API virtual float getValue() const; 18152244fff29042926e21fa897ef5ab11148e35299John Reck ANDROID_API virtual void setValue(float value); 182e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckprivate: 18352244fff29042926e21fa897ef5ab11148e35299John Reck sp<CanvasPropertyPaint> mProperty; 18452244fff29042926e21fa897ef5ab11148e35299John Reck PaintField mField; 185e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck}; 186e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 187e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck} /* namespace uirenderer */ 188e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck} /* namespace android */ 189e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 190e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#endif /* ANIMATOR_H */ 191