文章目录
- 🎡 `lv_roller` 组件详解:LVGL 的滚轮选择器
- 🧱 一、基本用法
- ✅ 创建一个 `lv_roller`
- 🔧 二、常用 API
- 🎨 三、滚动模式详解
- 🧰 四、设置可见行数
- 📞 五、事件处理
- 🌈 六、示例:创建一个时间选择器
- 📌 总结
- 🧠 小提示
🎡 lv_roller 组件详解:LVGL 的滚轮选择器
lv_roller 是 LVGL 中的滚动选择控件,非常适合用于需要从一组选项中选择一个条目的场景,比如设置界面中的时间选择、日期选择、语言选择等。它类似于移动设备上的“滚轮式选择器”。
🧱 一、基本用法
✅ 创建一个 lv_roller
lv_obj_t * roller = lv_roller_create(lv_scr_act());
lv_roller_set_options(roller,"Apple\n""Banana\n""Orange\n""Grape\n""Cherry",LV_ROLLER_MODE_NORMAL);
- 创建对象
- 设置选项(
\n分隔) - 选择滚动模式(
NORMAL或INFINITE)
🔧 二、常用 API
| 函数 | 说明 |
|---|---|
lv_roller_set_options() | 设置选项,\n 分隔 |
lv_roller_set_selected() | 设置当前选中项索引 |
lv_roller_get_selected() | 获取当前选中项索引 |
lv_roller_get_selected_str() | 获取当前选中项字符串 |
lv_roller_set_visible_row_count() | 设置显示的行数(默认 3) |
lv_roller_set_mode() | 设置滚动模式(正常/循环) |
🎨 三、滚动模式详解
lv_roller_set_mode(roller, LV_ROLLER_MODE_NORMAL); // 滚到顶/底就停下
lv_roller_set_mode(roller, LV_ROLLER_MODE_INFINITE); // 无限循环滚动
NORMAL模式适合有限选项(如设置温度)INFINITE模式更适合时间/日期滚轮
🧰 四、设置可见行数
lv_roller_set_visible_row_count(roller, 4);
- 设置“窗口”中同时可见的选项行数
- 建议奇数值(中间选项会居中)
📞 五、事件处理
当用户选择某项时会触发 LV_EVENT_VALUE_CHANGED:
void roller_event_cb(lv_event_t * e)
{lv_obj_t * obj = lv_event_get_target(e);char buf[32];lv_roller_get_selected_str(obj, buf, sizeof(buf));LV_LOG_USER("选中项: %s", buf);
}lv_obj_add_event_cb(roller, roller_event_cb, LV_EVENT_VALUE_CHANGED, NULL);
🌈 六、示例:创建一个时间选择器
lv_obj_t * roller_hour = lv_roller_create(lv_scr_act());
lv_roller_set_options(roller_hour,"00\n01\n02\n03\n04\n05\n06\n07\n08\n09\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23",LV_ROLLER_MODE_INFINITE);
lv_roller_set_visible_row_count(roller_hour, 5);
lv_obj_align(roller_hour, LV_ALIGN_CENTER, -60, 0);lv_obj_t * roller_min = lv_roller_create(lv_scr_act());
lv_roller_set_options(roller_min,"00\n05\n10\n15\n20\n25\n30\n35\n40\n45\n50\n55",LV_ROLLER_MODE_INFINITE);
lv_roller_set_visible_row_count(roller_min, 5);
lv_obj_align(roller_min, LV_ALIGN_CENTER, 60, 0);
✅ 一个简单的时钟选择器就完成了!
📌 总结
| 功能 | 函数 |
|---|---|
| 设置选项 | lv_roller_set_options() |
| 设置模式 | lv_roller_set_mode() |
| 获取选项索引 | lv_roller_get_selected() |
| 获取选项文本 | lv_roller_get_selected_str() |
| 设置显示行数 | lv_roller_set_visible_row_count() |
| 添加事件回调 | lv_obj_add_event_cb() |
🧠 小提示
- 滚轮行数不宜太多,建议 3~7 行为佳
INFINITE模式滚动流畅,体验更现代- 可配合样式美化实现高仿 iOS 选择器
