LVGL『Page页面控件』介绍

一. LVGL GUI页面控件的概念

一个页面彼此包含两个容器:

  • 背景
  • 可滚动的顶部

二. LVGL GUI页面小部件和样式

页面的主要部分称为页面的LV_PAGE_PART_BG背景。它使用所有典型的背景样式属性。使用填充会增加侧面的空间。

可以通过LV_PAGE_PART_SCROLLABLE零件引用可滚动对象。它还使用所有典型的背景样式属性和填充来增加侧面的空间。

LV_PAGE_PART_SCROLLBAR是绘制滚动条的背景的虚拟部分。使用所有典型的背景样式属性,使用size设置滚动条的宽度,并使用pad_right和pad_bottom设置间距。

LV_PAGE_PART_EDGE_FLASH当页面无法进一步沿该方向滚动时,它也是背景的虚拟部分,在侧面绘制半圆。使用所有典型的背景属性。

三. LVGL GUI页面控件的使用

用这个函数设置页面宽度lv_obj_set_width(page, 100)

如果在页面上创建了一个子代,它将被自动移动到可滚动容器中。如果可滚动容器变大,则可以通过拖动来滚动背景(如智能手机上的列表)。

默认情况下,滚动条LV_FIT_MAX在所有方向上都适合。这意味着当子代在背景中时,可滚动大小将与背景的大小相同(减去填充)。但是,当将对象放置在背景之外时,可滚动大小将增加以使其包含其中。

1. 滚动条(Scrollbars)

可以根据以下几种策略显示滚动条:

  •     LV_SCRLBAR_MODE_OFF 从不显示滚动条
  •     LV_SCRLBAR_MODE_ON 一律显示滚动条
  •     LV_SCRLBAR_MODE_DRAG 拖动页面时显示滚动条
  •     LV_SCRLBAR_MODE_AUTO 当可滚动容器的大小足以滚动时显示滚动条
  •     LV_SCRLBAR_MODE_HIDE 暂时隐藏滚动条
  •     LV_SCRLBAR_MODE_UNHIDE 取消隐藏以前隐藏的滚动条。也恢复原始模式

滚动条显示策略可以通过以下方式更改lv_page_set_scrlbar_mode(page, SB_MODE)。默认值为LV_SCRLBAR_MODE_AUTO。

2. 胶水对象(Glue object)

通过lv_page_glue_obj(child, true)将子对象粘到页面上

3. 焦点对象(Focus object)

通过这个函数来启动获取焦点lv_page_focus(page, child, LV_ANIM_ONO/FF)

4. 手动导航(Manual navigation)

通过这两个函数来手动导航

lv_page_scroll_hor(page, dist)

lv_page_scroll_ver(page, dist)

5. 边缘闪烁(Edge flash)

通过这个函数来开启边缘闪烁lv_page_set_edge_flash(list, en)

6. 滚动传播(Scroll propagation)

如果页面是在另一个可滚动元素(如另一个页面)上创建的,并且该页面无法进一步滚动,则滚动可以传播到父对象,以继续在父对象上滚动。通过这个函数设置lv_page_set_scroll_propagation(list, true)

7. 清空界面(Clean the page)

通过这个函数清空界面lv_page_clean(page)

8. 滚动函数(Scrollable API)

  • lv_page_get_scrl()

  • lv_page_set_scrl_fit/fint2/fit4()

  • lv_page_set_scrl_width()

  • lv_page_set_scrl_height()

  • lv_page_set_scrl_fit_width()

  • lv_page_set_scrl_fit_height()

  • lv_page_set_scrl_layout()

好了,完结了,更多精彩继续戳↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

### 实现 LVGL 中的页面切换及控件动态更新 在 LVGL 应用程序中,为了实现高效且响应迅速的用户界面,通常会采用分页的方式管理不同的功能模块。每一页代表一个独立的功能区域或视图,当用户导航至新页面时,旧页面会被隐藏并清理其占用的资源。 #### 使用链表管理页面及其 ID 创建一个多页面管理系统的一个方法是利用链表来追踪各个页面的状态和位置。每当新增加一个页面实例化时赋予唯一的标识符(ID),这有助于快速定位特定页面以便进行操作如显示、隐藏或是销毁等[^2]。 ```c typedef struct Page { lv_obj_t *root; /* 页面根对象 */ int id; /* 唯一编号 */ struct Page *next; } page_t; page_t* create_page(int new_id, const char* title){ static page_t head = {NULL, 0, NULL}; // 创建新的页面节点... } ``` #### 初始化与卸载页面 对于每个页面而言,都需要有对应的初始化(`init`)过程用于配置初始布局;同样也需要有一个清除(`clear`)逻辑以确保离开当前页面前释放不再使用的资源。此过程中应当注意调用`lv_obj_clean()`函数彻底移除所有子组件防止潜在泄漏问题发生[^3]。 ```c void init_page(page_t *p){ p->root = lv_cont_create(lv_scr_act(), NULL); lv_label_set_text_static(p->title, "Page Title"); } void clear_page(page_t *p){ if (p && p->root != NULL) { lv_obj_del(p->root); p->root = NULL; } } ``` #### 添加动画过渡效果 为了让用户的体验更佳友好,在两个页面之间切换的时候加入一些简单的转场特效是非常必要的。可以通过定义`lv_anim_t`类型的变量指定想要达到的效果比如滑动、缩放或者是淡入淡出等形式,并将其绑定给目标容器完成平滑过渡[^1]。 ```c static void animate_in(lv_obj_t *obj){ lv_anim_t a; lv_anim_init(&a); lv_anim_set_var(&a, obj); lv_anim_set_time(&a, 500); lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)lv_obj_set_y); lv_anim_set_values(&a, LV_VER_RES, 0); lv_anim_start(&a); } ``` #### 构建页面切换接口 最后一步就是封装好对外暴露的方法供外部调用了——即提供一套API让用户能够方便地请求跳转到其他页面的同时触发相应的进入/退出动作。这里假设已经存在了一个全局列表保存着所有的可用选项,则只需要遍历查找匹配项再执行相应命令即可。 ```c int switch_to_page_by_id(int target_id){ page_t *current = find_page(target_id); if (!current || !current->root) return -1; // 清理现有页面 clear_current_page(); // 设置新页面为主屏 lv_scr_load(current->root); // 执行入场动画 animate_in(current->root); set_current_page(current); return 0; } ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Wireless_Link

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

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

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

打赏作者

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

抵扣说明:

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

余额充值