LVGL v8 multlist 列表控件
lvsf_multlist 是 SiFli 为 LVGL v8 封装的高性能可滑动列表容器,用于把多个同构元素按行(垂直)或按列(水平)组织起来,并统一管理滑动、惯性、对齐、回弹、缩放变形、节点增删改查等行为。它解决的是应用层反复手写“可滑动 + 自动对齐 + 边界回弹 + 动态加载 item”的问题,常见于主菜单、卡片流、封面流、聊天消息流、平铺式(TLV)页面等场景。
主要头文件:middleware/lvgl/lvsf/gui_widgets/lvsf_multlist.h
实现目录:middleware/lvgl/lvsf/gui_widgets/
示例工程:example/multimedia/lvgl/lvgl_v8_multlist
备注
multlist 本身是“列表容器”,具体每个 item 的视觉内容由应用通过 create / remove 回调动态创建和销毁。它与 lvsf_multswipe、lvsf_multedge、lvsf_scrollbar 组成插件化体系,三者通过 multlist 发出的事件联动,详见各控件文档。
功能简介
垂直 / 水平两个方向的可滑动列表,支持惯性滑动(throw)、循环(loop)和按页翻转。
滑动结束后自动对齐:支持无对齐、头对齐、居中对齐、尾对齐,并可配置距离 / 速度阈值。
边界回弹:可分别配置头尾的最大拖拽距离与回弹后的停靠位置。
动态 item:通过链表管理 item 节点,屏幕外 item 可动态创建 / 销毁,节省内存;支持带删除动画的节点移除与重排。
视觉变形:可使能贝塞尔(bezier)缩放算法和椭圆(ellipse)弧形偏移算法,实现中心 item 大、两侧 item 缩小或弧形排列的效果。
编码器(滚轮)支持:可通过旋转编码器驱动 item 移动。
插件联动:通过 flag 与事件与滑动删除(multswipe)、侧边边缘(multedge)、滚动条(scrollbar)等控件配合。
使用场景
应用主菜单 / 启动器图标列表、卡片流、封面流横向浏览。
整屏图片或页面的水平 / 垂直轮播、翻页。
聊天 / 对讲风格的消息流(节点信息动态增删)。
需要 item 随滑动距离做缩放、透明度、3D 翻转等过渡动画的聚焦式浏览界面。
需要外接滚轮编码器切换选项的列表界面。
支持的开发板
参考例程 example/multimedia/lvgl/lvgl_v8_multlist 在以下开发板验证:
sf32lb52-lcd_n16r8
sf32lb52-lchspi-ulp
工程可通过 scons --board=<board> 适配不同板型,支持 SF32LB52x / SF32LB56x / SF32LB58x 等系列板子。
配置与初始化
在 menuconfig 中启用对应组件(默认已开启):
CONFIG_LVSF_USE_MULTLIST=y
控件内部用一组 flag 控制功能开关,通过 lv_multlist_add_flag() / lv_multlist_clear_flag() 使能或关闭。常用 flag 见下表:
flag |
含义 |
|---|---|
|
使能惯性滑动,默认使能 |
|
使能 item 循环模式 |
|
居中对齐时按 item 间隔(而非 item 中心)对齐屏幕中心 |
|
使能贝塞尔缩放算法,设置贝塞尔参数后需使能 |
|
使能椭圆弧形偏移 |
|
滑动聚焦动画结束时发送 edge 事件,用于与 multedge 交互 |
|
滑动时发送 scrollbar 事件,用于与 scrollbar 交互 |
|
滑动动画结束时将两个 item 间的分隔线对齐到中心点 |
|
锁定滚动,禁止滑动 |
|
动态拍照模式,屏幕外 item 会被删除 |
|
对所有 item 拍照并保留,不删除 |
|
两页 / 三页刷新模式 |
|
节点无限模式 |
|
元素总长度小于 multlist 长度时的对齐方式(无限模式用) |
|
元素不足一屏时默认头对齐 |
初始化流程
典型的创建、配置、回调注册、添加节点、初始对齐流程如下(摘自例程 demo_multlist_list.c):
#include "lvsf_multlist.h"
lv_obj_t *list = lv_multlist_create(lv_scr_act());
lv_obj_remove_style_all(list);
lv_obj_set_size(list, LV_HOR_RES_MAX, LV_VER_RES_MAX);
lv_obj_set_style_bg_color(list, lv_color_make(82, 93, 118), 0);
lv_obj_set_style_bg_opa(list, LV_OPA_COVER, 0);
lv_obj_center(list);
/* 贝塞尔变形 + 间距 + 拖拽边界 + 方向 */
float para[] = { 0, 0, 0, 0.1f, 0.3f };
lv_multlist_set_bezier_para(list, LV_VER_RES_MAX, para, para);
lv_multlist_set_gap(list, 20);
lv_multlist_set_scrl_pad(list, LV_VER_RES_MAX >> 1, LV_VER_RES_MAX >> 1);
lv_multlist_set_dir(list, LV_MULTLIST_DIR_VER);
/* 注册 item 生命周期回调,再添加节点信息 */
lv_multlist_set_item_cb(list, demo_create_item, NULL, NULL);
for (uint32_t i = 0; i < 100; i++)
{
lv_multlist_add_info(list, LV_HOR_RES, 110, NULL, NULL);
}
/* 回弹位置与初始对齐 */
lv_multlist_set_springback(list, 0, 0);
lv_multlist_align_to(list, LV_MULTLIST_ALIGN_HEAD, 0, 0, 0);
页面恢复 / 暂停时通常配合编码器与生命周期调用:
/* resume */
lv_multlist_on_resume(list);
lv_multlist_enable_encoder(list, 5, 400, false);
/* pause */
lv_multlist_on_pause(list);
lv_multlist_disable_encoder(list);
警告
lv_multlist_add_info() 必须传入预估准确的 item 宽高。宽高偏差会直接导致元素对齐位置偏移、滚动条进度不准。清空所有节点后再对齐时,建议先把位置重置到有效 pos,避免历史 pos 超出范围导致 item 显示不全。
API 说明
以下函数签名均逐字来自 lvsf_multlist.h。
基础对象与 flag
接口函数 |
功能说明 |
参数 / 返回值说明 |
|---|---|---|
|
创建 multlist 列表对象 |
|
|
获取触摸手势方向 |
返回当前手势方向枚举 |
|
查询是否已设置指定 flag |
已设置返回非 0,否则返回 0 |
|
添加指定功能 flag(使能对应功能) |
|
|
清除指定 flag(关闭对应功能) |
|
|
根据当前滚动位置刷新所有 item |
滚动位置 / 属性变化后调用 |
|
检查所有 item 总长度是否超过 multlist 高度 |
超出返回 true(1),否则返回 false(0) |
滚动与位置
接口函数 |
功能说明 |
参数 / 返回值说明 |
|---|---|---|
|
直接设置滚动位置(无动画跳转) |
|
|
获取当前滚动位置 |
返回当前滚动位置(像素) |
|
配置 item 动态拍照(snapshot)回调与图像格式 |
|
|
设置头尾可拖拽的最大偏移距离 |
|
|
设置额外展示区域,超出后 item 被移除 |
默认 0,控制 item 销毁阈值 |
|
设置相邻 item 之间的间距 |
|
|
设置滚动方向 |
|
|
获取滚动方向 |
返回当前方向枚举 |
|
设置越界滑动结束后的回弹停靠位置 |
|
|
计算头部回弹区域位置 |
返回头部回弹位置(像素) |
|
计算尾部回弹区域位置 |
返回尾部回弹位置(像素) |
对齐控制
接口函数 |
功能说明 |
参数 / 返回值说明 |
|---|---|---|
|
设置滑动结束后的默认对齐方式 |
|
|
设置首次(恢复时)的对齐方式 |
|
|
计算指定 item 对齐到目标位置所需的滚动值 |
返回所需滚动位置(像素) |
|
相对偏移滚动并对齐最近 item |
|
|
将指定索引 item 对齐到头部 |
|
|
将指定索引 item 对齐到尾部 |
|
|
将指定索引 item 对齐到中心 |
|
|
以动画将指定 item 对齐到目标位置 |
|
|
设置翻页对齐的距离 / 速度阈值 |
滑动距离或速度超过阈值即触发下一页对齐 |
item 节点管理
接口函数 |
功能说明 |
参数 / 返回值说明 |
|---|---|---|
|
向链表添加节点信息,滑动时动态加载 item |
|
|
item 属性变化时强制刷新元素 |
|
|
在参考项前插入 item(无动画) |
成功返回 1,失败返回 0 |
|
以删除动画移除 item |
|
|
把 item 移动到参考项之前 |
|
|
移除所有由 add_info 添加的节点信息 |
常用于 pause 后重建节点 |
|
依据已添加节点信息加载所有 item |
— |
|
获取节点信息数量 |
返回节点数 |
|
获取当前居中的 item |
返回居中 item 句柄 |
|
获取当前对齐点处的 item |
|
|
按索引获取 item 句柄 |
返回对应 item 句柄 |
变形与特效
接口函数 |
功能说明 |
参数 / 返回值说明 |
|---|---|---|
|
设置 item 缩放的贝塞尔参数 |
|
|
设置 item 弧形(椭圆)偏移 |
|
|
环形列表模式下设置角度 |
|
|
设置环形列表半径 |
|
|
设置堆叠(重叠)item 数量 |
堆叠菜单专用 |
|
设置 item 变换中心相对中心的偏移 |
用于缩放 / 旋转的支点偏移 |
动画与回调
接口函数 |
功能说明 |
参数 / 返回值说明 |
|---|---|---|
|
设置动画基础参数 |
|
|
设置 item 飞入 / 飞出动画 |
|
|
创建自定义列表动画 |
返回动画句柄 |
|
设置自定义刷新回调 |
替代默认刷新逻辑时使用 |
|
设置分页模式动画回调 |
多页刷新时触发 |
|
设置 item 变换回调 |
自定义缩放 / 透明度 / 层级等变形 |
|
注册 item 生命周期回调 |
|
编码器与生命周期
接口函数 |
功能说明 |
参数 / 返回值说明 |
|---|---|---|
|
使能编码器(滚轮)控制 item 移动 |
|
|
禁用编码器 |
— |
|
暂停列表:移除所有显示 item 并停止刷新 |
页面 pause 时调用 |
|
恢复列表:重新加载 item 并恢复刷新 |
页面 resume 时调用 |
事件
multlist 在特定状态下向对象发送自定义事件,应用通过 lv_obj_add_event_cb() 监听:
事件 |
含义 |
|---|---|
|
开始滑动 / 滑动中 / 滑动结束 |
|
item 对齐到目标位置时发送 |
|
item 离开对齐位置时发送 |
|
通知 scrollbar 更新进度 |
|
与 multedge 联动的边缘拖拽请求 / 开始 / 拖拽中 / 结束等事件 |
|
有 item 被滑动删除时发送 |
典型用法
完整可运行例程见 example/multimedia/lvgl/lvgl_v8_multlist,包含普通列表、按页翻转、自定义动画、聊天消息流等子页面。最小调用序列如下:
/* 1. 创建并配置 */
lv_obj_t *list = lv_multlist_create(lv_scr_act());
lv_multlist_set_dir(list, LV_MULTLIST_DIR_VER);
lv_multlist_set_gap(list, 20);
lv_multlist_set_scrl_pad(list, LV_VER_RES_MAX >> 1, LV_VER_RES_MAX >> 1);
/* 2. 注册 item 创建回调(在回调里真正创建每个 item 的控件树) */
lv_multlist_set_item_cb(list, my_create_item, NULL, NULL);
/* 3. 添加节点信息(item 真正的控件在滑入屏幕时才由回调创建) */
lv_multlist_add_info(list, LV_HOR_RES, 110, user_info, NULL);
/* 4. 设置对齐与回弹 */
lv_multlist_set_align(list, LV_MULTLIST_ALIGN_CENTER, 0);
lv_multlist_set_springback(list, 0, 0);
lv_multlist_align_center_to(list, 0, 0);
/* 5. resume 时使能编码器,pause 时停止 */
lv_multlist_on_resume(list);
lv_multlist_enable_encoder(list, 5, 400, false);
item 创建回调示例(摘自例程):
static lv_obj_t *demo_create_item(lv_obj_t *parent, lv_multlist_item_t *item)
{
lv_obj_t *item_bg = lv_obj_create(parent);
lv_obj_remove_style_all(item_bg);
lv_obj_set_size(item_bg, item->org_w, item->org_h);
lv_obj_set_style_bg_color(item_bg, ITEM_BG_COLOR, LV_STATE_DEFAULT);
lv_obj_set_style_bg_opa(item_bg, LV_OPA_100, LV_STATE_DEFAULT);
lv_obj_add_flag(item_bg, LV_OBJ_FLAG_PRESS_LOCK | LV_OBJ_FLAG_EVENT_BUBBLE);
lv_obj_clear_flag(item_bg, LV_OBJ_FLAG_SCROLLABLE);
/* ... 在 item_bg 上继续放置图片、文本等内容 ... */
return item_bg;
}
效果展示
常规垂直列表滑动与居中对齐效果:
单独使能贝塞尔缩放变形(左右两图分别为仅贝塞尔、贝塞尔 + 椭圆偏移):
头部回弹区域(head)与尾部回弹区域(tail)示意:
参考文档
头文件:middleware/lvgl/lvsf/gui_widgets/lvsf_multlist.h
示例工程:example/multimedia/lvgl/lvgl_v8_multlist