当前位置: 首页 > article >正文

用LVGL玩转嵌入式UI:5个实战控件代码详解(按钮/滑块/图片/标签/开关)

LVGL嵌入式UI开发实战五大核心控件深度解析与代码优化在资源受限的嵌入式设备上实现流畅美观的用户界面一直是开发者面临的挑战。LVGLLight and Versatile Graphics Library作为一款轻量级开源图形库凭借其丰富的控件集和高效的渲染引擎已成为嵌入式UI开发的首选方案。本文将深入剖析按钮、滑块、图片、标签和开关五大核心控件的实战应用通过优化后的代码示例展示事件处理、样式定制和性能调优等进阶技巧。1. 按钮控件从基础交互到高级样式定制按钮作为用户交互的核心入口其实现质量直接影响用户体验。LVGL的按钮控件支持点击、长按、拖动等多种事件类型同时提供灵活的样式定制能力。1.1 基础按钮创建与事件绑定lv_obj_t *btn lv_btn_create(lv_scr_act(), NULL); lv_obj_set_size(btn, 100, 50); lv_obj_align(btn, NULL, LV_ALIGN_CENTER, 0, 0); /* 事件回调函数 */ static void btn_event_handler(lv_obj_t * obj, lv_event_t event) { if(event LV_EVENT_CLICKED) { printf(Main button clicked\n); } else if(event LV_EVENT_LONG_PRESSED) { printf(Long press detected\n); } } lv_obj_set_event_cb(btn, btn_event_handler);1.2 多状态样式配置LVGL允许为按钮的不同状态默认、按下、禁用等设置独立样式static lv_style_t btn_style; lv_style_init(btn_style); /* 默认状态样式 */ lv_style_set_bg_color(btn_style, LV_STATE_DEFAULT, LV_COLOR_MAKE(0x2C, 0x3E, 0x50)); lv_style_set_radius(btn_style, LV_STATE_DEFAULT, 10); /* 按下状态样式 */ lv_style_set_bg_color(btn_style, LV_STATE_PRESSED, LV_COLOR_MAKE(0xE7, 0x4C, 0x3C)); lv_style_set_transform_width(btn_style, LV_STATE_PRESSED, 5); lv_obj_add_style(btn, LV_BTN_PART_MAIN, btn_style);关键优化点使用lv_style_set_transform_width实现按下时的微动效果通过CSS风格的RGBA颜色值保证视觉一致性合理设置圆角半径提升现代感2. 滑块控件数据输入与可视化反馈滑块控件在参数调节类应用中尤为常见LVGL的滑块支持垂直/水平布局、范围设置和动画效果。2.1 基础滑块实现lv_obj_t *slider lv_slider_create(lv_scr_act(), NULL); lv_obj_set_size(slider, 200, 20); lv_slider_set_range(slider, 0, 100); lv_slider_set_value(slider, 30, LV_ANIM_ON); lv_obj_align(slider, NULL, LV_ALIGN_CENTER, 0, 0); /* 事件处理 */ static void slider_event_cb(lv_obj_t * slider, lv_event_t event) { if(event LV_EVENT_VALUE_CHANGED) { int16_t val lv_slider_get_value(slider); printf(Current value: %d\n, val); } } lv_obj_set_event_cb(slider, slider_event_cb);2.2 高级样式配置通过修改滑块各部分的样式实现个性化外观样式部件可配置属性典型应用场景LV_SLIDER_PART_BG背景色、边框设置滑块轨道底色LV_SLIDER_PART_INDIC渐变色、图案进度指示器美化LV_SLIDER_PART_KNOB形状、阴影滑块手柄定制/* 创建指示器渐变色 */ static lv_style_t slider_style; lv_style_init(slider_style); lv_style_set_bg_grad_color(slider_style, LV_STATE_DEFAULT, LV_COLOR_MAKE(0x1A, 0xBC, 0x9C)); lv_style_set_bg_color(slider_style, LV_STATE_DEFAULT, LV_COLOR_MAKE(0x16, 0xA0, 0x85)); lv_style_set_radius(slider_style, LV_STATE_DEFAULT, LV_RADIUS_CIRCLE); lv_obj_add_style(slider, LV_SLIDER_PART_INDIC, slider_style);3. 图片控件高效显示与动态处理在资源受限的嵌入式环境中图片的高效加载和显示至关重要。LVGL支持多种图片格式和动态处理技术。3.1 图片显示基础LV_IMG_DECLARE(company_logo); // 声明嵌入式图片 lv_obj_t *img lv_img_create(lv_scr_act(), NULL); lv_img_set_src(img, company_logo); lv_obj_align(img, NULL, LV_ALIGN_CENTER, 0, 0);3.2 动态图片处理技术LVGL支持对图片进行实时色彩调整和透明度控制static void recolor_image(lv_obj_t *img, lv_color_t color, lv_opa_t opacity) { lv_obj_set_style_local_image_recolor(img, LV_IMG_PART_MAIN, LV_STATE_DEFAULT, color); lv_obj_set_style_local_image_recolor_opa(img, LV_IMG_PART_MAIN, LV_STATE_DEFAULT, opacity); } /* 使用示例 */ recolor_image(img, LV_COLOR_MAKE(0xFF, 0x00, 0x00), LV_OPA_50);性能优化建议优先使用C数组格式的嵌入式图片大尺寸图片建议转换为RGB565格式动画效果考虑使用LVGL的缓存机制4. 标签控件文本渲染与高级排版标签控件是信息展示的核心组件LVGL提供了丰富的文本处理功能。4.1 基础标签创建lv_obj_t *label lv_label_create(lv_scr_act(), NULL); lv_label_set_text(label, Hello LVGL!); lv_obj_align(label, NULL, LV_ALIGN_CENTER, 0, 0);4.2 高级文本特性LVGL标签支持多种高级文本特性文本格式化lv_label_set_text_fmt(label, 温度: %.1f°C, 25.5);长文本处理模式lv_label_set_long_mode(label, LV_LABEL_LONG_BREAK); // 自动换行 lv_obj_set_width(label, 200); // 设置宽度触发换行文本重着色lv_label_set_recolor(label, true); lv_label_set_text(label, #ff0000 红色# #00ff00 绿色# 普通文本);5. 开关控件状态切换与交互反馈开关控件是二值状态输入的理想选择LVGL的开关控件支持动画和自定义样式。5.1 基础开关实现lv_obj_t *sw lv_switch_create(lv_scr_act(), NULL); lv_obj_set_size(sw, 60, 30); lv_obj_align(sw, NULL, LV_ALIGN_CENTER, 0, 0); /* 事件处理 */ static void switch_event_cb(lv_obj_t * obj, lv_event_t event) { if(event LV_EVENT_VALUE_CHANGED) { bool state lv_switch_get_state(obj); printf(Switch state: %s\n, state ? ON : OFF); } } lv_obj_set_event_cb(sw, switch_event_cb);5.2 样式深度定制通过修改开关各部分的样式实现品牌化设计/* 背景样式 */ static lv_style_t bg_style; lv_style_init(bg_style); lv_style_set_bg_color(bg_style, LV_STATE_DEFAULT, LV_COLOR_GRAY); lv_style_set_radius(bg_style, LV_STATE_DEFAULT, LV_RADIUS_CIRCLE); lv_obj_add_style(sw, LV_SWITCH_PART_BG, bg_style); /* 指示器样式 */ static lv_style_t indic_style; lv_style_init(indic_style); lv_style_set_bg_color(indic_style, LV_STATE_DEFAULT, LV_COLOR_MAKE(0x2E, 0xCC, 0x71)); lv_obj_add_style(sw, LV_SWITCH_PART_INDIC, indic_style); /* 手柄样式 */ static lv_style_t knob_style; lv_style_init(knob_style); lv_style_set_shadow_width(knob_style, LV_STATE_DEFAULT, 8); lv_obj_add_style(sw, LV_SWITCH_PART_KNOB, knob_style);6. 控件组合与交互优化实际项目中控件往往需要协同工作。以下是一个温度控制面板的完整示例/* 创建容器 */ lv_obj_t *panel lv_obj_create(lv_scr_act(), NULL); lv_obj_set_size(panel, 200, 250); lv_obj_align(panel, NULL, LV_ALIGN_CENTER, 0, 0); /* 温度显示标签 */ lv_obj_t *temp_label lv_label_create(panel, NULL); lv_label_set_text(temp_label, 当前温度: 20°C); lv_obj_align(temp_label, NULL, LV_ALIGN_IN_TOP_MID, 0, 20); /* 温度调节滑块 */ lv_obj_t *temp_slider lv_slider_create(panel, NULL); lv_obj_set_size(temp_slider, 150, 20); lv_slider_set_range(temp_slider, 10, 30); lv_slider_set_value(temp_slider, 20, LV_ANIM_OFF); lv_obj_align(temp_slider, temp_label, LV_ALIGN_OUT_BOTTOM_MID, 0, 30); /* 自动模式开关 */ lv_obj_t *auto_switch lv_switch_create(panel, NULL); lv_obj_align(auto_switch, temp_slider, LV_ALIGN_OUT_BOTTOM_MID, 0, 30); lv_obj_t *auto_label lv_label_create(panel, NULL); lv_label_set_text(auto_label, 自动调节); lv_obj_align(auto_label, auto_switch, LV_ALIGN_OUT_RIGHT_MID, 10, 0); /* 交互逻辑 */ static void temp_ctrl_event(lv_obj_t * obj, lv_event_t event) { static bool auto_mode false; if(obj auto_switch event LV_EVENT_VALUE_CHANGED) { auto_mode lv_switch_get_state(auto_switch); lv_slider_set_anim_time(temp_slider, auto_mode ? 1000 : 200); } if(obj temp_slider event LV_EVENT_VALUE_CHANGED) { int16_t temp lv_slider_get_value(temp_slider); lv_label_set_text_fmt(temp_label, 当前温度: %d°C, temp); } } lv_obj_set_event_cb(temp_slider, temp_ctrl_event); lv_obj_set_event_cb(auto_switch, temp_ctrl_event);实现要点使用容器(lv_obj)组织相关控件通过lv_obj_align实现精确布局控件间建立数据联动根据交互模式调整动画参数7. 性能优化与内存管理在资源受限的嵌入式环境中性能优化至关重要。以下是经过验证的优化策略7.1 渲染性能提升技巧部分刷新仅更新发生变化区域lv_obj_invalidate_area(obj, area); // 标记需要刷新的区域图层缓存对复杂静态界面使用缓存lv_obj_set_style_local_bg_img_opa(obj, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_COVER);动画优化合理设置动画时间lv_anim_set_time(anim, 300); // 300ms通常是最佳平衡点7.2 内存管理最佳实践策略实现方法节省效果对象池重用已删除的对象减少30%内存分配样式共享多个控件共用样式降低50%样式内存图片优化使用索引色格式减少75%图片内存/* 对象池示例 */ static lv_obj_t *btn_pool[5]; void init_buttons() { for(int i0; i5; i) { btn_pool[i] lv_btn_create(lv_scr_act(), NULL); lv_obj_set_hidden(btn_pool[i], true); } } lv_obj_t *get_button() { for(int i0; i5; i) { if(lv_obj_get_hidden(btn_pool[i])) { lv_obj_set_hidden(btn_pool[i], false); return btn_pool[i]; } } return NULL; }通过本文的深度技术解析和优化实践开发者可以构建出既美观又高效的嵌入式用户界面。在实际项目中建议根据具体硬件性能和需求场景灵活调整各项参数和实现方案。

