feat(rlottie): add animation control options (#2857)

* Add support for ARGB32 to RGBA5658 format conversion required by LVGL

* Add animation control for rlottie animation

* Add support for composable play control and event sending upon reaching end of animation.

* Add protection against multiple event posting upon animation ending

* Actually pause the timer is the animation is paused. Resume on playing again.

* Improve documentation for the additional features

* Stop the timer if not looping and we've reached the end of the animation in the provided direction

* Fix various defects and improve documentation

* Add support for swapped RGB565 format too

* Let pause actually pause without messing the current frame index in the animation.

* Set invalid destination frame upon construction so it's possible to pause from frame 0.

* Set impossible destination frame index 

So it's updated on first pause
This commit is contained in:
X-Ryl669
2021-12-03 09:28:27 +01:00
committed by GitHub
parent 91fc579ee7
commit cd26e0fc2a
3 changed files with 146 additions and 8 deletions

View File

@@ -71,6 +71,30 @@ For example: https://lottiefiles.com/
You can also create your own animations with Adobe After Effects or similar software.
## Controlling animations
LVGL provides two functions to control the animation mode: `lv_rlottie_set_play_mode` and `lv_rlottie_set_current_frame`.
You'll combine your intentions when calling the first method, like in these examples:
```c
lv_obj_t * lottie = lv_rlottie_create_from_file(scr, 128, 128, "test.json");
lv_obj_center(lottie);
// Pause to a specific frame
lv_rlottie_set_current_frame(lottie, 50);
lv_rlottie_set_play_mode(lottie, LV_RLOTTIE_CTRL_PAUSE); // The specified frame will be displayed and then the animation will pause
// Play backward and loop
lv_rlottie_set_play_mode(lottie, LV_RLOTTIE_CTRL_PLAY | LV_RLOTTIE_CTRL_BACKWARD | LV_RLOTTIE_CTRL_LOOP);
// Play forward once (no looping)
lv_rlottie_set_play_mode(lottie, LV_RLOTTIE_CTRL_PLAY | LV_RLOTTIE_CTRL_FORWARD);
```
The default animation mode is **play forward with loop**.
If you don't enable looping, a `LV_EVENT_READY` is sent when the animation can not make more progress without looping.
To get the number of frames in an animation or the current frame index, you can cast the `lv_obj_t` instance to a `lv_rlottie_t` instance and inspect the `current_frame` and `total_frames` members.
## Example
```eval_rst