Skip to content

Commit b2bf3b7

Browse files
authored
feat(anim): call start callback when animation restarts (lvgl#8403)
1 parent 2bc3b08 commit b2bf3b7

File tree

3 files changed

+37
-0
lines changed

3 files changed

+37
-0
lines changed

src/misc/lv_anim.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -686,6 +686,7 @@ static void anim_completed_handler(lv_anim_t * a)
686686
else {
687687
/*Restart the animation. If the time is over a little compensate it.*/
688688
int32_t over_time = 0;
689+
a->start_cb_called = 0;
689690
if(a->act_time > a->duration) over_time = a->act_time - a->duration;
690691
a->act_time = over_time - (int32_t)(a->repeat_delay);
691692
/*Swap start and end values in reverse-play mode*/

tests/src/test_cases/test_anim.c

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,11 @@ void tearDown(void)
1818
lv_anim_enable_vsync_mode(false);
1919
}
2020

21+
static void start_cb(lv_anim_t * anim)
22+
{
23+
(*(int *)lv_anim_get_user_data(anim))++;
24+
}
25+
2126
static void exec_cb(void * var, int32_t v)
2227
{
2328
int32_t * var_i32 = var;
@@ -193,6 +198,28 @@ void test_scroll_anim_delete(void)
193198

194199
TEST_ASSERT_EQUAL(1, var);
195200
}
201+
void test_anim_start_cb_is_called(void)
202+
{
203+
int32_t var;
204+
int start_cb_call_count = 0;
205+
lv_anim_t a;
206+
lv_anim_init(&a);
207+
lv_anim_set_var(&a, &var);
208+
lv_anim_set_user_data(&a, (void *)&start_cb_call_count);
209+
lv_anim_set_start_cb(&a, start_cb);
210+
lv_anim_set_values(&a, 0, 100);
211+
lv_anim_set_exec_cb(&a, exec_cb);
212+
lv_anim_set_duration(&a, 100);
213+
lv_anim_set_repeat_count(&a, 2);
214+
lv_anim_start(&a);
215+
lv_test_wait(50);
216+
TEST_ASSERT_EQUAL(1, start_cb_call_count);
217+
lv_test_wait(100);
218+
TEST_ASSERT_EQUAL(2, start_cb_call_count);
219+
lv_test_wait(50);
220+
/*Delete the animation to avoid accessing it after return*/
221+
lv_anim_delete(&var, exec_cb);
222+
}
196223

197224
void test_anim_vsync_mode(void)
198225
{

tests/src/test_cases/test_anim_timeline.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -584,6 +584,7 @@ void test_anim_timeline_without_exec_cb_but_anim_start_cb_and_completed_cb(void)
584584
anim_timeline = lv_anim_timeline_create();
585585
lv_anim_timeline_add(anim_timeline, 200, &anim1);
586586
lv_anim_timeline_set_progress(anim_timeline, 0);
587+
lv_anim_timeline_set_repeat_count(anim_timeline, 2);
587588
lv_anim_timeline_start(anim_timeline);
588589

589590
lv_refr_now(NULL);
@@ -605,6 +606,14 @@ void test_anim_timeline_without_exec_cb_but_anim_start_cb_and_completed_cb(void)
605606
lv_test_wait(300); /*Now we are at 520ms */
606607
TEST_ASSERT_EQUAL(1, anim1_start_called);
607608
TEST_ASSERT_EQUAL(1, anim1_completed_called);
609+
610+
lv_test_wait(200); /*Now we are at 720ms */
611+
TEST_ASSERT_EQUAL(2, anim1_start_called);
612+
TEST_ASSERT_EQUAL(1, anim1_completed_called);
613+
614+
lv_test_wait(300); /*Now we are at 1020ms */
615+
TEST_ASSERT_EQUAL(2, anim1_start_called);
616+
TEST_ASSERT_EQUAL(2, anim1_completed_called);
608617
}
609618

610619
#endif

0 commit comments

Comments
 (0)