lvgl 9.3.0
要求:因为项目需求,需要在嵌入板上展示gif图片作为表情,在当前gif播放完成后,切换到下一个表情
实现逻辑:
1、使用lv_gif_set_src(gif, ASSETS "1.gif")设置要显示的图片
2、lv_gif_set_loop_count(gif, 1),设置gif只播放一边
3、lv_obj_add_event_cb(gif, gif_cb_handle, LV_EVENT_READY),设置READY事件回调
4、在gif_cb_handle函数中,再通过lv_gif_set_src来切换下一张图片。
出现问题:
gif_cb_handle确实会被回调,并且其中也正常调用了lv_gif_set_src来切换图片,但是屏幕显示没有任何反应。
修改:
修改next_frame_task_cb函数中,当判断到没有下一帧时,if中的逻辑,调换lv_timer_pause(t) 和 lv_obj_send_event两行的顺序即可。如图:
原理解释:当gif显示到最后一针时,即函数gd_get_frame的返回为0时,会进入到if (has_next == 0) 的分支中;原代码是先执行lv_obj_send_event(obj, LV_EVENT_READY, NULL),再执行lv_timer_pause(t),因为在lv_obj_send_event(LV_EVENT_READY)时,gif的回调gif_cb_handle会执行,在其中执行了lv_gif_set_src切换图片,lv_gif_set_src的最后会执行lv_timer_resume,这个函数会让gif的定时回调继续执行;但是当回调执行完成,返回到next_frame_task_cb后,lv_obj_send_event执行返回时,下一行调用了lv_timer_pause(t),让gif的定时回调暂停了,那么就会导致第二张gif的事件回调不会再执行,也就是虽然你切换了图片,但实际上切换后的图片是出于暂停状态;因此需要将lv_obj_send_event和lv_timer_pause进程调换位置即可。