HoloCubic 的 LVGL 模拟器 Bar 进度条控件实战:从 lv_ex_bar_1 示例读懂 lv_bar 核心机制
嵌入式物联网智能硬件嵌入式GUI硬件开发【免费下载链接】HoloCubic带网络功能的伪全息透明显示桌面站项目地址https://gitcode.com/gh_mirrors/ho/HoloCubic点击查看免费下载本篇技术指南以 HoloCubic 开源仓库中 LVGL 模拟器VS2019 SDL2 工程的lv_ex_bar_1Simple Bar示例文档为核心系统讲解 LVGL v7 Bar 进度条控件的创建、取值、动画与样式原理。你将掌握lv_bar的完整 API 用法、动画状态机与绘制机制的源码级实现并学会如何在 LvglSimulator 模拟器工程 与 HoloCubic 固件 中直接运行和复用该示例为后续在伪全息桌面站界面上开发音量、电量、网络信号等进度类控件打下基础。lv_ex_bar_1 示例渲染结果320x240 模拟窗口屏幕中央一条填满的进度条一、示例文档与工程背景关联文档位于 3.Software/LvglSimulator/vs2019_proj/lv_examples/src/lv_ex_widgets/lv_ex_bar/index.rst属于 LVGL 官方示例体系lv_examples中lv_ex_widgets目录下的控件示例索引。文档本身极为精炼C 示例入口为lv_ex_widgets/lv_ex_bar/lv_ex_bar_1文档末尾的 MicroPython 小节标注 No examples yet。需要说明的是仓库中实际已经存在 MicroPython 版示例 lv_ex_bar_1.py可以推断该文档的 MicroPython 小节更新滞后于代码。下文将 C 与 MicroPython 两个版本一并展开。二、Simple Bar 示例C 语言版本逐行解析示例核心源码为 lv_ex_bar_1.c全文如下#include ../../../lv_examples.h #if LV_USE_BAR void lv_ex_bar_1(void) { lv_obj_t * bar1 lv_bar_create(lv_scr_act(), NULL); lv_obj_set_size(bar1, 200, 20); lv_obj_align(bar1, NULL, LV_ALIGN_CENTER, 0, 0); lv_bar_set_anim_time(bar1, 2000); lv_bar_set_value(bar1, 100, LV_ANIM_ON); } #endif逐行拆解条件编译#if LV_USE_BAR保证只有当 lv_conf.h 中LV_USE_BAR置 1 时才编译此示例模拟器工程中该宏位于lv_conf.h第 579 行值为 1。创建控件lv_bar_create(lv_scr_act(), NULL)以当前屏幕对象为父对象创建一个 Bar。第二个参数copy为NULL表示不复制已有 Bar而是新建默认实例。设置尺寸lv_obj_set_size(bar1, 200, 20)将 Bar 设为 200×20 像素宽大于高因此按 LVGL 规则渲染为水平方向进度条。居中对齐lv_obj_align(bar1, NULL, LV_ALIGN_CENTER, 0, 0)让 Bar 在屏幕上水平垂直居中偏移量为 0。动画时长lv_bar_set_anim_time(bar1, 2000)设定值变化动画时长为 2000 毫秒。动画式赋值lv_bar_set_value(bar1, 100, LV_ANIM_ON)将当前值设为 100并开启LV_ANIM_ON动画——Bar 会从初始值 0 平滑填充至 100%。该示例的函数声明注册在 lv_ex_widgets.h第 30 行源码文件lv_ex_bar_1.c已同时被加入 lvgl_similator.vcxproj第 355 行的编译列表因此直接可在 VS2019 工程中编译运行。三、MicroPython 版本对照仓库中实际存在的 lv_ex_bar_1.py 提供了 MicroPython 实现bar1 lv.bar(lv.scr_act()) bar1.set_size(200, 30) bar1.align(None, lv.ALIGN.CENTER, 0, 0) bar1.set_anim_time(1000) bar1.set_value(100, lv.ANIM.ON)与 C 版本逐一对齐lv.bar()对应lv_bar_createset_size/align/set_anim_time/set_value对应同名 C APIlv.ANIM.ON对应LV_ANIM_ON。仅尺寸高度30px与动画时长1000ms与 C 版本略有差异。该脚本适合在支持 LVGL MicroPython 绑定的环境如基于 ESP32 的 HoloCubic 派生固件中直接使用。四、lv_bar 核心 API 与参数语义从控件头文件 lv_bar.h 可以提取完整的公开 API这是实战中必须掌握的接口清单4.1 Setter 系列API参数说明关键点lv_bar_create(par, copy)par父对象copy复制源NULL为新建返回新建的 Bar 对象lv_bar_set_value(bar, value, anim)value新值anim取LV_ANIM_ON/LV_ANIM_OFF带动画时从当前值平滑过渡lv_bar_set_start_value(bar, start_value, anim)设置起始值配合 CUSTOM 类型绘制分段条非 CUSTOM 类型下内部强制为min_valuelv_bar_set_range(bar, min, max)设置数值范围默认范围 0100lv_bar_set_type(bar, type)LV_BAR_TYPE_NORMAL/LV_BAR_TYPE_SYMMETRICAL/LV_BAR_TYPE_CUSTOM决定绘制形态lv_bar_set_anim_time(bar, anim_time)动画时长单位毫秒默认 200ms4.2 Getter 系列lv_bar_get_value、lv_bar_get_start_value、lv_bar_get_min_value、lv_bar_get_max_value、lv_bar_get_type、lv_bar_get_anim_time分别读取对应属性。值得注意的实现细节lv_bar_get_value在动画进行中返回的是动画目标端值见lv_bar.c中LV_BAR_GET_ANIM_VALUE宏的定义而非实时中间值。4.3 三种类型type语义LV_BAR_TYPE_NORMAL从最小值方向填充示例lv_ex_bar_1即此形态LV_BAR_TYPE_SYMMETRICAL当min_value 0且max_value 0、start_value min_value时以零值点为对称轴向两侧填充适合正负双向数值展示LV_BAR_TYPE_CUSTOM同时尊重start_value与cur_value可绘制分段进度条。从 lv_api_map.h 还可以看到v7.0 中旧的lv_bar_set_sym()已标记为 deprecated并被lv_bar_set_type()取代说明 type 是当前版本的标准配置方式。五、源码级原理默认值、裁剪与动画状态机深入 lv_bar.c 可以印证示例行为背后的底层机制。5.1 创建时的默认属性lv_bar_create()第 76141 行初始化扩展数据lv_bar_ext_tmin_value 0、max_value 100、cur_value 0、start_value 0anim_time 200毫秒type LV_BAR_TYPE_NORMAL默认尺寸为LV_DPI * 2×LV_DPI / 10LV_DPI在lv_conf.h中为 130px故约 260×13 像素。这解释了为什么示例必须显式调用lv_obj_set_size与lv_bar_set_anim_time它们是针对默认值的定制。5.2 值域自动裁剪lv_bar_set_value()第 153172 行对传入值做硬性裁剪new_value value ext-max_value ? ext-max_value : value; new_value new_value ext-min_value ? ext-min_value : new_value;也就是说即使传入越界值也不会导致进度溢出控件始终把值钳制在[min_value, max_value]区间内。固件中的压力测试示例 lv_demo_stress.c第 181 行正是利用了这一特性故意向lv_bar_set_value传入 5000 这类越界值以验证鲁棒性。5.3 动画状态机lv_bar.h定义了三个动画状态常量LV_BAR_ANIM_STATE_START 0动画起点LV_BAR_ANIM_STATE_END 256动画终点用 256 便于位运算归一化LV_BAR_ANIM_STATE_NORM 8即 2^8LV_BAR_ANIM_STATE_INV -1无动画进行中的标记。动画执行路径集中在lv_bar_set_value_with_anim()第 721753 行当anim LV_ANIM_ON时先记录anim_start与anim_end删除旧动画再通过lv_anim_set_exec_cb(lv_bar_anim)与lv_anim_set_ready_cb(lv_bar_anim_ready)注册 LVGL 动画系统回调。每帧由lv_bar_anim更新anim_state并触发重绘动画结束后由lv_bar_anim_ready把anim_end写回真实值并置状态为LV_BAR_ANIM_STATE_INV。如果动画进行中再次调用set_value新动画会从上一动画的anim_end起算第 736739 行保证连续调值时的平滑衔接。5.4 绘制机制方向判定、对称模式与最小尺寸draw_indic()第 426635 行负责计算并绘制填充区方向判定bool hor objw objh宽高比决定水平/垂直方向对称模式type LV_BAR_TYPE_SYMMETRICAL min_value 0 max_value 0 start_value min_value时以零值点为锚点双向绘制最小尺寸约束LV_BAR_SIZE_MIN 4第 26 行内边距导致的指示区小于 4px 时会被强制拉回最小尺寸避免不可见RTL 支持当base_dir LV_BIDI_DIR_RTL时自动交换坐标轴第 518526 行适配从右到左的语言环境。Bar 的样式分为两个 part背景LV_BAR_PART_BG与填充指示区LV_BAR_PART_INDIClv_bar.h第 8287 行分别通过lv_style定制背景圆角、填充色、渐变等效果lv_bar_signal()在LV_SIGNAL_CLEANUP时负责清理指示区样式列表并删除进行中的动画第 669676 行。六、运行与验证在模拟器与固件中跑通示例6.1 VS2019 模拟器运行LvglSimulator 是基于 SDL2 的 PC 端模拟工程入口 lvgl_similator.cpp 中main()通过注释开关切换演示程序第 6294 行。将lv_ex_bar_1();取消注释即可运行本示例//lv_ex_arc_1(); //lv_ex_cpicker_1(); //lv_ex_gauge_1(); //lv_ex_img_1(); lv_ex_bar_1(); // 运行 Simple Bar 示例 //lv_ex_tileview_1();工程中hal_init()完成三件事通过monitor_init()创建 PC 窗口模拟显示屏lv_disp_buf_t全屏帧缓冲 monitor_flush回调、注册鼠标指针输入设备、创建 SDL 线程每 5ms 调用lv_tick_inc(5)驱动 LVGL 时钟。主循环持续调用lv_task_handler()刷新界面第 99105 行Bar 的 2000ms 填充动画即由该任务调度完成。6.2 固件中的对应实现同一份示例源码也存在于 HoloCubic 固件目录 2.Firmware/HoloCubic-fw/lib/lvgl/src/lv_examples/src/lv_ex_widgets/lv_ex_bar/lv_ex_bar_1.c且固件的 lv_conf.h 同样以LV_USE_BAR 1、LV_USE_ANIMATION 1开启该控件与动画子系统。因此开发者既可在 PC 模拟器上快速迭代 UI 逻辑再移植到 ESP32 真机配 TFT_eSPI 驱动的小屏运行也可参考固件中lv_demo_printer第 230256 行多处lv_bar_createlv_bar_set_value与lv_demo_widgets第 366、601606 行配合lv_bar_get_max_value实现复制进度 x/max的成熟用法将其迁移到自己的桌面站界面。七、Bar 的衍生价值Slider 与 Switch 的公共基座从源码结构看lv_bar不仅是独立控件还是另两个常用控件的实现基座lv_slider.h 第 22 行强制要求开启LV_USE_BAR其扩展数据lv_slider_ext_t内嵌lv_bar_ext_t bar第 45 行滑块值、范围、动画时长直接透传到lv_bar_set_value/lv_bar_set_range/lv_bar_set_anim_timelv_switch.h 第 26 行同样包含lv_bar.h开关通过lv_bar_set_range(sw, 0, 1)把 Bar 变成两态控件。因此吃透lv_ex_bar_1背后的lv_barAPI 与动画机制等于同时掌握了进度条、滑块与开关三类控件的底层能力这正是本篇以该 Simple Bar 示例为切入点的价值所在。八、小结lv_ex_bar_1虽然只有寥寥数行却完整覆盖了 LVGL Bar 控件的核心使用范式创建lv_bar_create→ 布局lv_obj_set_size/lv_obj_align→ 动画配置lv_bar_set_anim_time→ 动画赋值lv_bar_set_value(..., LV_ANIM_ON)。结合 lv_bar.h 的 API 清单与 lv_bar.c 的实现可以进一步掌握值域裁剪、动画状态机、对称绘制与最小尺寸约束等底层细节并将其直接复用到 HoloCubic 模拟器与 ESP32 固件的真实界面开发中。赞分享嵌入式物联网智能硬件嵌入式GUI硬件开发【免费下载链接】HoloCubic带网络功能的伪全息透明显示桌面站项目地址https://gitcode.com/gh_mirrors/ho/HoloCubic点击查看免费下载相关推荐HoloCubic 固件中的 LVGL Bar 进度条控件从示例代码到源码级原理解析HoloCubic 固件中的 LVGL Bar 进度条控件从示例代码到源码级原理解析 导读 本文以 HoloCubic 仓库 lvgl 示例库 https:/嵌入式物联网智能硬件嵌入式GUI硬件开发LVGL Bar 控件六例全解从基础进度条到自定义绘制X-TRACK 模拟器内置示例剖析LVGL Bar 控件六例全解从基础进度条到自定义绘制X TRACK 模拟器内置示例剖析 导读 本文基于 X TRACK 项目模拟器中内置的 LVGL 官智能硬件嵌入式硬件开发LVGL Bar 进度条控件lv_bar完整指南三种模式、样式体系与绘制事件机制——X-TRACK 内嵌 LVGL 源码深度解析LVGL Bar 进度条控件lv_bar完整指南三种模式、样式体系与绘制事件机制——X TRACK 内嵌 LVGL 源码深度解析 本文以 X TRACK智能硬件嵌入式硬件开发上一篇xberg 递归 URL 文档提取实战用 follow_document_urls 沿文档链接自动抓取关联资源下一篇TrendFinder入门指南如何在5分钟内搭建AI趋势监测系统创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Display Driver Uninstaller(DDU)深度解析:显卡驱动彻底清理工具的使用原理与实战指南

