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

用 LVGL 打造苹果风格音量滑块:圆润无球,极简优雅

文章目录

    • ✨ 效果预览
    • 🔧 实现代码
    • 🧠 逐行讲解核心思路
      • 1. 创建滑块并设置大小
      • 2. 设置取值范围与默认值
      • 3. 完全隐藏 knob(小圆球)
      • 4. 设置滑块背景条样式(未填充部分)
      • 5. 设置滑块填充条样式(已滑动部分)
    • 🎨 样式可拓展建议
    • 📌 总结
    • ✅ 下一步建议

在许多现代移动操作系统中,音量调节控件都朝着极简、圆润、无球形 knob的方向演进,尤其是 Apple 系统中的滑块,极具设计美感。那么在嵌入式 GUI 框架 LVGL 中,如何还原出这样一个高质量的滑块控件呢?

本文将带你逐行解析如何用 LVGL 创建一个仿苹果风格的音量滑块,无 knob 圆球、宽条圆角,视觉舒适,功能完整,非常适合触摸屏应用。


✨ 效果预览

你将实现如下效果:

  • 宽度达 300 像素,高度为 20 像素,贴合手指操作;
  • 圆角处理,像一个大胶囊;
  • 中间没有圆球(knob)
  • 灰白背景 + 白色填充条,风格简洁现代;
  • 可设置范围值(0~100)与默认值(50);
  • 纯代码实现,适用于任意嵌入式屏幕。

🔧 实现代码

我们直接来看完整代码,然后逐行讲解它的每一个细节:

#include "lvgl.h"void create_apple_volume_slider(void)
{// 创建滑块对象lv_obj_t *slider = lv_slider_create(lv_scr_act());lv_obj_set_size(slider, 300, 20); // 更宽更高lv_obj_center(slider);           // 居中显示// 设置滑块取值范围(0~100)和默认值为50lv_slider_set_range(slider, 0, 100);lv_slider_set_value(slider, 50, LV_ANIM_OFF);// 隐藏 knob(苹果风格中没有小圆球)lv_obj_clear_flag(slider, LV_OBJ_FLAG_CLICK_FOCUSABLE); // 取消点击高亮lv_obj_set_style_bg_opa(slider, LV_OPA_TRANSP, LV_PART_KNOB); // knob 透明lv_obj_set_style_border_width(slider, 0, LV_PART_KNOB);       // knob 无边框// 背景条样式(灰色、圆角)lv_obj_set_style_radius(slider, LV_RADIUS_CIRCLE, LV_PART_MAIN);lv_obj_set_style_bg_color(slider, lv_palette_lighten(LV_PALETTE_GREY, 3), LV_PART_MAIN);lv_obj_set_style_bg_opa(slider, LV_OPA_COVER, LV_PART_MAIN);lv_obj_set_style_pad_all(slider, 0, LV_PART_MAIN);lv_obj_set_style_border_width(slider, 0, LV_PART_MAIN);// 填充区域(已滑动部分)样式(白色、圆角)lv_obj_set_style_radius(slider, LV_RADIUS_CIRCLE, LV_PART_INDICATOR);lv_obj_set_style_bg_color(slider, lv_color_white(), LV_PART_INDICATOR);lv_obj_set_style_bg_opa(slider, LV_OPA_COVER, LV_PART_INDICATOR);lv_obj_set_style_border_width(slider, 0, LV_PART_INDICATOR);
}

🧠 逐行讲解核心思路

1. 创建滑块并设置大小

lv_obj_t *slider = lv_slider_create(lv_scr_act());
lv_obj_set_size(slider, 300, 20);
lv_obj_center(slider);
  • 在当前活动屏幕中创建滑块;
  • 设置为宽 300、高 20,较为宽大,视觉上更舒适;
  • 居中显示。

2. 设置取值范围与默认值

lv_slider_set_range(slider, 0, 100);
lv_slider_set_value(slider, 50, LV_ANIM_OFF);
  • 音量范围为 0 到 100;
  • 默认值为 50,即滑块指示条居中。

3. 完全隐藏 knob(小圆球)

lv_obj_clear_flag(slider, LV_OBJ_FLAG_CLICK_FOCUSABLE);
lv_obj_set_style_bg_opa(slider, LV_OPA_TRANSP, LV_PART_KNOB);
lv_obj_set_style_border_width(slider, 0, LV_PART_KNOB);
  • LV_OBJ_FLAG_CLICK_FOCUSABLE 会在点击后出现焦点高亮,我们取消它;
  • 设置 knob 背景透明、无边框,从而彻底隐藏 knob
  • 这一步让滑块看起来只是一个“带进度的长条”。

