容器加页 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]);
}

更多推荐