1
0
mirror of https://github.com/lvgl/lvgl.git synced 2025-01-28 07:03:00 +08:00

fix(anim): fix the problem that the animation time is shortened #3572 (#3626)

fixes #3572

Signed-off-by: qinshijing <qinshijing@xiaomi.com>
Co-authored-by: qinshijing <qinshijing@xiaomi.com>
This commit is contained in:
qinshijing 2022-08-29 01:56:43 +08:00 committed by GitHub
parent fd331980bb
commit d0191a6e7b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 4 additions and 8 deletions

View File

@ -36,7 +36,6 @@ static void anim_ready_handler(lv_anim_t * a);
/**********************
* STATIC VARIABLES
**********************/
static uint32_t last_timer_run;
static bool anim_list_changed;
static bool anim_run_round;
static lv_timer_t * _lv_anim_tmr;
@ -81,11 +80,6 @@ lv_anim_t * lv_anim_start(const lv_anim_t * a)
/*Do not let two animations for the same 'var' with the same 'exec_cb'*/
if(a->exec_cb != NULL) lv_anim_del(a->var, a->exec_cb); /*exec_cb == NULL would delete all animations of var*/
/*If the list is empty the anim timer was suspended and it's last run measure is invalid*/
if(_lv_ll_is_empty(&LV_GC_ROOT(_lv_anim_ll))) {
last_timer_run = lv_tick_get();
}
/*Add the new animation to the animation linked list*/
lv_anim_t * new_anim = _lv_ll_ins_head(&LV_GC_ROOT(_lv_anim_ll));
LV_ASSERT_MALLOC(new_anim);
@ -95,6 +89,7 @@ lv_anim_t * lv_anim_start(const lv_anim_t * a)
lv_memcpy(new_anim, a, sizeof(lv_anim_t));
if(a->var == a) new_anim->var = new_anim;
new_anim->run_round = anim_run_round;
new_anim->last_timer_run = lv_tick_get();
/*Set the start value*/
if(new_anim->early_apply) {
@ -352,7 +347,6 @@ static void anim_timer(lv_timer_t * param)
{
LV_UNUSED(param);
uint32_t elaps = lv_tick_elaps(last_timer_run);
/*Flip the run round*/
anim_run_round = anim_run_round ? false : true;
@ -360,6 +354,8 @@ static void anim_timer(lv_timer_t * param)
lv_anim_t * a = _lv_ll_get_head(&LV_GC_ROOT(_lv_anim_ll));
while(a != NULL) {
uint32_t elaps = lv_tick_elaps(a->last_timer_run);
a->last_timer_run = lv_tick_get();
/*It can be set by `lv_anim_del()` typically in `end_cb`. If set then an animation delete
* happened in `anim_ready_handler` which could make this linked list reading corrupt
* because the list is changed meanwhile
@ -408,7 +404,6 @@ static void anim_timer(lv_timer_t * param)
a = _lv_ll_get_next(&LV_GC_ROOT(_lv_anim_ll), a);
}
last_timer_run = lv_tick_get();
}
/**

View File

@ -93,6 +93,7 @@ typedef struct _lv_anim_t {
uint8_t early_apply : 1; /**< 1: Apply start value immediately even is there is `delay`*/
/*Animation system use these - user shouldn't set*/
uint32_t last_timer_run;
uint8_t playback_now : 1; /**< Play back is in progress*/
uint8_t run_round : 1; /**< Indicates the animation has run in this round*/
uint8_t start_cb_called : 1; /**< Indicates that the `start_cb` was already called*/