| /* | |
| * 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<PropertyValuesHolder> mPropertyValuesHolder; | |
| std::unique_ptr<Interpolator> 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 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<AnimationListener> mOneShotListener; | |
| std::vector<std::unique_ptr<PropertyAnimator> > mAnimators; | |
| float mLastFraction = 0.0f; | |
| bool mInitialized = false; | |
| sp<VectorDrawableRoot> 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 |