LVGL v8 mulroller 滚轮 / 转盘选择器
lvsf_mulroller 是 SiFli 提供的底层、回调驱动、可深度定制的滚轮(roller)/ 转盘选择控件。它把一条元素带通过拖动滚动,松手后自动吸附(对齐)到居中的那一项作为当前选择,居中项被强调、两侧渐弱,呈现经典滚轮效果。
与声明式的 lvsf_multroller 相比,mulroller 不直接接收选项字符串,而是通过回调按需为每个槽位填充内容:当某个槽位滚动到新的数据索引时,appear_cb 被调用并填入内容;滚轮停稳时 middle_cb 上报当前居中索引。因此只需少量真实元素即可覆盖很大的取值范围,并且可以精细控制布局、缩放、颜色、透明度、循环等。
主要头文件:middleware/lvgl/lvsf/gui_widgets/lvsf_mulroller.h
依赖:
lvsf_baselabel、lvsf_baseimg(需在 lv_conf 中使能)示例工程:example/multimedia/lvgl/lvgl_v8_mulroller
功能简介
横 / 竖两个方向可拖动滚轮,松手后吸附到居中项。
元素内容由
appear_cb回调按需提供,少量元素覆盖大范围取值。支持标签、图片、图片数组、自定义模块四种元素类型。
可分别配置居中项与两侧项的缩放、颜色、透明度,形成大小 / 颜色 / 渐变强调。
支持有界循环(到边界停住)与无限循环(自动绕回)。
支持编码器(滚轮)输入、自定义左右 / 上下边缘对象、自定义字体。
使用场景
时间选择器(时 / 分 / 秒多列滚轮组合)。
日期选择(年 / 月 / 日)、星期选择等需要大范围取值的滚动选择。
图片滚轮、数字转盘、需要自定义居中强调样式的选择界面。
支持的开发板
参考例程 example/multimedia/lvgl/lvgl_v8_mulroller(星期 + 时分时间选择器)在以下开发板验证:
sf32lb52-lcd_n16r8
sf32lb52-lchspi-ulp
也支持 PC 模拟器(scons --board=pc_hcpu)。
配置与初始化
在 menuconfig 中启用对应组件(默认已开启):
CONFIG_LVSF_USE_MULROLLER=y
调用流程:创建对象 → 设置元素类型 → 创建元素 → 注册内容 / 选择回调 → 设置方向 / 对齐 / 布局 / 循环 → 设置缩放 / 颜色 / 透明度范围 → 最后调用 lv_mulroller_validate() 让配置生效。
#include "lvsf_mulroller.h"
/* 滚动时为每个槽位填内容,idx 即该槽位的数据值 */
static bool num_appear_cb(lv_obj_t *child, int16_t idx)
{
lv_label_set_text_fmt(child, "%02d", idx);
return true;
}
/* 停稳时回调,idx 即当前居中(选中)值 */
static bool hh_middle_cb(lv_obj_t *child, int16_t idx)
{
/* 记下选中的小时并刷新读数 */
return true;
}
lv_obj_t *r = lv_mulroller_create(parent);
lv_obj_set_size(r, 78, 156); /* 窗口小于元素总高才可以滚动 */
lv_mulroller_set_obj_type(r, MULROLLER_TYPE_LABEL);
lv_mulroller_create_element(r, 5, 78, 52); /* 5 个元素,可见 3 个 */
lv_mulroller_set_appear_cb(r, num_appear_cb);
lv_mulroller_set_middle_cb(r, hh_middle_cb);
lv_mulroller_set_dir(r, MULROLLER_DIR_VER);
lv_mulroller_set_align(r, MULROLLER_ALIGN_CENTER);
lv_mulroller_set_layout_mode(r, MULROLLER_LAYOUT_MID);
lv_mulroller_set_circle_mode(r, MULROLLER_CIRCLE_NORMAL);
lv_mulroller_set_circle_range(r, 0, 23); /* 取值范围 00..23 */
lv_mulroller_set_zoom_range(r, 36, 24); /* LABEL: 值=字号,中大两侧小 */
lv_mulroller_set_color_mode(r, MULROLLER_COLOR_POS);
lv_mulroller_set_color_range(r, 0xFF0000, 0x9E9E9E);/* 中间红 -> 两侧灰 */
lv_mulroller_set_opa_mode(r, MULROLLER_OPA_MID);
lv_mulroller_set_opa_range(r, 255, 130); /* 中间不透明 -> 两侧渐淡 */
lv_mulroller_validate(r); /* 让以上设置生效 */
警告
能否滚动取决于几何关系:窗口尺寸要小于所有元素的总尺寸(竖向比高、横向比宽),因此要创建比可见数量更多的元素。
无限循环模式(
MULROLLER_CIRCLE_INFINITE)不能与MULROLLER_LAYOUT_OVERLAP同时使用,且元素数量不少于 2。lv_mulroller_set_opa_range()仅在MULROLLER_CIRCLE_NORMAL下有效,无限模式会忽略它。所有设置完成后必须调用
lv_mulroller_validate()才会生效。
API 说明
以下函数签名均逐字来自 lvsf_mulroller.h。
创建与元素
接口函数 |
功能说明 |
参数 / 返回值说明 |
|---|---|---|
|
创建 mulroller 滚轮对象 |
|
|
创建滚轮元素 |
|
|
设置自定义元素 |
仅在 |
|
绑定属性表 |
|
|
校验并使配置生效 |
所有设置完成后必须调用 |
|
刷新传输状态 |
内部刷新用 |
|
按索引获取元素背景对象 |
返回元素背景对象指针 |
|
对齐所有元素 |
|
方向、类型与布局
接口函数 |
功能说明 |
参数 / 返回值说明 |
|---|---|---|
|
设置拖动方向 |
|
|
设置元素对象类型 |
|
|
设置布局模式 |
支持 |
|
设置元素对齐方式 |
见 |
|
设置元素间间隔 |
|
|
设置左上角 / 右下角偏移 |
— |
|
设置左 / 右(或上 / 下)自定义边缘对象 |
滚轮移到对应边缘时显示 |
视觉强调(缩放 / 颜色 / 透明度)
接口函数 |
功能说明 |
参数 / 返回值说明 |
|---|---|---|
|
设置居中 / 两侧元素缩放范围 |
LABEL 类型时值表示字号;中间大、两侧小 |
|
设置颜色变化模式 |
目前主要用 |
|
设置居中 / 两侧颜色范围 |
仅 LABEL 类型 |
|
设置透明度变化模式 |
|
|
设置居中 / 两侧透明度范围 |
仅 NORMAL 循环模式有效 |
|
是否在中间元素显示高亮轮廓 |
— |
|
使用自定义字体 |
|
循环与范围
接口函数 |
功能说明 |
参数 / 返回值说明 |
|---|---|---|
|
设置循环模式 |
|
|
设置有界循环的取值范围 |
仅 |
|
设置初始化时的原始中间索引 |
— |
|
获取当前中间(选中)索引 |
返回当前居中数据索引 |
|
设置轮子(编码器)每格换算距离的缩放比例 |
— |
|
设置投掷(惯性)每像素换算距离的缩放比例 |
— |
回调
接口函数 |
功能说明 |
参数 / 返回值说明 |
|---|---|---|
|
元素进入新数据索引时回调 |
在此填充元素显示内容 |
|
滚轮停稳时回调,上报当前中间索引 |
读取选中值的入口 |
|
滚轮移动过程中的回调 |
移动时持续触发 |
动画与其它
接口函数 |
功能说明 |
参数 / 返回值说明 |
|---|---|---|
|
创建滚轮动画 |
|
|
删除当前动画 |
— |
|
设置移动百分比 |
— |
|
使能 / 关闭元素快照 |
仅在 |
|
扩展滚轮区域 |
当前实现预留 |
|
创建方向掩码 |
当前实现预留 |
|
使能 / 关闭编码器输入 |
仅在 |
典型用法
完整可运行例程见 example/multimedia/lvgl/lvgl_v8_mulroller,一屏内组合了顶部横向无限循环星期轮和中部两个竖向有界数字轮(时:分)。核心模式:
/* 横向无限循环星期轮:方向改 HOR、循环改 INFINITE,appear_cb 里用 idx 查名字表并对 7 取模 */
static bool week_appear_cb(lv_obj_t *label, int16_t idx)
{
static const char *names[7] = { "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun" };
lv_label_set_text(label, names[idx % 7]);
return true;
}
lv_obj_t *week = lv_mulroller_create(parent);
lv_obj_set_size(week, 240, 60);
lv_mulroller_set_obj_type(week, MULROLLER_TYPE_LABEL);
lv_mulroller_create_element(week, 5, 80, 60);
lv_mulroller_set_appear_cb(week, week_appear_cb);
lv_mulroller_set_dir(week, MULROLLER_DIR_HOR);
lv_mulroller_set_circle_mode(week, MULROLLER_CIRCLE_INFINITE);
lv_mulroller_validate(week);
备注
mulroller 与 multroller 定位互补:multroller 只需传入 '\n' 分隔的选项字符串即可,适合“给一组文字、选一个”的简单场景;mulroller 通过回调填充内容并暴露布局 / 缩放 / 颜色 / 循环等全部细节,适合高度定制的滚轮界面。
效果展示
滚轮拖动、松手吸附、居中项强调两侧渐弱的效果(参考 multroller 滚轮动画):
参考文档
头文件:middleware/lvgl/lvsf/gui_widgets/lvsf_mulroller.h
示例工程:example/multimedia/lvgl/lvgl_v8_mulroller
相关控件:
lvsf_multroller(声明式滚轮)