mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2026-02-02 00:51:10 +00:00
lottie/example : added segmented animation support in lottieview
Change-Id: I7af3109576217e3b92a6a6d9fd9492b5fb4c6bcb
This commit is contained in:
committed by
Subhransu Mohanty
parent
4d4fa29212
commit
bc2b2b8936
@@ -58,6 +58,8 @@ main(void)
|
||||
view->setPos(0, 0);
|
||||
view->setSize(800, 800);
|
||||
view->show();
|
||||
view->setMinProgress(0.5);
|
||||
view->setMaxProgress(0.0);
|
||||
view->play();
|
||||
view->loop(true);
|
||||
view->setRepeatMode(LottieView::RepeatMode::Reverse);
|
||||
|
||||
@@ -24,11 +24,9 @@ static Eina_Bool
|
||||
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;
|
||||
@@ -307,10 +305,8 @@ void LottieView::seek(float pos)
|
||||
{
|
||||
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;
|
||||
@@ -427,9 +423,8 @@ void LottieView::play()
|
||||
{
|
||||
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;
|
||||
@@ -460,8 +455,7 @@ void LottieView::restart()
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -35,6 +35,7 @@
|
||||
#include "lottieanimation.h"
|
||||
#include "lottieanimation_capi.h"
|
||||
#include<future>
|
||||
#include <cmath>
|
||||
class LottieView
|
||||
{
|
||||
public:
|
||||
@@ -66,7 +67,34 @@ 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 *);
|
||||
@@ -92,11 +120,14 @@ public:
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user