animator(void *data , double pos)
{
LottieView *view = static_cast<LottieView *>(data);
- float nextPos = pos + view->mStartPos;
- if (nextPos > 1.0) nextPos = 1.0;
- view->seek(nextPos);
- if (nextPos == 1.0) {
+ view->seek(pos);
+ if (pos == 1.0) {
view->mAnimator = NULL;
view->finished();
return EINA_FALSE;
{
if (!mPlayer) return;
- if (mPalying && mReverse)
- pos = 1.0 - pos;
- mPos = pos;
+ mPos = mapProgress(pos);
// check if the pos maps to the current frame
if (mCurFrame == mPlayer->frameAtPos(mPos)) return;
{
if (!mPlayer) return;
- mStartPos = mPos;
if (mAnimator) ecore_animator_del(mAnimator);
- mAnimator = ecore_animator_timeline_add(mPlayer->duration()/mSpeed, animator, this);
+ mAnimator = ecore_animator_timeline_add(duration()/mSpeed, animator, this);
mReverse = false;
mCurCount = mRepeatCount;
mPalying = true;
else
mReverse = false;
- mStartPos = 0;
if (mAnimator) ecore_animator_del(mAnimator);
- mAnimator = ecore_animator_timeline_add(mPlayer->duration()/mSpeed, animator, this);
+ mAnimator = ecore_animator_timeline_add(duration()/mSpeed, animator, this);
}
}
#include "lottieanimation.h"
#include "lottieanimation_capi.h"
#include<future>
+#include <cmath>
class LottieView
{
public:
void stop();
void render();
void initializeBufferObject(Evas *evas);
+ void setMinProgress(float progress)
+ {
+ //clamp it to [0,1]
+ mMinProgress = progress;
+ }
+ void setMaxProgress(float progress)
+ {
+ //clamp it to [0,1]
+ mMaxprogress = progress;
+ }
private:
+ float mapProgress(float progress) {
+ //clamp it to the segment
+ progress = (mMinProgress + (mMaxprogress - mMinProgress) * progress);
+
+ // currently playing and in reverse mode
+ if (mPalying && mReverse)
+ progress = mMaxprogress > mMinProgress ?
+ mMaxprogress - progress : mMinProgress - progress;
+
+
+ return progress;
+ }
+ float duration() const {
+ // usually we run the animation for mPlayer->duration()
+ // but now run animation for segmented duration.
+ return mPlayer->duration() * fabs(mMaxprogress - mMinProgress);
+ }
void createVgNode(LOTNode *node, Efl_VG *root);
void update(const std::vector<LOTNode *> &);
void updateTree(const LOTLayerNode *);
bool mRenderMode;
bool mAsyncRender;
bool mDirty;
- float mStartPos;
float mPos;
float mFrameRate;
long mTotalFrame;
std::future<lottie::Surface> mRenderTask;
+
+ //keep a segment of the animation default is [0, 1]
+ float mMinProgress{0};
+ float mMaxprogress{1};
};
class LottieViewCApi