LVGL物理按键和动画冲突

LV_IMAGE_DECLARE(animimg001);
LV_IMAGE_DECLARE(animimg002);
LV_IMAGE_DECLARE(animimg003);

static const lv_image_dsc_t * anim_imgs[3] = {
    & animimg001,
    & animimg002,
    & animimg003,
};

int main(int argc, char *argv[])
{
    lv_init();

    lv_display_t * disp = lv_linux_fbdev_create();
    lv_linux_fbdev_set_file(disp, "/dev/fb0");
    
    indev_keypad = lv_indev_create();
    lv_indev_set_type(indev_keypad, LV_INDEV_TYPE_KEYPAD);
    lv_indev_set_read_cb(indev_keypad, keypad_read);

    group = lv_group_create();
    lv_indev_set_group(indev_keypad, group);	//将组绑定到输入设备

    lv_obj_t * animimg0 = lv_animimg_create(lv_screen_active());
    lv_obj_center(animimg0);
    lv_animimg_set_src(animimg0, (const void **) anim_imgs, 3);
    lv_animimg_set_duration(animimg0, 1000);
    lv_animimg_set_repeat_count(animimg0, LV_ANIM_REPEAT_INFINITE);
    lv_animimg_start(animimg0);

    /*Handle LVGL tasks*/
    while(1) {
        lv_timer_handler();
        usleep(5000);
    }
}

在上面的代码中 如果不执行

indev_keypad = lv_indev_create();
lv_indev_set_type(indev_keypad, LV_INDEV_TYPE_KEYPAD);
lv_indev_set_read_cb(indev_keypad, keypad_read);

group = lv_group_create();
lv_indev_set_group(indev_keypad, group);	//将组绑定到输入设备

这部分代码,则动画正常播放,但如果执行了这段代码,就会导致动画无法自动播放。实际的效果是,物理键盘每次按键,动画图片才会切换一张。这是为什么? 有什么解决办法?

lv_animimg 默认不响应输入设备的请求,但是你的使用了输入设备之后就卡住,那很明显你对应的驱动代码有问题,你现在的问题是应该整个LVGL都被阻塞住了,如果是这样,那么问题出在 lv_indev_set_read_cb(indev_keypad, keypad_read); 中指定的回调函数中。

同意您前面的说法,但后面整个LVGL被阻塞?回调函数? 实际上我这边测试发现,不只是动画还有switch开关,点击按键后它可以左右滑动,但从外表看并没有看到他背景的改变。所以又没有可能是动画或者说界面的更新和按键读取这两个按键读取优先级高? 导致界面无法更新?

这里如果动画自动播放的话会播放上面的三个图片,但实际上按照这个代码执行后的效果反而是每次按键会显示一个图片,所以可能是键盘导致LVGL阻塞?

调试看看是不是卡在 keypad_read 函数中

嗯,找到了,是获取键值的函数出现了问题。具体原因我再看看。