/* * Copyright (C) 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include "Animator.h" #include "Interpolator.h" #include "PropertyValuesHolder.h" namespace android { namespace uirenderer { class PropertyAnimator { public: PropertyAnimator(PropertyValuesHolder* holder, Interpolator* interpolator, nsecs_t startDelay, nsecs_t duration, int repeatCount, RepeatMode repeatMode); void setCurrentPlayTime(nsecs_t playTime); nsecs_t getTotalDuration() { return mTotalDuration; } // fraction range: [0, 1], iteration range [0, repeatCount] void setFraction(float fraction, long iteration); private: std::unique_ptr mPropertyValuesHolder; std::unique_ptr mInterpolator; nsecs_t mStartDelay; nsecs_t mDuration; uint32_t mRepeatCount; nsecs_t mTotalDuration; RepeatMode mRepeatMode; double mLatestFraction = 0; }; // TODO: This class should really be named VectorDrawableAnimator class ANDROID_API PropertyValuesAnimatorSet : public BaseRenderNodeAnimator { public: friend class PropertyAnimatorSetListener; PropertyValuesAnimatorSet(); void start(AnimationListener* listener); void reverse(AnimationListener* listener); virtual void reset() override; virtual void end() override; void addPropertyAnimator(PropertyValuesHolder* propertyValuesHolder, Interpolator* interpolators, int64_t startDelays, nsecs_t durations, int repeatCount, RepeatMode repeatMode); virtual uint32_t dirtyMask(); bool isInfinite() { return mIsInfinite; } void setVectorDrawable(VectorDrawableRoot* vd) { mVectorDrawable = vd; } VectorDrawableRoot* getVectorDrawable() const { return mVectorDrawable.get(); } AnimationListener* getOneShotListener() { return mOneShotListener.get(); } void clearOneShotListener() { mOneShotListener = nullptr; } uint32_t getRequestId() const { return mRequestId; } protected: virtual float getValue(RenderNode* target) const override; virtual void setValue(RenderNode* target, float value) override; virtual void onPlayTimeChanged(nsecs_t playTime) override; private: void init(); void onFinished(BaseRenderNodeAnimator* animator); // Listener set from outside sp mOneShotListener; std::vector > mAnimators; float mLastFraction = 0.0f; bool mInitialized = false; sp mVectorDrawable; bool mIsInfinite = false; // This request id gets incremented (on UI thread only) when a new request to modfiy the // lifecycle of an animation happens, namely when start/end/reset/reverse is called. uint32_t mRequestId = 0; }; class PropertyAnimatorSetListener : public AnimationListener { public: explicit PropertyAnimatorSetListener(PropertyValuesAnimatorSet* set) : mSet(set) {} virtual void onAnimationFinished(BaseRenderNodeAnimator* animator) override; private: PropertyValuesAnimatorSet* mSet; }; } // namespace uirenderer } // namespace android