对于键盘/按键驱动的菜单,LVGL 社区和官方例子里最常用的就是 lv_list + Group 焦点 + 动态页面。没有其他内置控件更适合这个场景。

输入事件和组

lv_indev_drv_t indev_drv;
lv_indev_drv_init(&indev_drv);
indev_drv.type = LV_INDEV_TYPE_KEYPAD;
indev_drv.read_cb = evdev_read;
lv_indev_t *indev_t = lv_indev_drv_register(&indev_drv);
lv_group_t *g = lv_group_create(); //创建组
lv_indev_set_group(indev_t, g); //与输入事件绑定

list列表

lv_obj_t * list = lv_list_create(lv_scr_act());
lv_obj_set_size(list, LV_HOR_RES, LV_VER_RES);

lv_obj_t * btn_settings = lv_list_add_btn(list,NULL,"settings");
lv_obj_t * btn_language = lv_list_add_btn(list,NULL,"language");
lv_obj_t * btn_light = lv_list_add_btn(list,NULL,"light");
lv_obj_t * btn_about = lv_list_add_btn(list,NULL,"about");

lv_group_add_obj(g, btn_settings);
lv_group_add_obj(g, btn_language);
lv_group_add_obj(g, btn_light);
lv_group_add_obj(g, btn_about);

lv_obj_add_event_cb(btn_settings,ok_cb,LV_EVENT_CLICKED,NULL);
lv_obj_add_event_cb(btn_language,ok_cb,LV_EVENT_CLICKED,NULL);
lv_obj_add_event_cb(btn_light,ok_cb,LV_EVENT_CLICKED,NULL);
lv_obj_add_event_cb(btn_about,ok_cb,LV_EVENT_CLICKED,NULL);

按钮回调函数

void ok_cb(lv_event_t *e)
{
    lv_obj_t *btn = lv_event_get_target(e);
    const char *txt = lv_list_get_btn_text(lv_obj_get_parent(btn),btn);
    printf("clicked: %s\n", txt);
}