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#pragma once 18766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu 19766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu#include "Animator.h" 20766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu#include "PropertyValuesHolder.h" 21766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu#include "Interpolator.h" 22766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu 23766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liunamespace android { 24766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liunamespace uirenderer { 25766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu 26766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liuclass PropertyAnimator { 27766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liupublic: 28766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu PropertyAnimator(PropertyValuesHolder* holder, Interpolator* interpolator, nsecs_t startDelay, 29f7167e8f286cff91dec01fdf617bf568f1d100e6Doris Liu nsecs_t duration, int repeatCount, RepeatMode repeatMode); 30766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu void setCurrentPlayTime(nsecs_t playTime); 31766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu nsecs_t getTotalDuration() { 32766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu return mTotalDuration; 33766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu } 34f7167e8f286cff91dec01fdf617bf568f1d100e6Doris Liu // fraction range: [0, 1], iteration range [0, repeatCount] 35f7167e8f286cff91dec01fdf617bf568f1d100e6Doris Liu void setFraction(float fraction, long iteration); 36766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu 37766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liuprivate: 38766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu std::unique_ptr<PropertyValuesHolder> mPropertyValuesHolder; 39766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu std::unique_ptr<Interpolator> mInterpolator; 40766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu nsecs_t mStartDelay; 41766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu nsecs_t mDuration; 42766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu uint32_t mRepeatCount; 43766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu nsecs_t mTotalDuration; 44f7167e8f286cff91dec01fdf617bf568f1d100e6Doris Liu RepeatMode mRepeatMode; 45f7167e8f286cff91dec01fdf617bf568f1d100e6Doris Liu double mLatestFraction = 0; 46766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu}; 47766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu 48718cd3eb70703c43f29ca37907bbf0e153d8cca0Doris Liu// TODO: This class should really be named VectorDrawableAnimator 49766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liuclass ANDROID_API PropertyValuesAnimatorSet : public BaseRenderNodeAnimator { 50766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liupublic: 51766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu friend class PropertyAnimatorSetListener; 52766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu PropertyValuesAnimatorSet(); 53766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu 54766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu void start(AnimationListener* listener); 55766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu void reverse(AnimationListener* listener); 56718cd3eb70703c43f29ca37907bbf0e153d8cca0Doris Liu virtual void reset() override; 57718cd3eb70703c43f29ca37907bbf0e153d8cca0Doris Liu virtual void end() override; 58766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu 59766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu void addPropertyAnimator(PropertyValuesHolder* propertyValuesHolder, 60766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu Interpolator* interpolators, int64_t startDelays, 61f7167e8f286cff91dec01fdf617bf568f1d100e6Doris Liu nsecs_t durations, int repeatCount, RepeatMode repeatMode); 62766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu virtual uint32_t dirtyMask(); 63718cd3eb70703c43f29ca37907bbf0e153d8cca0Doris Liu bool isInfinite() { return mIsInfinite; } 64718cd3eb70703c43f29ca37907bbf0e153d8cca0Doris Liu void setVectorDrawable(VectorDrawableRoot* vd) { mVectorDrawable = vd; } 6598980cdfff34d1cace1ab60fa54e248c0ee8bc8eDoris Liu VectorDrawableRoot* getVectorDrawable() const { return mVectorDrawable.get(); } 66718cd3eb70703c43f29ca37907bbf0e153d8cca0Doris Liu AnimationListener* getOneShotListener() { return mOneShotListener.get(); } 67718cd3eb70703c43f29ca37907bbf0e153d8cca0Doris Liu void clearOneShotListener() { mOneShotListener = nullptr; } 68718cd3eb70703c43f29ca37907bbf0e153d8cca0Doris Liu uint32_t getRequestId() const { return mRequestId; } 69766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu 70766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liuprotected: 71766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu virtual float getValue(RenderNode* target) const override; 72766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu virtual void setValue(RenderNode* target, float value) override; 73766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu virtual void onPlayTimeChanged(nsecs_t playTime) override; 74766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu 75766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liuprivate: 76766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu void init(); 77766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu void onFinished(BaseRenderNodeAnimator* animator); 78766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu // Listener set from outside 79766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu sp<AnimationListener> mOneShotListener; 80766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu std::vector< std::unique_ptr<PropertyAnimator> > mAnimators; 81766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu float mLastFraction = 0.0f; 82766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu bool mInitialized = false; 8398980cdfff34d1cace1ab60fa54e248c0ee8bc8eDoris Liu sp<VectorDrawableRoot> mVectorDrawable; 84718cd3eb70703c43f29ca37907bbf0e153d8cca0Doris Liu bool mIsInfinite = false; 85718cd3eb70703c43f29ca37907bbf0e153d8cca0Doris Liu // This request id gets incremented (on UI thread only) when a new request to modfiy the 86718cd3eb70703c43f29ca37907bbf0e153d8cca0Doris Liu // lifecycle of an animation happens, namely when start/end/reset/reverse is called. 87718cd3eb70703c43f29ca37907bbf0e153d8cca0Doris Liu uint32_t mRequestId = 0; 88766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu}; 89766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu 90766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liuclass PropertyAnimatorSetListener : public AnimationListener { 91766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liupublic: 92a619ec70cf765d9166f0862e74653711b87307b3Chih-Hung Hsieh explicit PropertyAnimatorSetListener(PropertyValuesAnimatorSet* set) : mSet(set) {} 93766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu virtual void onAnimationFinished(BaseRenderNodeAnimator* animator) override; 94766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu 95766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liuprivate: 96766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu PropertyValuesAnimatorSet* mSet; 97766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu}; 98766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu 99766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu} // namespace uirenderer 100766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu} // namespace android 101