4. 设置滑块背景条样式(未填充部分)

lv_obj_set_style_radius(slider, LV_RADIUS_CIRCLE, LV_PART_MAIN);
lv_obj_set_style_bg_color(slider, lv_palette_lighten(LV_PALETTE_GREY, 3), LV_PART_MAIN);
lv_obj_set_style_bg_opa(slider, LV_OPA_COVER, LV_PART_MAIN);
lv_obj_set_style_pad_all(slider, 0, LV_PART_MAIN);
lv_obj_set_style_border_width(slider, 0, LV_PART_MAIN);
  • 使用 LV_RADIUS_CIRCLE 实现胶囊样式;
  • 设置背景为浅灰色;
  • 无 padding、无边框,显得干净利落。

5. 设置滑块填充条样式(已滑动部分)

lv_obj_set_style_radius(slider, LV_RADIUS_CIRCLE, LV_PART_INDICATOR);
lv_obj_set_style_bg_color(slider, lv_color_white(), LV_PART_INDICATOR);
lv_obj_set_style_bg_opa(slider, LV_OPA_COVER, LV_PART_INDICATOR);
lv_obj_set_style_border_width(slider, 0, LV_PART_INDICATOR);
  • 同样使用圆角;
  • 设置颜色为白色(你可以改成蓝色、绿色以符合系统风格);
  • 无边框,统一视觉风格。

代码效果:

在这里插入图片描述

🎨 样式可拓展建议

你可以根据系统风格自定义:

样式元素示例颜色
背景条颜色lv_palette_lighten(LV_PALETTE_GREY, 3)
进度条颜色lv_color_white()lv_palette_main(...)
圆角风格LV_RADIUS_CIRCLE 或手动设置半径

📌 总结

通过 LVGL 提供的滑块和样式系统,我们可以非常灵活地创建类似苹果系统的音量滑块,甚至可以做出亮度条、电池控制等类似组件。

这类控件不仅外观现代、交互直观,而且能够在嵌入式设备上高效运行,非常适合用于:

  • 音量调节
  • 屏幕亮度控制
  • 电机占空比设置
  • 环境数值微调(如温度、湿度)

✅ 下一步建议

你可以尝试:

  • 添加图标(🔊 / 🔇)来增强 UI 表达力;
  • 响应滑动值变化,联动硬件(如调节真实音量);
  • 加入动画效果让填充条过渡更丝滑。
http://www.xdnf.cn/news/5396.html

相关文章:

  • TCP/IP 模型每层的封装格式
  • C++ stl中的set、multiset、map、multimap的相关函数用法
  • SQL语句的优化
  • 学习和测试WebApi项目限制客户端ip访问接口(基于中间件)
  • Python httpx库终极指南
  • 端口号被占用怎么解决
  • 《Effective Python》第1章 Pythonic 思维详解——深入理解 Python 条件表达式(Conditional Expressions)
  • JAVA EE_网络原理_网络层
  • PowerShell 脚本中文乱码处理
  • 《Linux命令行大全(第2版)》PDF下载
  • TAPIP3D:持久3D几何中跟踪任意点
  • Java--图书管理系统(简易版优化)
  • Oracle — 内置函数
  • Python Bug 修复案例分析:多线程数据竞争引发的bug 两种修复方法
  • Java多态详解
  • 图形学、人机交互、VR/AR领域文献速读【持续更新中...】
  • TypeScript 类型保护详解
  • 《Go小技巧易错点100例》第三十一篇
  • stm32week15
  • 轻量服务器与宝塔
  • 【递归、搜索与回溯算法】导论
  • 2025第九届御网杯网络安全大赛线上赛 区域赛WP (MISC和Crypto)(详解-思路-脚本)
  • [Java实战]Spring Boot 快速配置 HTTPS 并实现 HTTP 自动跳转(八)
  • Java反序列化漏洞
  • 第一章 初识Java
  • Kotlin Multiplatform--03:项目实战
  • 机器学习总结
  • C/C++实践(四)C++跨平台开发的系统性挑战与深度解决方案
  • 基于SpringBoot的小区停车位管理系统
  • 集合(1)