相关文章:

用LVGL玩转嵌入式UI:5个实战控件代码详解(按钮/滑块/图片/标签/开关)

LVGL嵌入式UI开发实战:五大核心控件深度解析与代码优化 在资源受限的嵌入式设备上实现流畅美观的用户界面,一直是开发者面临的挑战。LVGL(Light and Versatile Graphics Library)作为一款轻量级开源图形库,凭借其丰富的…...

ArcGIS Desktop绘图工具条实战:从基础图形到专业地图注记的进阶指南

1. ArcGIS绘图工具条初探:你的地图设计起点 第一次打开ArcGIS Desktop的绘图工具条时,我就像拿到了一盒全新的彩色铅笔。这个看似简单的工具条,实际上包含了从基础绘图到专业地图注记的全套功能。绘图工具条位于软件界面顶部,右键…...

百川2-13B-4bits量化版精度测试:OpenClaw自动化任务准确率对比

百川2-13B-4bits量化版精度测试:OpenClaw自动化任务准确率对比 1. 测试背景与实验设计 上周在部署OpenClaw自动化工作流时,我遇到了一个现实问题:本地显卡只有12GB显存,跑不动原版13B模型。于是尝试了百川2-13B的4bits量化版本&…...

老旧Mac如何重获新生?OCLP-Mod带来的系统升级解决方案

