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

别再只用默认样式了!手把手教你定制LVGL Bar进度条的3种高级视觉效果

突破视觉边界LVGL进度条高级定制技法三则在嵌入式UI开发领域LVGL以其轻量级和高度可定制性赢得了众多开发者的青睐。但当我们超越基础功能实现进入视觉表现力的深水区时这个开源图形库的真正魅力才开始显现。进度条作为人机交互中最直观的反馈元素之一其视觉设计直接影响用户对系统响应速度和专业度的感知。本文将揭示三种打破常规的LVGL进度条设计方案从光影效果到材质模拟再到动态纹理带您领略嵌入式UI设计的艺术面。1. 负填充与光影叠加创造能量溢出效果传统进度条设计往往局限于背景与指示器的简单色块组合而现代UI趋势更强调元素的层次感和动态表现。通过巧妙利用LV_BAR_PART_BG的负填充特性我们可以实现指示器超出背景容器的视觉效果配合光影叠加营造出能量蓄积的动感。1.1 负填充的核心原理在LVGL样式系统中padding属性通常用于控制元素内部间距。当为背景部件(LV_BAR_PART_BG)设置负填充值时实际上是在扩大指示器(LV_BAR_PART_INDIC)的可绘制区域static lv_style_t style_bg; lv_style_init(style_bg); lv_style_set_pad_all(style_bg, LV_STATE_DEFAULT, -5); // 四周扩展5像素 lv_obj_t* bar lv_bar_create(lv_scr_act(), NULL); lv_obj_add_style(bar, LV_BAR_PART_BG, style_bg);1.2 多层渐变实现光影单纯的尺寸扩展尚不足以创造视觉冲击需要结合LVGL的渐变颜色功能static lv_style_t style_indic; lv_style_init(style_indic); // 创建水平渐变从半透明亮色到实色再到半透明 lv_style_set_bg_grad_dir(style_indic, LV_GRAD_DIR_HOR); lv_style_set_bg_grad_color(style_indic, LV_STATE_DEFAULT, lv_color_hex(0x00FFAA)); lv_style_set_bg_main_color(style_indic, LV_STATE_DEFAULT, lv_color_hex(0x0088FF)); lv_style_set_bg_grad_stop(style_indic, LV_STATE_DEFAULT, 230); // 渐变结束位置 // 添加发光效果 lv_style_set_shadow_width(style_indic, LV_STATE_DEFAULT, 10); lv_style_set_shadow_spread(style_indic, LV_STATE_DEFAULT, 5); lv_style_set_shadow_color(style_indic, LV_STATE_DEFAULT, lv_color_hex(0x00AAFF)); lv_obj_add_style(bar, LV_BAR_PART_INDIC, style_indic);提示渐变停止点(230)配合负填充(-5)会产生边缘羽化效果这是能量溢出视觉的关键1.3 动画增强动态表现为强化进度更新的视觉反馈可以设计多阶段动画// 定义动画变量 static lv_anim_t anim; lv_anim_init(anim); lv_anim_set_exec_cb(anim, (lv_anim_exec_xcb_t)lv_bar_set_value); lv_anim_set_time(anim, 800); lv_anim_set_values(anim, 0, 75); lv_anim_set_playback_time(anim, 300); lv_anim_set_playback_delay(anim, 1000); lv_anim_set_var(anim, bar); lv_anim_start(anim);这种设计特别适合需要强调进程重要性的场景如固件升级、大文件传输等关键操作。2. 玻璃质感进度条现代UI风格的实现苹果macOS的毛玻璃效果和Windows 11的亚克力材质引领了现代UI设计潮流。在资源有限的嵌入式设备上通过巧妙的渐变和模糊组合我们同样可以模拟出类似的视觉效果。2.1 基础玻璃层构建玻璃质感的核心在于背景透光和边缘高光。首先创建具有透明通道的渐变色static lv_style_t style_glass; lv_style_init(style_glass); // 设置半透明背景 lv_style_set_bg_opa(style_glass, LV_STATE_DEFAULT, LV_OPA_70); lv_style_set_bg_grad_dir(style_glass, LV_GRAD_DIR_VER); // 垂直渐变顶部更透明 lv_style_set_bg_grad_color(style_glass, LV_STATE_DEFAULT, lv_color_hex(0xFFFFFF)); lv_style_set_bg_main_color(style_glass, LV_STATE_DEFAULT, lv_color_hex(0xDDDDFF)); lv_style_set_bg_grad_stop(style_glass, LV_STATE_DEFAULT, 180); // 圆角边框 lv_style_set_radius(style_glass, LV_STATE_DEFAULT, 15); lv_style_set_border_width(style_glass, LV_STATE_DEFAULT, 1); lv_style_set_border_color(style_glass, LV_STATE_DEFAULT, lv_color_hex(0xFFFFFF)); lv_style_set_border_opa(style_glass, LV_STATE_DEFAULT, LV_OPA_30);2.2 动态模糊背景真正的毛玻璃效果需要对底层内容进行实时模糊这在MCU上成本较高。替代方案是使用预渲染的噪声纹理// 创建纹理图像 LV_IMG_DECLARE(noise_texture); // 事先准备的PNG纹理 static lv_style_t style_texture; lv_style_init(style_texture); lv_style_set_pattern_image(style_texture, LV_STATE_DEFAULT, noise_texture); lv_style_set_pattern_opa(style_texture, LV_STATE_DEFAULT, LV_OPA_20); lv_style_set_pattern_repeat(style_texture, LV_STATE_DEFAULT, true); // 将纹理应用到进度条背景 lv_obj_add_style(bar, LV_BAR_PART_BG, style_texture);2.3 边缘光效强化为增强立体感添加内阴影模拟光线折射lv_style_set_shadow_width(style_glass, LV_STATE_DEFAULT, 3); lv_style_set_shadow_spread(style_glass, LV_STATE_DEFAULT, 1); lv_style_set_shadow_color(style_glass, LV_STATE_DEFAULT, lv_color_hex(0xFFFFFF)); lv_style_set_shadow_opa(style_glass, LV_STATE_DEFAULT, LV_OPA_50);这种设计适合需要融入现代操作系统UI生态的嵌入式设备如智能家居中控、车载显示屏等场景。3. 自定义绘制动态纹理与图案当标准样式属性无法满足独特设计需求时LVGL的自定义绘制机制提供了终极解决方案。通过重写绘制事件回调我们可以在进度条上实现任意复杂的图案。3.1 绘制事件基础首先注册自定义绘制回调函数static lv_obj_t* bar lv_bar_create(lv_scr_act(), NULL); lv_obj_add_event_cb(bar, custom_draw_event, LV_EVENT_DRAW_MAIN, NULL);3.2 条纹图案实现以下是创建斜纹进度条的完整示例static void custom_draw_event(lv_event_t* e) { lv_obj_t* obj lv_event_get_target(e); if(lv_obj_get_type(obj) ! lv_bar_class) return; lv_draw_ctx_t* draw_ctx lv_event_get_draw_ctx(e); // 获取指示器区域 lv_area_t indic_area; lv_bar_get_indic_area(obj, indic_area); // 设置条纹参数 lv_coord_t stripe_width 8; lv_coord_t stripe_spacing 12; lv_color_t stripe_color lv_color_hex(0x000000); lv_opa_t stripe_opa LV_OPA_40; // 绘制斜纹 for(int y indic_area.y1 - indic_area.x1; y indic_area.y2; y stripe_spacing) { lv_point_t points[4]; points[0].x indic_area.x1 y; points[0].y indic_area.y1; points[1].x indic_area.x1 y stripe_width; points[1].y indic_area.y1; points[2].x indic_area.x1 y - (indic_area.y2 - indic_area.y1); points[2].y indic_area.y2; points[3].x indic_area.x1 y stripe_width - (indic_area.y2 - indic_area.y1); points[3].y indic_area.y2; lv_draw_line_dsc_t line_dsc; lv_draw_line_dsc_init(line_dsc); line_dsc.color stripe_color; line_dsc.opa stripe_opa; line_dsc.width 1; lv_draw_polygon(draw_ctx, line_dsc, points, 4); } }3.3 动态波浪效果通过结合正弦函数和时间计数器可以创造动态波浪纹理static uint32_t wave_counter 0; static void wave_anim_cb(lv_obj_t* bar) { wave_counter; lv_obj_invalidate(bar); } static void wave_draw_event(lv_event_t* e) { // ...获取指示器区域... // 波浪参数 lv_coord_t amplitude 5; lv_coord_t period 50; lv_color_t wave_color lv_color_hex(0xFFFFFF); // 创建波浪路径 lv_point_t* points lv_mem_alloc(sizeof(lv_point_t) * (indic_area.x2 - indic_area.x1 1)); for(int x 0; x indic_area.x2 - indic_area.x1; x) { points[x].x indic_area.x1 x; points[x].y indic_area.y1 amplitude * lv_trigo_sin((x * 360 / period wave_counter) % 360) / LV_TRIGO_SIN_MAX; } // 绘制波浪线 lv_draw_line_dsc_t line_dsc; lv_draw_line_dsc_init(line_dsc); line_dsc.color wave_color; line_dsc.width 2; lv_draw_line(draw_ctx, line_dsc, points, indic_area.x2 - indic_area.x1 1); lv_mem_free(points); }注意动态纹理会显著增加绘制开销建议仅在性能足够的硬件上使用或降低更新频率4. 性能优化与跨平台适配炫酷的视觉效果需要付出性能代价在嵌入式环境中尤其需要谨慎权衡。以下是关键优化策略4.1 渲染开销对比效果类型内存消耗CPU占用适用场景基础色块低低低端MCU简单界面渐变与阴影中中主流嵌入式设备自定义绘制高高高性能平台特殊需求动态纹理高很高演示场景高端设备4.2 条件编译策略在实际项目中应根据目标平台选择适当的实现方式#if defined(STM32H7) || defined(ESP32_S3) #define USE_ADVANCED_EFFECTS 1 #else #define USE_ADVANCED_EFFECTS 0 #endif void create_progress_bar(lv_obj_t* parent) { lv_obj_t* bar lv_bar_create(parent, NULL); #if USE_ADVANCED_EFFECTS apply_glass_effect(bar); lv_obj_add_event_cb(bar, wave_draw_event, LV_EVENT_DRAW_MAIN, NULL); #else apply_basic_style(bar); #endif }4.3 帧率控制技巧对于动态效果合理控制重绘频率可显著降低CPU负载// 创建定时器控制动画更新 static lv_timer_t* anim_timer NULL; static void timer_cb(lv_timer_t* timer) { wave_counter; lv_obj_invalidate(timer-user_data); } void start_wave_animation(lv_obj_t* bar) { if(anim_timer) lv_timer_del(anim_timer); anim_timer lv_timer_create(timer_cb, 50, bar); // 20FPS lv_timer_set_repeat_count(anim_timer, LV_ANIM_REPEAT_INFINITE); }在实际项目中建议通过用户测试确定最佳平衡点——视觉效果足够吸引注意力又不会导致界面卡顿或明显功耗增加。

