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