PropertyValuesAnimatorSet.cpp revision 766431aa57c16ece8842287a92b2e7208e3b8ac3
1/* 2 * Copyright (C) 2016 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#include "PropertyValuesAnimatorSet.h" 18#include "RenderNode.h" 19 20namespace android { 21namespace uirenderer { 22 23void PropertyValuesAnimatorSet::addPropertyAnimator(PropertyValuesHolder* propertyValuesHolder, 24 Interpolator* interpolator, nsecs_t startDelay, 25 nsecs_t duration, int repeatCount) { 26 27 PropertyAnimator* animator = new PropertyAnimator(propertyValuesHolder, 28 interpolator, startDelay, duration, repeatCount); 29 mAnimators.emplace_back(animator); 30 setListener(new PropertyAnimatorSetListener(this)); 31} 32 33PropertyValuesAnimatorSet::PropertyValuesAnimatorSet() 34 : BaseRenderNodeAnimator(1.0f) { 35 setStartValue(0); 36 mLastFraction = 0.0f; 37 setInterpolator(new LinearInterpolator()); 38} 39 40void PropertyValuesAnimatorSet::onFinished(BaseRenderNodeAnimator* animator) { 41 if (mOneShotListener.get()) { 42 mOneShotListener->onAnimationFinished(animator); 43 mOneShotListener = nullptr; 44 } 45} 46 47float PropertyValuesAnimatorSet::getValue(RenderNode* target) const { 48 return mLastFraction; 49} 50 51void PropertyValuesAnimatorSet::setValue(RenderNode* target, float value) { 52 mLastFraction = value; 53} 54 55void PropertyValuesAnimatorSet::onPlayTimeChanged(nsecs_t playTime) { 56 for (size_t i = 0; i < mAnimators.size(); i++) { 57 mAnimators[i]->setCurrentPlayTime(playTime); 58 } 59} 60 61void PropertyValuesAnimatorSet::reset() { 62 // TODO: implement reset through adding a play state because we need to support reset() even 63 // during an animation run. 64} 65 66void PropertyValuesAnimatorSet::start(AnimationListener* listener) { 67 init(); 68 mOneShotListener = listener; 69 BaseRenderNodeAnimator::start(); 70} 71 72void PropertyValuesAnimatorSet::reverse(AnimationListener* listener) { 73// TODO: implement reverse 74} 75 76void PropertyValuesAnimatorSet::init() { 77 if (mInitialized) { 78 return; 79 } 80 nsecs_t maxDuration = 0; 81 for (size_t i = 0; i < mAnimators.size(); i++) { 82 if (maxDuration < mAnimators[i]->getTotalDuration()) { 83 maxDuration = mAnimators[i]->getTotalDuration(); 84 } 85 } 86 mDuration = maxDuration; 87 mInitialized = true; 88} 89 90uint32_t PropertyValuesAnimatorSet::dirtyMask() { 91 return RenderNode::DISPLAY_LIST; 92} 93 94PropertyAnimator::PropertyAnimator(PropertyValuesHolder* holder, Interpolator* interpolator, 95 nsecs_t startDelay, nsecs_t duration, int repeatCount) 96 : mPropertyValuesHolder(holder), mInterpolator(interpolator), mStartDelay(startDelay), 97 mDuration(duration) { 98 if (repeatCount < 0) { 99 mRepeatCount = UINT32_MAX; 100 } else { 101 mRepeatCount = repeatCount; 102 } 103 mTotalDuration = ((nsecs_t) mRepeatCount + 1) * mDuration + mStartDelay; 104} 105 106void PropertyAnimator::setCurrentPlayTime(nsecs_t playTime) { 107 if (playTime >= mStartDelay && playTime < mTotalDuration) { 108 nsecs_t currentIterationPlayTime = (playTime - mStartDelay) % mDuration; 109 mLatestFraction = currentIterationPlayTime / (float) mDuration; 110 } else if (mLatestFraction < 1.0f && playTime >= mTotalDuration) { 111 mLatestFraction = 1.0f; 112 } else { 113 return; 114 } 115 116 setFraction(mLatestFraction); 117} 118 119void PropertyAnimator::setFraction(float fraction) { 120 float interpolatedFraction = mInterpolator->interpolate(mLatestFraction); 121 mPropertyValuesHolder->setFraction(interpolatedFraction); 122} 123 124void PropertyAnimatorSetListener::onAnimationFinished(BaseRenderNodeAnimator* animator) { 125 mSet->onFinished(animator); 126} 127 128} 129} 130