相关文章:

别再只用默认样式了!手把手教你定制LVGL Bar进度条的3种高级视觉效果

突破视觉边界:LVGL进度条高级定制技法三则 在嵌入式UI开发领域,LVGL以其轻量级和高度可定制性赢得了众多开发者的青睐。但当我们超越基础功能实现,进入视觉表现力的深水区时,这个开源图形库的真正魅力才开始显现。进度条作为人机交…...

安科士(AndXe)SPF-10G-T :10G 电口模块,重塑短距网络升级性价比

数字化转型浪潮下,企业园区、数据中心对10Gbps 高速互联的需求呈爆发式增长。但传统 10G 升级方案深陷困境:光纤布线成本高昂、施工周期长且需专业运维技能,而多数企业机架内、相邻机架间及办公楼层内的链路距离普遍低于 30 米,光…...

5分钟掌握终极音乐解密方案:Unlock Music Electron完整指南

5分钟掌握终极音乐解密方案:Unlock Music Electron完整指南 【免费下载链接】unlock-music-electron Unlock Music Project - Electron Edition 在Electron构建的桌面应用中解锁各种加密的音乐文件 项目地址: https://gitcode.com/gh_mirrors/un/unlock-music-ele…...

Hive 3.1.3部署后,你可能会遇到的3个连接与权限报错及解决实录

