PropertyValuesAnimatorSet.cpp revision 766431aa57c16ece8842287a92b2e7208e3b8ac3
1766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu/* 2766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu * Copyright (C) 2016 The Android Open Source Project 3766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu * 4766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu * Licensed under the Apache License, Version 2.0 (the "License"); 5766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu * you may not use this file except in compliance with the License. 6766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu * You may obtain a copy of the License at 7766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu * 8766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu * http://www.apache.org/licenses/LICENSE-2.0 9766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu * 10766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu * Unless required by applicable law or agreed to in writing, software 11766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu * distributed under the License is distributed on an "AS IS" BASIS, 12766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu * See the License for the specific language governing permissions and 14766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu * limitations under the License. 15766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu */ 16766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu 17766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu#include "PropertyValuesAnimatorSet.h" 18766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu#include "RenderNode.h" 19766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu 20766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liunamespace android { 21766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liunamespace uirenderer { 22766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu 23766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liuvoid PropertyValuesAnimatorSet::addPropertyAnimator(PropertyValuesHolder* propertyValuesHolder, 24766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu Interpolator* interpolator, nsecs_t startDelay, 25766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu nsecs_t duration, int repeatCount) { 26766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu 27766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu PropertyAnimator* animator = new PropertyAnimator(propertyValuesHolder, 28766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu interpolator, startDelay, duration, repeatCount); 29766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu mAnimators.emplace_back(animator); 30766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu setListener(new PropertyAnimatorSetListener(this)); 31766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu} 32766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu 33766431aa57c16ece8842287a92b2e7208e3b8ac3Doris LiuPropertyValuesAnimatorSet::PropertyValuesAnimatorSet() 34766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu : BaseRenderNodeAnimator(1.0f) { 35766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu setStartValue(0); 36766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu mLastFraction = 0.0f; 37766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu setInterpolator(new LinearInterpolator()); 38766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu} 39766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu 40766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liuvoid PropertyValuesAnimatorSet::onFinished(BaseRenderNodeAnimator* animator) { 41766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu if (mOneShotListener.get()) { 42766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu mOneShotListener->onAnimationFinished(animator); 43766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu mOneShotListener = nullptr; 44766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu } 45766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu} 46766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu 47766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liufloat PropertyValuesAnimatorSet::getValue(RenderNode* target) const { 48766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu return mLastFraction; 49766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu} 50766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu 51766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liuvoid PropertyValuesAnimatorSet::setValue(RenderNode* target, float value) { 52766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu mLastFraction = value; 53766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu} 54766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu 55766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liuvoid PropertyValuesAnimatorSet::onPlayTimeChanged(nsecs_t playTime) { 56766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu for (size_t i = 0; i < mAnimators.size(); i++) { 57766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu mAnimators[i]->setCurrentPlayTime(playTime); 58766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu } 59766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu} 60766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu 61766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liuvoid PropertyValuesAnimatorSet::reset() { 62766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu // TODO: implement reset through adding a play state because we need to support reset() even 63766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu // during an animation run. 64766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu} 65766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu 66766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liuvoid PropertyValuesAnimatorSet::start(AnimationListener* listener) { 67766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu init(); 68766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu mOneShotListener = listener; 69766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu BaseRenderNodeAnimator::start(); 70766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu} 71766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu 72766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liuvoid PropertyValuesAnimatorSet::reverse(AnimationListener* listener) { 73766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu// TODO: implement reverse 74766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu} 75766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu 76766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liuvoid PropertyValuesAnimatorSet::init() { 77766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu if (mInitialized) { 78766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu return; 79766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu } 80766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu nsecs_t maxDuration = 0; 81766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu for (size_t i = 0; i < mAnimators.size(); i++) { 82766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu if (maxDuration < mAnimators[i]->getTotalDuration()) { 83766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu maxDuration = mAnimators[i]->getTotalDuration(); 84766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu } 85766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu } 86766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu mDuration = maxDuration; 87766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu mInitialized = true; 88766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu} 89766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu 90766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liuuint32_t PropertyValuesAnimatorSet::dirtyMask() { 91766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu return RenderNode::DISPLAY_LIST; 92766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu} 93766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu 94766431aa57c16ece8842287a92b2e7208e3b8ac3Doris LiuPropertyAnimator::PropertyAnimator(PropertyValuesHolder* holder, Interpolator* interpolator, 95766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu nsecs_t startDelay, nsecs_t duration, int repeatCount) 96766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu : mPropertyValuesHolder(holder), mInterpolator(interpolator), mStartDelay(startDelay), 97766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu mDuration(duration) { 98766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu if (repeatCount < 0) { 99766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu mRepeatCount = UINT32_MAX; 100766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu } else { 101766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu mRepeatCount = repeatCount; 102766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu } 103766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu mTotalDuration = ((nsecs_t) mRepeatCount + 1) * mDuration + mStartDelay; 104766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu} 105766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu 106766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liuvoid PropertyAnimator::setCurrentPlayTime(nsecs_t playTime) { 107766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu if (playTime >= mStartDelay && playTime < mTotalDuration) { 108766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu nsecs_t currentIterationPlayTime = (playTime - mStartDelay) % mDuration; 109766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu mLatestFraction = currentIterationPlayTime / (float) mDuration; 110766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu } else if (mLatestFraction < 1.0f && playTime >= mTotalDuration) { 111766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu mLatestFraction = 1.0f; 112766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu } else { 113766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu return; 114766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu } 115766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu 116766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu setFraction(mLatestFraction); 117766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu} 118766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu 119766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liuvoid PropertyAnimator::setFraction(float fraction) { 120766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu float interpolatedFraction = mInterpolator->interpolate(mLatestFraction); 121766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu mPropertyValuesHolder->setFraction(interpolatedFraction); 122766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu} 123766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu 124766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liuvoid PropertyAnimatorSetListener::onAnimationFinished(BaseRenderNodeAnimator* animator) { 125766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu mSet->onFinished(animator); 126766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu} 127766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu 128766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu} 129766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu} 130