lvgl 动态创建控件

在前端开发中会有静态资源这一说法,其包含了静态页面以及css样式、图片等等。而在使用lvgl开发页面时,也可以实现类似的静态写法。它可以使页面的加载更快,页面信息也更快展现给用户。

但是这种写法会使内存占用更多,因其需要缓存页面。还有一种写法就是静态和动态相结合的写法。

在lvgl的页面也有生命周期这一说法,lvgl 页面生命周期介绍。所以可以在页面初始化的时候创建控件,在页面卸载的时候清除对应的控件。对于一些不依赖后台数据的控件就默认写死在静态页面上,对于需要根据后台数据更新的控件就可以动态创建。

其效果如下:

源码:

lv_obj_t * ui_main;
void createButton (void)
{
    lv_obj_t * btn1 = lv_btn_create(ui_main);
    lv_obj_center(btn1);

    lv_obj_t * label2 = lv_label_create(btn1);
    lv_label_set_text(label2, "button");
    lv_obj_center(label2);
}

void init (lv_event_t * e)
{
    lv_event_code_t code = lv_event_get_code(e);
    if (code == LV_EVENT_SCREEN_LOAD_START)
    {
        createButton(); // 页面加载时创建 button
    } else
<think>嗯,用户询问的是在LVGL中隐藏控件的方法。从用户的问题和提供的引用来看,用户可能正在开发嵌入式GUI界面,需要动态控制控件的可见性。这在实际项目中很常见,比如根据系统状态切换不同界面元素。 用户提供的三个引用都直接相关: 引用[1]展示了使用lv_obj_add_flag()和lv_obj_clear_flag()控制隐藏状态的标准做法,这是最核心的解决方案 引用[2]提到了动态创建控件的生命周期管理,暗示隐藏操作可能涉及资源优化 引用[3]则说明了隐藏控件的典型使用场景,帮助理解设计意图 考虑到用户是开发者,应该需要明确的代码示例和原理说明。准备分三个部分回答: 1. 基础方法:直接使用标志位操作,这是LVGL官方推荐方式 2. 补充方案:通过透明度和尺寸调整的替代方案,应对特殊场景 3. 注意事项:包括重绘时机、布局影响等实际开发中容易踩的坑 特别要强调LV_OBJ_FLAG_HIDDEN和LV_OBJ_FLAG_HIDDEN的区别,前者完全移除渲染而后者保留布局空间,这个区别在复杂界面布局中至关重要。代码示例会使用用户引用中出现的guider_ui结构体,保持上下文一致性。 最后生成的问题延伸了控件生命周期管理和高级隐藏技巧,这些都是实际项目中的常见需求。比如"临时隐藏时如何保持布局"这个问题,就来源于引用[3]提到的"不想让组件显示但需要保留占位空间"的场景。</think>在LVGL中隐藏控件主要通过以下两种方法实现: ### 1. 使用标志位隐藏控件(推荐) ```c // 隐藏控件(移除渲染和事件响应) lv_obj_add_flag(your_obj, LV_OBJ_FLAG_HIDDEN); // 重新显示控件 lv_obj_clear_flag(your_obj, LV_OBJ_FLAG_HIDDEN); ``` * **原理**:通过添加/清除 `LV_OBJ_FLAG_HIDDEN` 标志位控制渲染管线 * **特点**: - 完全从渲染队列中移除控件 - 不参与布局计算(隐藏后相邻控件会自动填充其位置) - 节省系统资源[^2] ### 2. 透明度控制(替代方案) ```c // 设置完全透明(视觉隐藏但仍占用布局空间) lv_obj_set_style_opa(your_obj, LV_OPA_TRANSP, 0); // 恢复显示 lv_obj_set_style_opa(your_obj, LV_OPA_COVER, 0); ``` * **适用场景**: - 需要保留控件布局占位时 - 实现淡入淡出动画效果 ### 关键注意事项 1. **布局影响**:使用 `HIDDEN` 标志会触发自动布局重组,而透明度方案保持原布局 2. **事件处理**:隐藏的控件不响应输入事件,透明控件仍可接收事件 3. **重绘优化**:调用 `lv_obj_refr_layout(lv_scr_act())` 强制更新布局[^1] 4. **对象生命周期**:动态创建控件需在页面卸载时手动删除[^2] > 示例:切换音乐播放界面元素 > ```c > // 隐藏播放容器 > lv_obj_add_flag(guider_ui.screen_music_cont_music, LV_OBJ_FLAG_HIDDEN); > // 显示提示容器 > lv_obj_clear_flag(guider_ui.screen_music_cont_tip, LV_OBJ_FLAG_HIDDEN); > ```[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值