Hive 3.1.3部署后三大经典连接与权限问题深度解析 当你终于按照教程完成Hive 3.1.3的安装,却在最后连接阶段遭遇各种"拦路虎"时,那种挫败感我深有体会。本文将带你直击三个最具代表性的连接与权限问题,从报错现象到根因分析&#x…...

TranslucentTB:让Windows任务栏变透明的终极指南

TranslucentTB:让Windows任务栏变透明的终极指南 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB 你是否厌倦了Windows任务栏那…...

告别CubeMX思维定式:用S32DS的Processor Expert玩转S32K144外设配置(含FreeRTOS组件添加)

从CubeMX到Processor Expert:S32K144高效开发实战指南 在嵌入式开发领域,工具链的选择往往决定了开发效率的上限。对于习惯了ST生态的开发者来说,CubeMX的图形化配置已成为肌肉记忆般的操作。但当项目需求将我们推向NXP的S32K系列时&#xff…...

HeyGen免费额度怎么用最值?我用1个积分做了个多语言口播视频(附保姆级教程)

HeyGen免费额度高效使用指南:1积分打造多语言口播视频 第一次接触HeyGen时,我被它逼真的口型同步技术震撼了——直到发现免费账户只有1个积分。这就像得到一颗钻石却只能刮一次玻璃。经过两周的反复测试,我总结出一套**"1积分最大化&quo…...