老旧Mac如何重获新生?OCLP-Mod带来的系统升级解决方案 【免费下载链接】OCLP-Mod A mod version for OCLP,with more interesting features. 项目地址: https://gitcode.com/gh_mirrors/oc/OCLP-Mod 随着科技的快速迭代,许多曾经性能卓越的Mac设备…...

软件测试生命周期全解析:用考试答题逻辑,零基础吃透测试核心

之前我们用考场答题的类比,轻松搞懂了软件开发生命周期,很多初学者恍然大悟:原来编程就是一场有章法的“考试”。但一场考试能不能拿到高分、能不能符合出题人(客户)的要求,光靠埋头答题(开发编…...

从ADC的‘胃口’说起:深入浅出解析电平移位电路中基准源VREF与滤波电容的选型玄学

从ADC的"胃口"说起:深入浅出解析电平移位电路中基准源VREF与滤波电容的选型玄学 在模拟电路设计中,ADC(模数转换器)就像一位挑剔的美食家,对输入信号的"口味"有着严苛的要求。而电平移位电路则如同…...

python-flask-djangol框架的校园餐厅菜品自选系统

目录 技术选型核心功能模块数据库设计开发流程部署方案关键代码示例测试重点 项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作 技术选型 使用Python的Flask或Django框架作为后端基础。Flask适合轻量级快速开发,Djan…...

基于MATLAB的数字图像处理系统:预处理、特征提取与语义分割全流程实现

数字图像处理系统(基于matlab) 此系统包括预处理,特征提取,语义分割 使用机器学习算法knn和svm 预处理包括线性灰度级变化,指数灰度级变化,直方图均衡化,高斯滤波,中值滤波&#xff…...

ChromePass终极指南:浏览器密码提取与安全管理完全攻略

ChromePass终极指南:浏览器密码提取与安全管理完全攻略 【免费下载链接】chromepass Get all passwords stored by Chrome on WINDOWS. 项目地址: https://gitcode.com/gh_mirrors/chr/chromepass 副标题:从密码危机到数据掌控:3步实现…...

蓄电池与超级电容混合储能微电网的未讲解部分总结

蓄电池 超级电容混合储能微电网 没有讲解搞离网微电网的都懂,储能这块一直是卡脖子的事儿——单独堆蓄电池吧,遇到村里突然开个打米机、抽水泵这种大负载,瞬间电流顶上去,电瓶寿命唰唰掉;全上超级电容呢,确…...

MATPOWER电力系统仿真实践手册:从安装到应用的全面指南

MATPOWER电力系统仿真实践手册:从安装到应用的全面指南 【免费下载链接】matpower MATPOWER – steady state power flow simulation and optimization for MATLAB and Octave 项目地址: https://gitcode.com/gh_mirrors/ma/matpower MATPOWER是一款专为MATL…...

使用AI大大提升了学习代码的效率

最近看到一个观点,说AI的发展导致代码越来越不值钱了,AI降低了我们学习的门槛,大大提升了学习效率。好像很多程序都可以一个人一天上架一款产品。或许有夸张成分,但像我们普通人都体验到了AI的方便,比如在项目开发的过…...

医药行业用友 YonSuite 一体化管理方案

医保新规 4 月 1 日落地|医药企业破局:数智化 合规 精细化,活下去且活得好2026 年 4 月 1 日,医保新规全面执行,集采深化、价格严控、全链路监管,医药行业正式告别高毛利、粗放式、渠道为王的旧时代&…...

SEO_网站SEO诊断与快速优化解决办法分享

<h2>SEO诊断&#xff1a;了解你的网站现状&#xff0c;为优化铺路</h2> <p>在当今数字化时代&#xff0c;拥有一个高效、优化良好的网站是任何企业或个人成功的关键。网站SEO诊断是这一过程中的重要步骤。通过网站SEO诊断&#xff0c;我们可以全面了解你的网…...

CANdb++ Editor高效使用技巧:5个隐藏功能大幅提升dbc编辑效率

CANdb Editor高效使用技巧&#xff1a;5个隐藏功能大幅提升dbc编辑效率 在汽车电子开发领域&#xff0c;Vector的CANdb Editor堪称dbc文件编辑的行业标准工具。大多数工程师都能熟练使用其基础功能&#xff0c;但真正的高手往往掌握着那些鲜为人知的"秘密武器"。本文…...

RTX4090D显存优化:OpenClaw+Qwen3-32B-Chat批量处理千页PDF

RTX4090D显存优化&#xff1a;OpenClawQwen3-32B-Chat批量处理千页PDF 1. 为什么需要显存优化 当我第一次尝试用OpenClaw对接Qwen3-32B-Chat处理PDF文档时&#xff0c;遇到了一个棘手的问题——显存爆炸。当时只是处理一个200页的PDF&#xff0c;显存占用就飙到了22GB&#x…...

告别加班!3个Word神技巧,文档处理快人一步

如影随形地跟着那堆积如山的文档&#xff0c;像学生名单&#xff0c;课程表&#xff0c;教学计划&#xff0c;家长通知等等&#xff0c;这些重复性工作着实耗费了大量精力。事实上&#xff0c;Word当中蕴含着好些能够让你达成事半功倍效果的技巧&#xff0c;一旦将它们掌握住&a…...

5步实现Switch控制器PC全功能适配:从连接到精通的设备适配指南

5步实现Switch控制器PC全功能适配&#xff1a;从连接到精通的设备适配指南 【免费下载链接】BetterJoy Allows the Nintendo Switch Pro Controller, Joycons and SNES controller to be used with CEMU, Citra, Dolphin, Yuzu and as generic XInput 项目地址: https://gitc…...

嵌入式轻量级3D数学库mmath:面向MCU的定点/浮点向量矩阵运算

1. 项目概述mmath是一个专为嵌入式系统设计的轻量级三维数学库&#xff0c;其核心目标是在资源受限的 MCU&#xff08;如 Cortex-M0/M3/M4&#xff09;上提供高效、无浮点依赖&#xff08;可选&#xff09;、内存占用可控的 3D 向量、矩阵、四元数及空间变换运算能力。与通用桌…...

咱们今天来唠唠机器人轨迹规划那点事儿。不少小伙伴在玩机械臂的时候总会遇到关节空间和笛卡尔空间轨迹规划的抉择困难症,这俩货到底有什么区别?直接上硬核代码

matlab笛卡尔空间和关节空间轨迹规划 关节空间机器臂多项式轨迹规划定做&#xff0c;353和333多项式轨迹规划和优化关节空间规划有个大杀器——多项式插值。比如要让机械臂从A点平滑运动到B点&#xff0c;咱们可以玩三次多项式&#xff08;3-3-3&#xff09;或者五次多项式&…...

ssm+java2026年毕设私教预约系统【源码+论文】

本系统&#xff08;程序源码&#xff09;带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、选题背景关于会议管理问题的研究&#xff0c;现有研究主要以传统纸质登记和简单的OA系统为主&#xff0c;专门针对智能化、全流程会议预…...

多项式朴素贝叶斯

多项式朴素贝叶斯&#xff08;二分类&#xff09; 题意 实现一个 Multinomial Naive Bayes 二分类器。 train&#xff1a;二维列表&#xff0c;每行最后一列为标签 y \in \{0,1\}&#xff0c;其余列为非负整数词频test&#xff1a;二维列表&#xff0c;仅包含词频特征&#xff…...

ssm+java2026年毕设司库管理系统【源码+论文】

本系统&#xff08;程序源码&#xff09;带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、选题背景关于企业理财与融资管理问题的研究&#xff0c;现有研究主要以大型企业ERP系统或通用财务管理软件为主&#xff0c;专门针对中…...

软件测试学习第一期

&#x1f3ac; 博客主页&#xff1a;博主链接 &#x1f3a5; 本文由 M malloc 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f384; 学习专栏推荐&#xff1a;LeetCode刷题集&#xff01; &#x1f3c5; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指…...

Django REST framework的应用场景

目录一、鉴权开发框架介绍二、Django REST framework是什么三、如何实现认证、权限与限流功能四、Django REST framework的应用场景一、鉴权开发框架介绍 鉴权开发框架是一种用于实现身份验证和授权的软件开发工具。它可以帮助开发者快速构建安全、可靠的身份验证和授权系统&a…...

别再死记公式了!用Python+Matplotlib亲手仿真LC并联谐振,直观理解选频原理

用PythonMatplotlib动态仿真LC并联谐振&#xff1a;从代码到物理直觉的沉浸式探索 当教科书上的LC并联谐振公式变成屏幕上跳动的曲线&#xff0c;当抽象的Q值概念转化为滑块调节时的实时波形变化&#xff0c;电子工程的学习便从枯燥的符号演算升维为一场充满探索乐趣的科学实验…...

Flink技术实践-超时异常踩坑与优化

一、背景介绍在Flink实时计算的生产环境中&#xff0c;最令人头疼的往往不是复杂的业务逻辑&#xff0c;而是那些突如其来的“超时异常”。这些异常就像是系统中的“幽灵”&#xff0c;通常在业务高峰期或网络抖动时出现&#xff0c;导致作业重启、数据延迟甚至数据丢失。最近几…...

trt 动态batchsize优化:trtexec工具ONNX转engine实战指南

1. 为什么需要动态batchsize优化 在实际的AI模型部署中&#xff0c;我们经常会遇到输入数据量不固定的情况。比如视频分析场景&#xff0c;可能同时有1路或8路视频需要实时处理&#xff1b;又比如在线服务&#xff0c;请求量会随时间波动。这时候如果使用固定batchsize&#xf…...

【LAMMPS实战】从文献到模拟:精准定位与获取ReaxFF反应力场参数文件

1. 初识ReaxFF反应力场&#xff1a;为什么我们需要它&#xff1f; 第一次接触分子动力学模拟时&#xff0c;我完全被各种力场搞晕了。直到遇到需要模拟化学反应的情况&#xff0c;才发现普通的力场根本不够用。这时候ReaxFF反应力场就像救命稻草一样出现了。简单来说&#xff0…...

从CentOS 7迁移到Ubuntu 22.04 LTS,我整理了一份保姆级系统初始化脚本(含内核调优、换源、时区设置)

从CentOS 7迁移到Ubuntu 22.04 LTS&#xff1a;系统初始化与性能调优全指南 当CentOS 7走向生命周期的终点&#xff0c;许多运维团队正面临向新平台的战略转移。Ubuntu 22.04 LTS以其长期支持特性和活跃的社区生态&#xff0c;成为最受欢迎的替代选择之一。但迁移绝非简单的系统…...