Animator.cpp revision e45b1fd03b524d2b57cc6c222d89076a31a08bea
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 17e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#define LOG_TAG "RT-Animator" 18e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 19e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#include "Animator.h" 20e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 21e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#include <set> 22e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 23e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#include "RenderProperties.h" 24e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 25e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Recknamespace android { 26e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Recknamespace uirenderer { 27e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 28e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck/************************************************************ 29e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * Private header 30e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck ************************************************************/ 31e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 32e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Recktypedef void (RenderProperties::*SetFloatProperty)(float value); 33e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Recktypedef float (RenderProperties::*GetFloatProperty)() const; 34e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 35e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckstruct PropertyAccessors { 36e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck GetFloatProperty getter; 37e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck SetFloatProperty setter; 38e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck}; 39e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 40e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck// Maps RenderProperty enum to accessors 41e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckstatic const PropertyAccessors PROPERTY_ACCESSOR_LUT[] = { 42e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck {&RenderProperties::getTranslationX, &RenderProperties::setTranslationX }, 43e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck {&RenderProperties::getTranslationY, &RenderProperties::setTranslationY }, 44e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck {&RenderProperties::getTranslationZ, &RenderProperties::setTranslationZ }, 45e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck {&RenderProperties::getScaleX, &RenderProperties::setScaleX }, 46e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck {&RenderProperties::getScaleY, &RenderProperties::setScaleY }, 47e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck {&RenderProperties::getRotation, &RenderProperties::setRotation }, 48e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck {&RenderProperties::getRotationX, &RenderProperties::setRotationX }, 49e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck {&RenderProperties::getRotationY, &RenderProperties::setRotationY }, 50e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck {&RenderProperties::getX, &RenderProperties::setX }, 51e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck {&RenderProperties::getY, &RenderProperties::setY }, 52e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck {&RenderProperties::getZ, &RenderProperties::setZ }, 53e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck {&RenderProperties::getAlpha, &RenderProperties::setAlpha }, 54e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck}; 55e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 56e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck// Helper class to contain generic animator helpers 57e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckclass BaseAnimator { 58e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckpublic: 59e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck BaseAnimator(); 60e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck virtual ~BaseAnimator(); 61e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 62e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck void setInterpolator(Interpolator* interpolator); 63e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck void setDuration(nsecs_t durationInMs); 64e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 65e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck bool isFinished() { return mPlayState == FINISHED; } 66e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 67e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckprotected: 68e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck // This is the main animation entrypoint that subclasses should call 69e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck // to generate the onAnimation* lifecycle events 70e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck // Returns true if the animation has finished, false otherwise 71e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck bool animateFrame(nsecs_t frameTime); 72e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 73e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck // Called when PlayState switches from PENDING to RUNNING 74e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck virtual void onAnimationStarted() {} 75e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck virtual void onAnimationUpdated(float fraction) = 0; 76e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck virtual void onAnimationFinished() {} 77e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 78e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckprivate: 79e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck enum PlayState { 80e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck PENDING, 81e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck RUNNING, 82e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck FINISHED, 83e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck }; 84e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 85e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck Interpolator* mInterpolator; 86e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck PlayState mPlayState; 87e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck long mStartTime; 88e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck long mDuration; 89e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck}; 90e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 91e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck// Hide the base classes & private bits from the exported RenderPropertyAnimator 92e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck// in this Impl class so that subclasses of RenderPropertyAnimator don't require 93e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck// knowledge of the inner guts but only the public virtual methods. 94e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck// Animates a single property 95e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckclass RenderPropertyAnimatorImpl : public BaseAnimator { 96e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckpublic: 97e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck RenderPropertyAnimatorImpl(GetFloatProperty getter, SetFloatProperty setter, 98e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck RenderPropertyAnimator::DeltaValueType deltaType, float delta); 99e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck ~RenderPropertyAnimatorImpl(); 100e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 101e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck bool animate(RenderProperties* target, TreeInfo& info); 102e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 103e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckprotected: 104e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck virtual void onAnimationStarted(); 105e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck virtual void onAnimationUpdated(float fraction); 106e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 107e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckprivate: 108e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck // mTarget is only valid inside animate() 109e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck RenderProperties* mTarget; 110e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck GetFloatProperty mGetter; 111e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck SetFloatProperty mSetter; 112e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 113e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck RenderPropertyAnimator::DeltaValueType mDeltaValueType; 114e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck float mDeltaValue; 115e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck float mFromValue; 116e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck}; 117e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 118e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn ReckRenderPropertyAnimator::RenderPropertyAnimator(RenderProperty property, 119e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck DeltaValueType deltaType, float deltaValue) { 120e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck PropertyAccessors pa = PROPERTY_ACCESSOR_LUT[property]; 121e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck mImpl = new RenderPropertyAnimatorImpl(pa.getter, pa.setter, deltaType, deltaValue); 122e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck} 123e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 124e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn ReckRenderPropertyAnimator::~RenderPropertyAnimator() { 125e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck delete mImpl; 126e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck mImpl = NULL; 127e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck} 128e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 129e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckvoid RenderPropertyAnimator::setInterpolator(Interpolator* interpolator) { 130e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck mImpl->setInterpolator(interpolator); 131e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck} 132e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 133e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckvoid RenderPropertyAnimator::setDuration(nsecs_t durationInMs) { 134e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck mImpl->setDuration(durationInMs); 135e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck} 136e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 137e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckbool RenderPropertyAnimator::isFinished() { 138e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck return mImpl->isFinished(); 139e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck} 140e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 141e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckbool RenderPropertyAnimator::animate(RenderProperties* target, TreeInfo& info) { 142e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck return mImpl->animate(target, info); 143e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck} 144e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 145e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 146e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck/************************************************************ 147e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * Base animator 148e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck ************************************************************/ 149e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 150e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn ReckBaseAnimator::BaseAnimator() 151e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck : mInterpolator(0) 152e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck , mPlayState(PENDING) 153e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck , mStartTime(0) 154e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck , mDuration(300) { 155e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 156e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck} 157e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 158e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn ReckBaseAnimator::~BaseAnimator() { 159e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck setInterpolator(NULL); 160e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck} 161e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 162e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckvoid BaseAnimator::setInterpolator(Interpolator* interpolator) { 163e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck delete mInterpolator; 164e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck mInterpolator = interpolator; 165e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck} 166e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 167e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckvoid BaseAnimator::setDuration(nsecs_t duration) { 168e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck mDuration = duration; 169e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck} 170e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 171e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckbool BaseAnimator::animateFrame(nsecs_t frameTime) { 172e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck if (mPlayState == PENDING) { 173e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck mPlayState = RUNNING; 174e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck mStartTime = frameTime; 175e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck // No interpolator was set, use the default 176e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck if (!mInterpolator) { 177e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck setInterpolator(Interpolator::createDefaultInterpolator()); 178e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck } 179e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck onAnimationStarted(); 180e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck } 181e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 182e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck float fraction = 1.0f; 183e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck if (mPlayState == RUNNING) { 184e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck fraction = mDuration > 0 ? (float)(frameTime - mStartTime) / mDuration : 1.0f; 185e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck if (fraction >= 1.0f) { 186e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck fraction = 1.0f; 187e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck mPlayState = FINISHED; 188e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck } 189e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck } 190e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck fraction = mInterpolator->interpolate(fraction); 191e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck onAnimationUpdated(fraction); 192e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 193e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck if (mPlayState == FINISHED) { 194e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck onAnimationFinished(); 195e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck return true; 196e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck } 197e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck return false; 198e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck} 199e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 200e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck/************************************************************ 201e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * RenderPropertyAnimator 202e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck ************************************************************/ 203e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 204e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn ReckRenderPropertyAnimatorImpl::RenderPropertyAnimatorImpl( 205e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck GetFloatProperty getter, SetFloatProperty setter, 206e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck RenderPropertyAnimator::DeltaValueType deltaType, float delta) 207e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck : mTarget(0) 208e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck , mGetter(getter) 209e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck , mSetter(setter) 210e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck , mDeltaValueType(deltaType) 211e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck , mDeltaValue(delta) 212e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck , mFromValue(-1) { 213e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck} 214e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 215e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn ReckRenderPropertyAnimatorImpl::~RenderPropertyAnimatorImpl() { 216e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck} 217e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 218e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckbool RenderPropertyAnimatorImpl::animate(RenderProperties* target, TreeInfo& info) { 219e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck mTarget = target; 220e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck bool finished = animateFrame(info.frameTimeMs); 221e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck mTarget = NULL; 222e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck return finished; 223e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck} 224e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 225e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckvoid RenderPropertyAnimatorImpl::onAnimationStarted() { 226e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck mFromValue = (mTarget->*mGetter)(); 227e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 228e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck if (mDeltaValueType == RenderPropertyAnimator::ABSOLUTE) { 229e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck mDeltaValue = (mDeltaValue - mFromValue); 230e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck mDeltaValueType = RenderPropertyAnimator::DELTA; 231e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck } 232e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck} 233e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 234e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckvoid RenderPropertyAnimatorImpl::onAnimationUpdated(float fraction) { 235e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck float value = mFromValue + (mDeltaValue * fraction); 236e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck (mTarget->*mSetter)(value); 237e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck} 238e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 239e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck} /* namespace uirenderer */ 240e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck} /* namespace android */ 241