ESP32 LVGL 四、实战 容器+页 响应三键输入设备
·
容器加页 UI
void l_swview(void)
{
lv_obj_t *cont = lv_obj_create(lv_screen_active());
lv_obj_set_size(cont, LV_PCT(100), LV_PCT(100));
lv_obj_set_layout(cont, LV_LAYOUT_NONE);
g = lv_group_create();
lv_indev_set_group(mydev, g);
lv_group_set_wrap(g, true);
for (uint8_t i = 0; i < 5; i++) {
icon_page[i] = lv_obj_create(cont);
lv_obj_set_size(icon_page[i], LV_PCT(100), LV_PCT(100));
/* 关键:第 0 页先显示,其余隐藏 */
if (i == 0)
lv_obj_clear_flag(icon_page[i], LV_OBJ_FLAG_HIDDEN);
else
lv_obj_add_flag(icon_page[i], LV_OBJ_FLAG_HIDDEN);
icon_label[i] = lv_label_create(icon_page[i]);
lv_obj_set_style_text_color(icon_label[i], lv_color_make(0x1F, 0x00, 0x00), 0);
lv_obj_center(icon_label[i]);
lv_group_add_obj(g, icon_label[i]);
lv_obj_add_event_cb(icon_label[i], enc_event_cb, LV_EVENT_KEY, NULL);
lv_obj_set_style_text_font(icon_label[i], &lv_font_montserrat_28, 0); // 28 px
char l_buf[12];
lv_snprintf(l_buf, sizeof(l_buf), "%u", i);
lv_label_set_text(icon_label[i], l_buf);
}
}
对象回调
static void enc_event_cb(lv_event_t * e)
{
lv_obj_t * label = lv_event_get_target(e); // 当前聚焦的标签
uint32_t idx = 0;
/* 通过用户数据或遍历找到序号,这里简单遍历 */
for(; idx < 5; ++idx) if(icon_label[idx] == label) break;
if(idx >= 5) return;
uint32_t key = lv_event_get_key(e); // LV_KEY_LEFT / RIGHT
if(key == LV_KEY_RIGHT){
if(idx < 4) show_page(idx + 1);
}else if(key == LV_KEY_LEFT){
if(idx > 0) show_page(idx - 1);
}
if (key == LV_KEY_ENTER)
{
label_show(idx, "Pressed Enter");
}
}
show_page实现
static void show_page(uint8_t idx)
{
if(idx >= 5) return;
for(uint8_t i = 0; i < 5; ++i){
if(i == idx) lv_obj_clear_flag(icon_page[i], LV_OBJ_FLAG_HIDDEN);
else lv_obj_add_flag (icon_page[i], LV_OBJ_FLAG_HIDDEN);
}
page_cur = idx;
/* 把编码器焦点强制给新页里的标签,否则组焦点会丢失 */
lv_group_focus_obj(icon_label[idx]);
}
更多推荐
所有评论(0)