Display Driver Uninstaller(DDU)深度解析:显卡驱动彻底清理工具的使用原理与实战指南

系统编程 【免费下载链接】display-drivers-uninstaller Display Driver Uninstaller (DDU) a driver removal utility / cleaner utility 项目地址: https://gitcode.com/gh_mirrors/di/display-drivers-uninstaller 点击查看 免费下载 本文基于 Readme_ES.md&…

2026/10/15 2:04:13 阅读更多 →
GluonCV 语义分割模型的推理与 INT8 量化实战指南

GluonCV 语义分割模型的推理与 INT8 量化实战指南

计算机视觉深度学习预训练 【免费下载链接】gluon-cv Gluon CV Toolkit 项目地址: https://gitcode.com/gh_mirrors/gl/gluon-cv 点击查看 免费下载 本篇技术指南以 GluonCV 仓库 scripts/segmentation/README.md 为核心,系统讲解语义分割(S…

2026/10/15 2:04:13 阅读更多 →
从裸机指令到意识涌现:一个底层系统程序员眼中大模型计算的“祛魅”时刻

从裸机指令到意识涌现:一个底层系统程序员眼中大模型计算的“祛魅”时刻

这几年,人工智能(AI)与大语言模型(LLM)的狂潮席卷了全球的每一个角落。从各大媒体惊呼“通用人工智能(AGI)即将降临”,到风险投资机构为各种“智能体自主意识”概念疯狂挥舞支票&…

