LVGL V7.11版本 用 group实现 按键 切换 焦点控件的实现
在 LVGL (Light and Versatile Graphics Library) 中,使用 group
来实现按键切换焦点控件的功能是一个常见的需求。以下是一个简单的示例,展示如何在 LVGL v7.11 中使用 group
来实现这一功能。
#include "lvgl/lvgl.h"
static lv_group_t * group;
void create_ui(void) {
/* 创建一个新的组 */
group = lv_group_create();
/* 创建一些按钮 */
lv_obj_t * btn1 = lv_btn_create(lv_scr_act(), NULL);
lv_obj_set_size(btn1, 100, 50);
lv_obj_align(btn1, NULL, LV_ALIGN_IN_TOP_LEFT, 10, 10);
lv_obj_set_event_cb(btn1, btn_event_handler);
lv_label_set_text(lv_label_create(btn1, NULL), "Button 1");
lv_obj_t * btn2 = lv_btn_create(lv_scr_act(), NULL);
lv_obj_set_size(btn2, 100, 50);
lv_obj_align(btn2, NULL, LV_ALIGN_IN_TOP_LEFT, 10, 70);
lv_obj_set_event_cb(btn2, btn_event_handler);
lv_label_set_text(lv_label_create(btn2, NULL), "Button 2");
lv_obj_t * btn3 = lv_btn_create(lv_scr_act(), NULL);
lv_obj_set_size(btn3, 100, 50);
lv_obj_align(btn3, NULL, LV_ALIGN_IN_TOP_LEFT, 10, 130);
lv_obj_set_event_cb(btn3, btn_event_handler);
lv_label_set_text(lv_label_create(btn3, NULL), "Button 3");
/* 将按钮添加到组中 */
lv_group_add_obj(group, btn1);
lv_group_add_obj(group, btn2);
lv_group_add_obj(group, btn3);
/* 设置初始焦点 */
lv_group_set_editing(group, true);
lv_group_focus_obj(btn1);
}
void btn_event_handler(lv_obj_t * btn, lv_event_t event) {
if (event == LV_EVENT_CLICKED) {
/* 处理按钮点击事件 */
const char * label = lv_label_get_text(lv_obj_get_child(btn, NULL));
printf("%s clicked\n", label);
}
}
void keyboard_event_handler(lv_obj_t * keyboard, lv_event_t event) {
if (event == LV_EVENT_VALUE_CHANGED) {
const char * key = lv_keyboard_get_value(keyboard);
if (strcmp(key, "up") == 0) {
lv_group_focus_prev(group);
} else if (strcmp(key, "down") == 0) {
lv_group_focus_next(group);
}
}
}
int main(void) {
/* 初始化 LVGL */
lv_init();
/* 创建 UI */
create_ui();
/* 创建一个虚拟键盘 */
lv_obj_t * keyboard = lv_keyboard_create(lv_scr_act(), NULL);
lv_obj_set_event_cb(keyboard, keyboard_event_handler);
/* 进入主循环 */
while (1) {
lv_task_handler();
usleep(5000); // 适当的延时
}
return 0;
}
lv_group_create()
创建一个新的组。lv_group_add_obj()
将按钮添加到组中。lv_group_focus_obj()
设置初始焦点。keyboard_event_handler
中处理键盘事件,使用 lv_group_focus_prev()
和 lv_group_focus_next()
切换焦点。lv_task_handler()
来处理 LVGL 的任务。