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