LVGL-lv_tileview

1 背景介绍

1.1 背景介绍

lv_tileview 是 LVGL 提供的一个特殊容器控件,用于创建一个可通过滑动手势或动画切换的多页面视图。它将多个“子页面”排列在一个二维网格中,用户可以通过上下左右滑动在这些页面间切换,就像手机主屏滑动切换桌面页面一样。

1.2 基本概念

  1. tileview 是一个容器对象,可以添加多个 “tile”(瓷砖/页面)。
  2. 每个 tile 是一个标准的 lv_obj_t,你可以往里面添加按钮、图表、图像等子控件。
  3. tileview 支持方向控制(例如只允许左右滑动,或上下左右都允许)。
  4. 页面会以滑动吸附的方式进行切换,不会卡在中间。

1.3 应用场景

  1. 主页分页 / 主屏切换
    类似 Android 桌面左右滑动切换多个主屏,每个 tile 显示不同的功能或快捷入口。

  2. 数据仪表盘
    每页一个仪表界面,如温度、湿度、电量等,适合工业设备、物联网面板(HMI)。

  3. 图片 / 相册浏览器
    每个 tile 显示一张图片,用户通过滑动浏览相册或图像列表。

  4. 多页设置菜单
    每个 tile 是一个设置分类页面(如 WiFi、亮度、声音等),支持触摸滑动切换,用户体验好。

  5. 导航类界面
    比如地图软件,或某些路径控制界面;每页对应一个功能或子模块。

  6. 数字输入或多种键盘布局
    一个 tile 是数字键盘,另一个 tile 是字母键盘。滑动切换不同输入方式。

1.4 注意事项

  1. lv_tileview 是基于滚动容器构建的,所以不能嵌套在另一个滚动容器中。

  2. 每个 tile 是一个独立的容器对象,可以像普通控件一样操作。

  3. 页面较多时建议控制每页内容复杂度,避免内存压力。

  4. 若要实现滑动后执行某些操作,可监听 LV_EVENT_SCROLL_END 事件

2 主要函数介绍

2.1 创建 tileview

这将在当前屏幕上创建一个 tileview 对象。

lv_obj_t * tv = lv_tileview_create(lv_scr_act());

在这里插入图片描述

2.2 添加 tile 页面

lv_obj_t * tile = lv_tileview_add_tile(tv, x, y, allowed_dirs);

x 和 y 是 tile 的坐标(网格中位置)
allowed_dirs 表示从这个 tile 可以滑动到哪些方向,例如 LV_DIR_HOR | LV_DIR_VER

2.2.1 水平移动

    lv_obj_t* tile1= lv_tileview_add_tile(tileview, 0, 0, LV_DIR_HOR );  // 第一个页面
    // 添加内容
    lv_obj_t* label = lv_label_create(tile1);
    lv_label_set_text(label, "first page");
    lv_obj_center(label);

    lv_obj_t* tile2=lv_tileview_add_tile(tileview, 1, 0, LV_DIR_HOR );  // 第二个页面

        // 添加内容
    label = lv_label_create(tile2);
    lv_label_set_text(label, "second page");
    lv_obj_center(label);

    lv_obj_scroll_to(tile2, 0,1, LV_ANIM_ON);

水平滑动

2.2.2 垂直移动

    lv_obj_t* tile1= lv_tileview_add_tile(tileview, 0, 0, LV_DIR_VER);  // 第一个页面
    // 添加内容
    lv_obj_t* label = lv_label_create(tile1);
    lv_label_set_text(label, "first page");
    lv_obj_center(label);

    lv_obj_t* tile2=lv_tileview_add_tile(tileview, 0, 1, LV_DIR_VER);  // 第二个页面

        // 添加内容
    label = lv_label_create(tile2);
    lv_label_set_text(label, "second page");
    lv_obj_center(label);

    lv_obj_scroll_to(tile2, 0,1, LV_ANIM_ON);

垂直移动

2.3 移动

2.3.1 手动移动

控制对象滚动条位置的函数,它可以将一个对象(如 tile 或滚动容器中的控件)滚动到特定的坐标位置,支持动画。

void lv_obj_scroll_to(lv_obj_t * obj, lv_coord_t x, lv_coord_t y, lv_anim_enable_t en);
  1. obj lv_obj_t * 目标对象- tileview
  2. x lv_coord_t 滚动条的横向目标位置(以像素为单位)
  3. y lv_coord_t 滚动条的纵向目标位置,x 和 y 是指目标控件左上角 相对于容器内容的坐标,而不是屏幕坐标。如果你不确定具体坐标,可以使用 lv_obj_scroll_to_view() 代替,自动定位。
  4. en lv_anim_enable_t 是否启用动画(LV_ANIM_ON 或 LV_ANIM_OFF)

或者使用

void lv_obj_set_tile_id(lv_obj_t * obj, uint32_t col_id, uint32_t row_id, lv_anim_enable_t anim);

参数 类型 含义
obj lv_obj_t * tileview 对象本身
col_id uint32_t 目标 tile 的列号(x方向)
row_id uint32_t 目标 tile 的行号(y方向)
anim lv_anim_enable_t 是否启用动画(LV_ANIM_ON 或 LV_ANIM_OFF)

