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