LVGL V7.11版本 用 group实现 按键 切换 焦点控件,并且高亮焦点控件
在 LVGL (Light and Versatile Graphics Library) 中,使用 group
来实现按键切换焦点控件并高亮显示焦点控件的功能,可以通过以下步骤来实现。以下是一个简单的示例代码,展示了如何使用 LVGL V7.11 版本来实现这个功能。
#include "lvgl/lvgl.h"
static lv_group_t * group;
static void create_ui(void) {
// 创建一个屏幕
lv_obj_t * scr = lv_obj_create(NULL);
lv_scr_load(scr);
// 创建一个按钮组
group = lv_group_create();
// 创建几个按钮
for (int i = 0; i < 3; i++) {
lv_obj_t * btn = lv_btn_create(scr);
lv_obj_set_size(btn, 100, 50);
lv_obj_align(btn, LV_ALIGN_CENTER, 0, (i - 1) * 60);
lv_obj_set_event_cb(btn, NULL); // 可以设置按钮事件
// 创建按钮标签
lv_obj_t * label = lv_label_create(btn);
lv_label_set_text(label, "Button");
lv_obj_center(label);
// 将按钮添加到组中
lv_group_add_obj(group, btn);
}
// 设置默认焦点
lv_group_set_editing(group, true);
lv_group_focus_obj(lv_group_get_next_obj(group, NULL));
}
static void keyboard_event_cb(lv_event_t * e) {
lv_event_code_t code = lv_event_get_code(e);
if (code == LV_EVENT_KEY) {
lv_keycode_t key = lv_event_get_key(e);
if (key == LV_KEY_RIGHT) {
lv_group_focus_next(group);
} else if (key == LV_KEY_LEFT) {
lv_group_focus_prev(group);
}
}
}
static void highlight_focused_obj(void) {
lv_obj_t * focused = lv_group_get_focused(group);
if (focused) {
// 高亮显示焦点控件
lv_obj_set_style_bg_color(focused, lv_color_hex(0x00FF00), 0); // 绿色背景
lv_obj_set_style_border_color(focused, lv_color_hex(0xFF0000), 0); // 红色边框
}
}
void lv_ex_group(void) {
create_ui();
// 注册键盘事件
lv_indev_t * indev = lv_indev_get_next(NULL);
lv_indev_set_event_cb(indev, keyboard_event_cb);
// 定时器或循环中调用高亮函数
while (1) {
highlight_focused_obj();
lv_task_handler(); // 处理 LVGL 任务
lv_tick_inc(5); // 增加 LVGL 的时间
}
}
create_ui
函数创建了一个屏幕和三个按钮,并将它们添加到一个组中。keyboard_event_cb
函数处理键盘事件,允许用户通过左右箭头键在按钮之间切换焦点。highlight_focused_obj
函数检查当前焦点控件,并为其设置背景色和边框颜色,以实现高亮效果。lv_ex_group
函数中,创建 UI 后,进入一个循环,不断调用 highlight_focused_obj
来更新高亮状态。lv_task_handler()
和 lv_tick_inc()
,以保持 LVGL 的正常运行。通过以上代码,您可以实现按键切换焦点控件并高亮显示焦点控件的功能。