lvgl|让tabview的页面循环切换(无限切换)

前言

lvgl默认创建出来的tabview是不能在第一个和最后一个页面之间循环切换的。

下面的教大家怎么让tabview的页面可以循环切换,也就是:

  • 当切换到第一个页面的时候可以继续切换到最后一个页面
  • 反过来,当切换到最后一个页面的时候可以继续切换到第一个页面

实现思路

我们先要弄清楚 tabview 由哪些部分组成。
选项卡视图对象可用于组织选项卡中的内容。选项卡视图是从其他小部件构建的:

  • tabview主容器
    • 选项卡按钮
    • 选项卡的容器(页面)

选项卡按钮可以位于选项卡视图的顶部、底部、左侧和右侧,或者隐藏起来。
我们可以通过单击选项卡按钮或在选项卡容器上水平滑切换选项卡。

在这里插入图片描述

也就是当我滑动tabview中的页面(选项卡)的时候实际上是在操作tabview中的选项卡部分

所以我们可以给 tabview 中的页面(选项卡)添加一个事件处理回调函数,来完成页面的循环切换功能。

实现代码

// 为 tabview 中的页面(选项卡)部分添加事件处理回调函数
lv_obj_add_event_cb(lv_tabview_get_content(tabview), scroll_begin_event, LV_EVENT_SCROLL_END, NULL);

// 处理滚动事件,完成页面循环切换(无限切换)
static void scroll_begin_event(lv_event_t * e)
{
    lv_obj_t * cont = lv_event_get_target(e);
    lv_event_code_t code = lv_event_get_code(e);

    lv_obj_t * tv = lv_obj_get_parent(cont);

    if(lv_event_get_code(e) == LV_EVENT_SCROLL_END) {
        lv_tabview_t * tabview = (lv_tabview_t *)tv;

        lv_coord_t s = lv_obj_get_scroll_x(cont);

        lv_point_t p;
        lv_obj_get_scroll_end(cont, &p);

        lv_coord_t w = lv_obj_get_content_width(cont);
        lv_coord_t t;

        if(lv_obj_get_style_base_dir(tv, LV_PART_MAIN) == LV_BASE_DIR_RTL)  t = -(p.x - w / 2) / w;
        else t = (p.x + w / 2) / w;

        if(s < 0) t = tabview->tab_cnt - 1;
        else if((t == (tabview->tab_cnt - 1)) && (s > p.x)) t = 0;

        bool new_tab = false;
        if(t != lv_tabview_get_tab_act(tv)) new_tab = true;
        lv_tabview_set_act(tv, t, LV_ANIM_ON);
    }
}

效果

请添加图片描述

lvgl视频教程

百问网LVGL(v8)系列课程(韦东山·监制) 教程基于lvgl v8.2版本,课程适配多个平台、多款板子

百问网LVGL(v8)视频课程(韦东山·监制) 教程基于lvgl v8.2版本,课程适配多个平台、多款板子!视频学习地址:https://www.bilibili.com/video/BV1Ya411r7K2

视频教程配套资料

相关学习资源

LVGL是一款开源的图形库,可以用于嵌入式设备的图形用户界面设计。要设置LVGL的TabView页面,可以按照以下步骤进行: 1. 创建一个LVGL的TabView对象: ``` lv_obj_t* tabview = lv_tabview_create(lv_scr_act(), NULL); ``` 2. 创建Tab页面: ``` lv_obj_t* tab1 = lv_tabview_add_tab(tabview, "Tab 1"); lv_obj_t* tab2 = lv_tabview_add_tab(tabview, "Tab 2"); ``` 3. 在Tab页面中添加控件: ``` // 在Tab 1中添加一个文本标签 lv_obj_t* label1 = lv_label_create(tab1, NULL); lv_label_set_text(label1, "This is Tab 1"); // 在Tab 2中添加一个按钮 lv_obj_t* btn = lv_btn_create(tab2, NULL); lv_btn_set_fit2(btn, LV_FIT_PARENT, LV_FIT_PARENT); lv_obj_t* label2 = lv_label_create(btn, NULL); lv_label_set_text(label2, "Tab 2 Button"); ``` 4. 设置Tab页面之间的切换效果(可选): ``` lv_tabview_set_anim_time(tabview, 300); // 设置切换动画的时间 // 设置切换方向为向左切换 lv_tabview_set_anim_dir(tabview, LV_TABVIEW_ANIM_DIR_LEFT); ``` 5. 可以通过事件回调函数来处理Tab切换的逻辑(可选): ``` lv_obj_set_event_cb(tabview, tabview_event_cb); // 事件回调函数 static void tabview_event_cb(lv_obj_t* obj, lv_event_t event) { if(event == LV_EVENT_VALUE_CHANGED) { uint32_t active_tab_id = lv_tabview_get_tab_act(obj); // 获取当前激活的Tab的ID // 根据Tab的ID执行相应的操作 if(active_tab_id == 0) { // 执行Tab 1的操作 } else if(active_tab_id == 1) { // 执行Tab 2的操作 } } } ``` 通过以上步骤,就可以在LVGL中设置TabView页面了。可以自由添加不同的Tab页面,并在每个Tab页面中添加所需的控件和逻辑,实现丰富的用户界面和交互体验。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

挨踢民工biubiu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值