lv_obj_scroll_to_view(tile2, LV_ANIM_ON);
lv_coord_t y = lv_obj_get_y(tile2);
lv_coord_t x = lv_obj_get_x(tile2);
lv_obj_scroll_to(tileview, 480, 0, LV_ANIM_ON);

lv_obj_set_tile_id(tileview, 1, 0, LV_ANIM_ON);  // 切换到 tile2

2.3.2 自动移动

    lv_obj_scroll_to_view(tile1, LV_ANIM_ON);

或者

void lv_obj_set_tile(lv_obj_t * tileview, lv_obj_t * tile_obj, lv_anim_enable_t anim);
lv_obj_set_tile(tileview, tile1, LV_ANIM_ON);
lv_obj_scroll_to_view(tile1, LV_ANIM_ON);

自动滑动

2.4 获取哪个页面在显示

lv_obj_t * lv_tileview_get_tile_act(lv_obj_t * tileview);

3 综合案例应用

  1. 创建 tileview 页面系统;
  2. 每个页面背景颜色不同;
  3. 第 1 页显示电子表(数字时钟)并实时更新;
  4. 第 2 页显示日期;页面可左右滑动切换;
void create_tileview_ui(void) {
    // 创建 tileview
    lv_obj_t* tileview = lv_tileview_create(lv_scr_act());

    // === Tile 1: 数字时钟 ===
    lv_obj_t* tile_clock = lv_tileview_add_tile(tileview, 0, 0, LV_DIR_HOR);
    lv_obj_set_style_bg_color(tile_clock, lv_color_hex(0x003366), 0);  // 深蓝色
    lv_obj_set_style_bg_opa(tile_clock, LV_OPA_COVER, 0);

    lv_obj_t* label_time = lv_label_create(tile_clock);
    lv_obj_set_style_text_font(label_time, &lv_font_montserrat_48, 0);
    lv_obj_center(label_time);

    // 每秒更新时间
    lv_timer_create([](lv_timer_t* t) {
        time_t rawtime;
        struct tm* timeinfo;
        time(&rawtime);
        timeinfo = localtime(&rawtime);
        static char buf[16];
        strftime(buf, sizeof(buf), "%H:%M:%S", timeinfo);
        lv_label_set_text((lv_obj_t*)t->user_data, buf);
        }, 1000, label_time);




    // === Tile 2: 日期页 ===
    lv_obj_t* tile_date = lv_tileview_add_tile(tileview, 1, 0, LV_DIR_HOR);
    lv_obj_set_style_bg_color(tile_date, lv_color_hex(0x226600), 0);  // 深绿色
    lv_obj_set_style_bg_opa(tile_date, LV_OPA_COVER, 0);

    lv_obj_t* label_date = lv_label_create(tile_date);
    lv_obj_set_style_text_font(label_date, &lv_font_montserrat_28, 0);
    lv_obj_center(label_date);

    // 设置日期文本
    time_t rawtime;
    struct tm* timeinfo;
    time(&rawtime);
    timeinfo = localtime(&rawtime);
    static char date_buf[32];
    strftime(date_buf, sizeof(date_buf), "%Y-%m-%d", timeinfo);
    lv_label_set_text(label_date, date_buf);


}

titleview综合案例

### 中望3D 创建新草图的操作方法 在中望3D中创建新草图的过程可以通过以下方式实现。具体操作涉及选择工作平面、定义草图范围以及进入编辑模式等内容。 #### 1. **选择草图的工作平面** 首先需要选定一个基准面或者已有实体表面作为草图的工作平面。这一步骤决定了后续草图的方向和位置[^4]。 如果尚未有合适的基准面,可以提前创建一个新的基准面或利用已有的三维几何体表面来完成此步骤。 #### 2. **启动草图环境** 进入草图绘制界面的方法通常有两种: - 方法一:通过菜单栏找到【草图】选项并点击【新建草图】按钮。 此外还可以结合快捷键快速调用该功能[^2]。 - 方法二:当执行某些特定命令(如全剖视图设置)时也会提示用户指定草图源文件,并自动跳转至相应编辑窗口。 #### 3. **定义草图边界条件** 草图一旦建立成功后,默认处于可编辑状态。此时可以根据实际需求绘制所需的二维图形元素,比如直线段、圆弧或其他复杂轮廓线等。值得注意的是,这些对象实际上是原始空间曲线经过投影变换后的结果形式[^1]。 #### 4. **退出与保存更改** 完成设计之后记得及时确认提交当前所做的调整动作;否则可能造成数据丢失风险。一般情况下只需简单双击鼠标右键即可返回至上一层级结构之中。 ```python # 示例代码展示如何模拟简单的交互逻辑流程 def create_new_sketch(): select_work_plane() # Step A: Select work plane for sketching. initiate_sketch_mode() # Step B: Enter into the dedicated 'Sketch' mode. draw_elements_in_2d_space() # Step C: Define required geometries within this context. finalize_and_exit() # Step D: Confirm all changes before leaving. create_new_sketch() ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

数贾电子科技

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

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

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

打赏作者

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

抵扣说明:

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

余额充值