从手机镜头到AR眼镜:几何光学三大定律如何塑造你身边的成像技术

从手机镜头到AR眼镜:几何光学三大定律如何塑造你身边的成像技术 当你用手机拍下一张照片,或是戴上AR眼镜看到虚拟与现实融合的世界时,背后其实隐藏着几个世纪前就被发现的物理定律。这些看似高深的光学原理,正以最直接的方式影响…...

用GoC画图搞定2018年5月那道‘场记板’编程题,附完整代码和思路拆解

用GoC画图还原2018年场记板编程题的完整解题思路 第一次看到这道场记板题目时,许多同学会被"n条竖线"的要求难住。其实只要拆解图形结构,用GoC的基础命令就能轻松实现。本文将从零开始,带你用分治法拆解这个经典考题,不…...

别再死记硬背了!图解ASCII码表,轻松掌握C语言字符处理的底层逻辑

从ASCII到C语言:用图形化思维解锁字符处理的本质 在初学C语言时,很多人都会对char类型和int类型之间的暧昧关系感到困惑。为什么一个字符可以像整数一样进行加减运算?为什么大小写字母转换只需要简单地加减32?这些看似神奇的操作背…...

保姆级教程:在Ubuntu 22.04上用Netplan搞定Bond+VLAN+Bridge混合网络(附H3C交换机配置)

企业级网络架构实战:Ubuntu 22.04下BondVLANBridge混合部署指南 在虚拟化环境和云计算基础设施中,网络架构的可靠性和灵活性至关重要。本文将深入探讨如何在Ubuntu 22.04系统上,通过Netplan配置工具实现Bond(链路聚合)…...

2026年PCB行业研究报告

随着全球算力需求爆发式增长,印制电路板(PCB)已从传统的电子连接载体,演进为决定AI集群信号完整性的核心物理瓶颈。PCB不仅是电子工业的母板,更是支撑人工智能与大数据等新质生产力落地的底层基石。当前,行…...

从QPLL与CPLL选型到线速计算:一份给Xilinx GTY新手的时钟配置速查手册

从QPLL与CPLL选型到线速计算:一份给Xilinx GTY新手的时钟配置速查手册 第一次接触Xilinx UltraScale系列FPGA的GTY收发器时,最让人头疼的莫过于时钟配置。面对QPLL0、QPLL1和CPLL三种时钟源,以及N1、N2、M、D等分频参数,新手工程师…...

CAN总线电压测试避坑指南:用示波器实测显性/隐性电平,别再被CAN_H和CAN_L的命名误导了

CAN总线电压测试实战手册:从示波器设置到波形解读的完整指南 实验室里,工程师小王盯着示波器屏幕上跳动的波形皱起了眉头——按照教科书上的说法,CAN_H电压应该始终高于CAN_L,但眼前的波形却显示在总线空闲时CAN_L电压反而更高。这…...

QMCDecode:3步解锁QQ音乐加密音频,让音乐真正属于你!

QMCDecode:3步解锁QQ音乐加密音频,让音乐真正属于你! 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac,qmc0,qmc3转mp3, mflac,mflac0等转flac),仅支持macOS,可自动识别到QQ音乐下载…...

别再让你的App‘抢麦’了!Android AudioFocus避坑指南与实战(附8.0+新API详解)

Android音频焦点管理实战:从冲突解决到优雅兼容 音乐播放器突然被通知音打断后无法恢复?语音助手播报时被来电强行中断?这些看似简单的音频冲突背后,是Android音频焦点机制的复杂运作。作为开发者,我们常常低估了正确处…...

RDP Wrapper实用指南:三步解决[not supported]错误的高效方法

RDP Wrapper实用指南:三步解决[not supported]错误的高效方法 【免费下载链接】rdpwrap RDP Wrapper Library 项目地址: https://gitcode.com/gh_mirrors/rd/rdpwrap RDP Wrapper是一款让Windows家庭版支持多用户远程桌面连接的开源工具,但许多用…...

STM32以太网实战:手把手教你配置SMI接口,搞定PHY寄存器读写