2026/10/15 2:04:13 阅读更多 →

最新新闻

从源码编译GMSSL:国密算法支持与HTTPS链接调试实战

从源码编译GMSSL:国密算法支持与HTTPS链接调试实战

1. 从源码到动态库:为什么选择自己编译GMSSL很多人第一次接触国密算法开发时,第一反应是找现成的二进制包或者系统自带的包管理器直接安装。这个思路在大多数场景下没问题,但一旦涉及国密算法,情况就完全不一样了。GMSSL作为国内广…

2026/10/15 2:46:27 阅读更多 →
SpringBoot+Vue学院管理系统开发实战

SpringBoot+Vue学院管理系统开发实战

1. 项目概述与适用场景这个基于SpringBootVue技术栈的学院个人信息管理系统,是典型的教学级全栈开发项目。我在高校信息化部门工作期间,曾主导开发过类似系统,也指导过多名学生完成此类毕业设计。这类系统之所以成为热门选题,关键…

2026/10/15 2:46:27 阅读更多 →
SpringBoot+Vue高校医务室预约管理系统设计与实践

SpringBoot+Vue高校医务室预约管理系统设计与实践

1. 项目背景与核心价值高校医务室作为校园健康保障的第一道防线,长期面临着就诊高峰期排队混乱、病历管理低效、健康数据分散等痛点。这个基于SpringBootVue的预约管理系统,正是为了解决这些实际问题而设计的数字化解决方案。我在参与某高校医疗信息化改…

