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

在许多现代移动操作系统中,音量调节控件都朝着极简、圆润、无球形 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)和默认值为50
    lv_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 表达力;
  • 响应滑动值变化,联动硬件(如调节真实音量);
  • 加入动画效果让填充条过渡更丝滑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

花落已飘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值