STM32以太网实战:手把手教你配置SMI接口,搞定PHY寄存器读写 在嵌入式以太网开发中,PHY芯片的配置往往是项目成败的关键。很多开发者能够轻松完成MAC层的初始化,却在PHY寄存器读写这个环节卡壳——明明硬件连接正确,却无…...

高工独家报告|谁在收割2026智驾市场红利?440万辆背后的芯片大洗牌

高工智能汽车研究院发布《2026年中国市场智能汽车SoC芯片行业分析报告》。报告立足中国乘用车市场,基于乘用车前装量产数据库,全面解析智能驾驶SoC(含前视一体机、域控制器及高阶自动驾驶辅助芯片)与智能座舱SoC(含端侧…...

CAXA 表格样式

位置属性和 CAD 类似默认【标准】自带,删不掉。预览常规-表格方向向上;向下;单元样式标题;表头;数据;【切换】对应下方 常规、文字的属性设置。常规【对齐】创建行时合并单元:文字命令位置先设置…...

别再怪PoE不稳定了!手把手教你排查网线、供电、配置三大坑(附真实监控项目踩坑实录)

PoE稳定性实战指南:从网线到供电的深度排查手册 凌晨三点,监控室突然响起警报——某重要区域的摄像头集体离线。值班工程师的第一反应往往是"设备又坏了",但真实情况可能藏在那些容易被忽略的细节里:一根劣质网线在低温…...

深入Linux内核:图解PTP硬件时间戳(HW Timestamp)从网卡到用户空间的完整路径

深入Linux内核:图解PTP硬件时间戳从网卡到用户空间的完整路径 1. 高精度时间同步的技术演进与PTP核心价值 在分布式系统与工业自动化领域,微秒级甚至纳秒级的时间同步已成为刚需。传统NTP协议受限于软件实现和网络抖动,精度通常只能达到毫秒级…...

使用C#代码在 PowerPoint 中组合或取消组合形状

在 PowerPoint 中,对形状进行组合和取消组合是两个非常实用的功能。通过组合,您可以将多个形状整合为一个整体,从而像操作单个对象一样同时移动、设置格式、调整大小或旋转这些形状。而取消组合则可以解除这些形状之间的关联,使您…...

2026 AI 标书工具深度测评:技术原理、功能对比与选型指南

一、行业背景与测评说明1.1 招投标行业数字化痛点传统标书制作存在三大核心痛点:效率低下:一份 100 页的标准标书,纯人工制作需 3-5 天,其中 80% 时间用于解析招标文件、整理框架和填充通用内容废标风险高:据行业统计&…...

Blender3mfFormat终极指南:开启3D打印无缝工作流的新时代

Blender3mfFormat终极指南:开启3D打印无缝工作流的新时代 【免费下载链接】Blender3mfFormat Blender add-on to import/export 3MF files 项目地址: https://gitcode.com/gh_mirrors/bl/Blender3mfFormat 你是否曾为Blender与3D打印软件之间的格式转换而烦恼…...

2023年天梯赛真题解析L2-2(优先级队列)

L2-046 天梯赛的赛场安排 题目链接: https://pintia.cn/problem-sets/994805046380707840/exam/problems/type/7?problemSetProblemId1649748772841508873&page1 题目分析: 本题的考点是结构体优先级队列,因为每个学校包含的信息较多&am…...

工业内窥镜哪家好用?

经常有不同行业的朋友问我,工业内窥镜品牌这么多,到底该怎么选?其实对于大多数企业来说,选择一款适用性广、能满足多种检测场景的设备,才是最划算的。我用了这么多年韦林工业内窥镜,最大的感受就是它几乎能…...

微信小程序 健身服务与轻食间平台系统健身减肥系统

目录同行可拿货,招校园代理 ,本人源头供货商项目概述核心功能模块技术实现亮点商业模式差异化优势项目技术支持源码获取详细视频演示 :同行可合作点击我获取源码->获取博主联系方式->进我个人主页-->同行可拿货,招校园代理 ,本人源头供货商 项目概述 微信…...

昇腾环境300v pro 搭建qwen3 vl

1.启动dockerdocker run -itd \--name qwen-vl-serve \--nethost \--device/dev/davinci0 \--device/dev/davinci_manager \--device/dev/devmm_svm \--device/dev/hisi_hdc \-v /home/zhouty/Qwen3-VL-8B-Instruct:/workspace/models \-v /usr/local/Ascend/driver:/usr/local…...

如何为Claude Code配置Taotoken的API Key与Base地址实现稳定调用

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 如何为Claude Code配置Taotoken的API Key与Base地址实现稳定调用 Claude Code作为一款强大的AI编程助手,其原生服务在某…...