Animator.h revision ad2f8e334f3ef22d3e412b0660a2e1f996f94116
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> 209fa4071c4768c63902c6a74a4b480b51a8b95d43John Reck#include <utils/RefBase.h> 2152244fff29042926e21fa897ef5ab11148e35299John Reck#include <utils/StrongPointer.h> 22e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 2352244fff29042926e21fa897ef5ab11148e35299John Reck#include "CanvasProperty.h" 24e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#include "Interpolator.h" 25e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#include "TreeInfo.h" 2652244fff29042926e21fa897ef5ab11148e35299John Reck#include "utils/Macros.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: 36ff941dcd815021bb20d6504eb486acb1e50592c3John Reck ANDROID_API virtual void onAnimationFinished(BaseRenderNodeAnimator*) = 0; 3752244fff29042926e21fa897ef5ab11148e35299John Reckprotected: 3852244fff29042926e21fa897ef5ab11148e35299John Reck ANDROID_API virtual ~AnimationListener() {} 3952244fff29042926e21fa897ef5ab11148e35299John Reck}; 4052244fff29042926e21fa897ef5ab11148e35299John Reck 41ff941dcd815021bb20d6504eb486acb1e50592c3John Reckclass BaseRenderNodeAnimator : public VirtualLightRefBase { 42ff941dcd815021bb20d6504eb486acb1e50592c3John Reck PREVENT_COPY_AND_ASSIGN(BaseRenderNodeAnimator); 4352244fff29042926e21fa897ef5ab11148e35299John Reckpublic: 4452244fff29042926e21fa897ef5ab11148e35299John Reck ANDROID_API void setInterpolator(Interpolator* interpolator); 4552244fff29042926e21fa897ef5ab11148e35299John Reck ANDROID_API void setDuration(nsecs_t durationInMs); 46315c329544d7c593d1072b071cbb92d9afe74021John Reck ANDROID_API nsecs_t duration() { return mDuration; } 47ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette ANDROID_API void setStartDelay(nsecs_t startDelayInMs); 48ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette ANDROID_API nsecs_t startDelay() { return mStartDelay; } 4952244fff29042926e21fa897ef5ab11148e35299John Reck ANDROID_API void setListener(AnimationListener* listener) { 5052244fff29042926e21fa897ef5ab11148e35299John Reck mListener = listener; 5152244fff29042926e21fa897ef5ab11148e35299John Reck } 5252244fff29042926e21fa897ef5ab11148e35299John Reck 53ff941dcd815021bb20d6504eb486acb1e50592c3John Reck ANDROID_API virtual void onAttached(RenderNode* target) {} 54ff941dcd815021bb20d6504eb486acb1e50592c3John Reck 55ff941dcd815021bb20d6504eb486acb1e50592c3John Reck // Guaranteed to happen before the staging push 56ff941dcd815021bb20d6504eb486acb1e50592c3John Reck void setupStartValueIfNecessary(RenderNode* target, TreeInfo& info); 57ff941dcd815021bb20d6504eb486acb1e50592c3John Reck 58ff941dcd815021bb20d6504eb486acb1e50592c3John Reck bool animate(RenderNode* target, TreeInfo& info); 59ff941dcd815021bb20d6504eb486acb1e50592c3John Reck 6052244fff29042926e21fa897ef5ab11148e35299John Reck bool isFinished() { return mPlayState == FINISHED; } 61ff941dcd815021bb20d6504eb486acb1e50592c3John Reck float finalValue() { return mFinalValue; } 6252244fff29042926e21fa897ef5ab11148e35299John Reck 6352244fff29042926e21fa897ef5ab11148e35299John Reckprotected: 64ff941dcd815021bb20d6504eb486acb1e50592c3John Reck BaseRenderNodeAnimator(float finalValue); 65ff941dcd815021bb20d6504eb486acb1e50592c3John Reck virtual ~BaseRenderNodeAnimator(); 6652244fff29042926e21fa897ef5ab11148e35299John Reck 67ff941dcd815021bb20d6504eb486acb1e50592c3John Reck void setStartValue(float value); 68ff941dcd815021bb20d6504eb486acb1e50592c3John Reck virtual float getValue(RenderNode* target) const = 0; 69ff941dcd815021bb20d6504eb486acb1e50592c3John Reck virtual void setValue(RenderNode* target, float value) = 0; 7052244fff29042926e21fa897ef5ab11148e35299John Reck 7152244fff29042926e21fa897ef5ab11148e35299John Reckprivate: 7252244fff29042926e21fa897ef5ab11148e35299John Reck void callOnFinishedListener(TreeInfo& info); 7352244fff29042926e21fa897ef5ab11148e35299John Reck 7452244fff29042926e21fa897ef5ab11148e35299John Reck enum PlayState { 75ff941dcd815021bb20d6504eb486acb1e50592c3John Reck NEEDS_START, 7652244fff29042926e21fa897ef5ab11148e35299John Reck PENDING, 7752244fff29042926e21fa897ef5ab11148e35299John Reck RUNNING, 7852244fff29042926e21fa897ef5ab11148e35299John Reck FINISHED, 7952244fff29042926e21fa897ef5ab11148e35299John Reck }; 8052244fff29042926e21fa897ef5ab11148e35299John Reck 81ff941dcd815021bb20d6504eb486acb1e50592c3John Reck float mFinalValue; 82ff941dcd815021bb20d6504eb486acb1e50592c3John Reck float mDeltaValue; 83ff941dcd815021bb20d6504eb486acb1e50592c3John Reck float mFromValue; 84ff941dcd815021bb20d6504eb486acb1e50592c3John Reck 8552244fff29042926e21fa897ef5ab11148e35299John Reck Interpolator* mInterpolator; 8652244fff29042926e21fa897ef5ab11148e35299John Reck PlayState mPlayState; 87ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette nsecs_t mStartTime; 88ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette nsecs_t mDelayUntil; 89ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette nsecs_t mDuration; 90ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette nsecs_t mStartDelay; 9152244fff29042926e21fa897ef5ab11148e35299John Reck 92ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette sp<AnimationListener> mListener; 9352244fff29042926e21fa897ef5ab11148e35299John Reck}; 9452244fff29042926e21fa897ef5ab11148e35299John Reck 9552244fff29042926e21fa897ef5ab11148e35299John Reckclass RenderPropertyAnimator : public BaseRenderNodeAnimator { 9652244fff29042926e21fa897ef5ab11148e35299John Reckpublic: 97e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck enum RenderProperty { 98e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck TRANSLATION_X = 0, 99e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck TRANSLATION_Y, 100e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck TRANSLATION_Z, 101e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck SCALE_X, 102e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck SCALE_Y, 103e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck ROTATION, 104e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck ROTATION_X, 105e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck ROTATION_Y, 106e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck X, 107e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck Y, 108e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck Z, 109e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck ALPHA, 110e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck }; 111e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 112ff941dcd815021bb20d6504eb486acb1e50592c3John Reck ANDROID_API RenderPropertyAnimator(RenderProperty property, float finalValue); 113ff941dcd815021bb20d6504eb486acb1e50592c3John Reck 114ff941dcd815021bb20d6504eb486acb1e50592c3John Reck ANDROID_API virtual void onAttached(RenderNode* target); 11552244fff29042926e21fa897ef5ab11148e35299John Reck 11652244fff29042926e21fa897ef5ab11148e35299John Reckprotected: 117ff941dcd815021bb20d6504eb486acb1e50592c3John Reck virtual float getValue(RenderNode* target) const; 118ff941dcd815021bb20d6504eb486acb1e50592c3John Reck virtual void setValue(RenderNode* target, float value); 11952244fff29042926e21fa897ef5ab11148e35299John Reck 12052244fff29042926e21fa897ef5ab11148e35299John Reckprivate: 12152244fff29042926e21fa897ef5ab11148e35299John Reck typedef void (RenderProperties::*SetFloatProperty)(float value); 12252244fff29042926e21fa897ef5ab11148e35299John Reck typedef float (RenderProperties::*GetFloatProperty)() const; 123e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 124ff941dcd815021bb20d6504eb486acb1e50592c3John Reck struct PropertyAccessors; 125ff941dcd815021bb20d6504eb486acb1e50592c3John Reck const PropertyAccessors* mPropertyAccess; 12652244fff29042926e21fa897ef5ab11148e35299John Reck 12752244fff29042926e21fa897ef5ab11148e35299John Reck static const PropertyAccessors PROPERTY_ACCESSOR_LUT[]; 12852244fff29042926e21fa897ef5ab11148e35299John Reck}; 129e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 13052244fff29042926e21fa897ef5ab11148e35299John Reckclass CanvasPropertyPrimitiveAnimator : public BaseRenderNodeAnimator { 13152244fff29042926e21fa897ef5ab11148e35299John Reckpublic: 13252244fff29042926e21fa897ef5ab11148e35299John Reck ANDROID_API CanvasPropertyPrimitiveAnimator(CanvasPropertyPrimitive* property, 133ff941dcd815021bb20d6504eb486acb1e50592c3John Reck float finalValue); 134e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckprotected: 135ff941dcd815021bb20d6504eb486acb1e50592c3John Reck virtual float getValue(RenderNode* target) const; 136ff941dcd815021bb20d6504eb486acb1e50592c3John Reck virtual void setValue(RenderNode* target, float value); 13752244fff29042926e21fa897ef5ab11148e35299John Reckprivate: 13852244fff29042926e21fa897ef5ab11148e35299John Reck sp<CanvasPropertyPrimitive> mProperty; 13952244fff29042926e21fa897ef5ab11148e35299John Reck}; 14052244fff29042926e21fa897ef5ab11148e35299John Reck 14152244fff29042926e21fa897ef5ab11148e35299John Reckclass CanvasPropertyPaintAnimator : public BaseRenderNodeAnimator { 14252244fff29042926e21fa897ef5ab11148e35299John Reckpublic: 14352244fff29042926e21fa897ef5ab11148e35299John Reck enum PaintField { 14452244fff29042926e21fa897ef5ab11148e35299John Reck STROKE_WIDTH = 0, 14552244fff29042926e21fa897ef5ab11148e35299John Reck ALPHA, 14652244fff29042926e21fa897ef5ab11148e35299John Reck }; 147e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 14852244fff29042926e21fa897ef5ab11148e35299John Reck ANDROID_API CanvasPropertyPaintAnimator(CanvasPropertyPaint* property, 149ff941dcd815021bb20d6504eb486acb1e50592c3John Reck PaintField field, float finalValue); 15052244fff29042926e21fa897ef5ab11148e35299John Reckprotected: 151ff941dcd815021bb20d6504eb486acb1e50592c3John Reck virtual float getValue(RenderNode* target) const; 152ff941dcd815021bb20d6504eb486acb1e50592c3John Reck virtual void setValue(RenderNode* target, float value); 153e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckprivate: 15452244fff29042926e21fa897ef5ab11148e35299John Reck sp<CanvasPropertyPaint> mProperty; 15552244fff29042926e21fa897ef5ab11148e35299John Reck PaintField mField; 156e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck}; 157e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 158e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck} /* namespace uirenderer */ 159e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck} /* namespace android */ 160e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 161e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#endif /* ANIMATOR_H */ 162