2026/10/15 2:46:27 阅读更多 →
医疗陪诊小程序开发:功能架构与技术实现详解

医疗陪诊小程序开发:功能架构与技术实现详解

1. 陪诊小程序的市场需求与产品定位医疗陪诊服务正在成为城市生活中的刚需。根据我过去三年参与医疗信息化项目的经验,独居老人、术后康复患者、异地就医人群构成了核心用户群体。这类用户往往面临"挂号难""流程陌生""行动不便"三大痛…

2026/10/15 2:46:27 阅读更多 →
KingdeeERP插件开发实战:从入门到精通

KingdeeERP插件开发实战:从入门到精通

1. 项目概述KingdeeERP作为国内主流的企业管理软件,其插件开发能力为系统功能扩展提供了强大支持。作为一名在ERP领域深耕多年的开发者,我见证了从K/3到Cloud版本的技术演进过程。插件开发不仅仅是简单的功能叠加,更是对企业业务流程的深度定…

2026/10/15 2:46:27 阅读更多 →
Flutter 欢迎页实战:用 intro_slider 构建引导页并实现「只显示一次」的路由跳转(Flutter-Notebook slider_screen 示例解析)

Flutter 欢迎页实战:用 intro_slider 构建引导页并实现「只显示一次」的路由跳转(Flutter-Notebook slider_screen 示例解析)

示例工程移动开发 【免费下载链接】Flutter-Notebook FlutterDemo合集,今天你fu了吗 项目地址: https://gitcode.com/gh_mirrors/fl/Flutter-Notebook 点击查看 免费下载 本文以 Flutter-Notebook 仓库中 mecury_project/example/slider_screen 示例为核…

2026/10/15 2:45:27 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →