lv_obj_scroll_by没有效果
时间: 2023-08-01 21:07:03 浏览: 74
如果 `lv_obj_scroll_by` 函数没有生效,您可以尝试检查以下几个方面:
1. 确认您传递给函数的参数是否正确,特别是滚动的像素数是否大于对象的大小。
2. 确认对象是否被正确创建和添加到父对象中。如果对象没有被正确添加到父对象中,它可能无法被正确渲染和滚动。
3. 确认对象的滚动属性是否被启用。您可以使用 `lv_obj_set_scrollbar_mode` 函数来启用对象的滚动属性,例如:
```c
lv_obj_set_scrollbar_mode(obj, LV_SCROLLBAR_MODE_AUTO);
```
4. 确认对象的大小是否被正确设置。如果对象的大小太小,它可能无法被正确滚动。
如果您仍然无法解决问题,可以尝试使用 `lv_obj_scroll_to_view` 函数来将对象滚动到父对象的可见区域内。如果仍然无法解决问题,请查看 LittlevGL 的文档或在 LittlevGL 的论坛中提问。
相关问题
static void lv_frd_scroll_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) { LV_UNUSED(class_p); lv_obj_set_scrollbar_mode(obj, LV_SCROLLBAR_MODE_OFF); lv_obj_set_scroll_dir(obj, LV_DIR_HOR); lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_ROW); lv_obj_set_scroll_snap_x(obj, LV_SCROLL_SNAP_CENTER); lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_ONE); lv_obj_clear_flag(obj, LV_OBJ_FLAG_SCROLL_ON_FOCUS); //lv_obj_set_style_border_width(obj, 1, LV_PART_MAIN); lv_obj_set_flex_align(obj, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); lv_obj_set_style_pad_all(obj, 0, LV_PART_MAIN); lv_obj_set_style_pad_column(obj, 10, LV_PART_MAIN); }帮我注释这段代码,并详细说说他是干啥的
这段代码定义了一个名为 `lv_frd_scroll_constructor` 的静态函数,其作用是构造一个滚动对象。
首先通过 `lv_obj_set_scrollbar_mode` 函数设置滚动对象的滚动条模式为 `LV_SCROLLBAR_MODE_OFF`,即不显示滚动条;然后通过 `lv_obj_set_scroll_dir` 函数设置滚动对象的滚动方向为横向滚动;接着通过 `lv_obj_set_flex_flow` 函数设置滚动对象的布局模式为流式布局,即子对象自动换行排列;并通过 `lv_obj_set_scroll_snap_x` 函数设置滚动对象的横向滚动对齐方式为居中对齐。
接下来,通过 `lv_obj_add_flag` 函数为滚动对象添加一个滚动一次的标志位,并通过 `lv_obj_clear_flag` 函数清除滚动对象在获得焦点时自动滚动的标志位。然后通过 `lv_obj_set_flex_align` 函数设置滚动对象内部子对象的对齐方式为居中对齐。最后通过 `lv_obj_set_style_pad_all` 和 `lv_obj_set_style_pad_column` 函数设置滚动对象内部子对象的内边距。
注释后的代码如下:
```c
static void lv_frd_scroll_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) {
LV_UNUSED(class_p);
// 设置滚动条模式为不显示滚动条
lv_obj_set_scrollbar_mode(obj, LV_SCROLLBAR_MODE_OFF);
// 设置滚动方向为横向滚动
lv_obj_set_scroll_dir(obj, LV_DIR_HOR);
// 设置布局模式为流式布局
lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_ROW);
// 设置横向滚动对齐方式为居中对齐
lv_obj_set_scroll_snap_x(obj, LV_SCROLL_SNAP_CENTER);
// 添加滚动一次的标志位,清除自动滚动标志位
lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_ONE);
lv_obj_clear_flag(obj, LV_OBJ_FLAG_SCROLL_ON_FOCUS);
// 设置子对象对齐方式为居中对齐
lv_obj_set_flex_align(obj, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);
// 设置子对象内边距
lv_obj_set_style_pad_all(obj, 0, LV_PART_MAIN);
lv_obj_set_style_pad_column(obj, 10, LV_PART_MAIN);
}
```
void lv_example_scroll_2_dir(void) { #if 1 lv_obj_t* cont = lv_obj_create(lv_scr_act()); lv_obj_set_size(cont, 400, 300); lv_obj_add_flag(cont, LV_OBJ_FLAG_SCROLL_ONE); /*Allow max 1 page swipe*/ lv_obj_set_scroll_snap_x(cont, LV_SCROLL_SNAP_CENTER); /*Snap a page to the center*/ lv_obj_set_scrollbar_mode(cont, LV_SCROLLBAR_MODE_OFF); lv_obj_add_event_cb(cont, scroll_end_event, LV_EVENT_SCROLL_BEGIN/*LV_EVENT_ALL*//*LV_EVENT_SCROLL*//*LV_EVENT_SCROLL_END*/, NULL); lv_obj_add_event_cb(cont, scroll_end_event, LV_EVENT_SCROLL_END, NULL); lv_obj_center(cont); /*A grid for the left center and right pages*/ lv_coord_t col_dsc[] = { LV_GRID_CONTENT, LV_GRID_CONTENT, LV_GRID_CONTENT, LV_GRID_CONTENT, LV_GRID_CONTENT, LV_GRID_TEMPLATE_LAST }; lv_coord_t row_dsc[] = { LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST }; lv_obj_set_grid_dsc_array(cont, col_dsc, row_dsc); /*Create 5 pages*/ for (int i = 0; i < 10; i++) { lv_obj_t* obj = lv_obj_create(cont); lv_obj_set_size(obj, lv_pct(33), lv_pct(100)); lv_obj_t* label = lv_label_create(obj); lv_label_set_text_fmt(label, "Page %d", i); lv_obj_set_style_border_width(obj, 0, 0); } /*Page 2, 3 hidden, page 4, 0, 1 are placed to the grid */ //lv_obj_add_flag(lv_obj_get_child(cont, 2), LV_OBJ_FLAG_HIDDEN); //lv_obj_add_flag(lv_obj_get_child(cont, 3), LV_OBJ_FLAG_HIDDEN); //lv_obj_set_grid_cell(lv_obj_get_child(cont, 4), LV_GRID_ALIGN_CENTER, 0, 1, LV_GRID_ALIGN_CENTER, 0, 1); //lv_obj_set_grid_cell(lv_obj_get_child(cont, 0), LV_GRID_ALIGN_CENTER, 1, 1, LV_GRID_ALIGN_CENTER, 0, 1); //lv_obj_set_grid_cell(lv_obj_get_child(cont, 1), LV_GRID_ALIGN_CENTER, 2, 1, LV_GRID_ALIGN_CENTER, 0, 1); lv_obj_set_grid_cell(lv_obj_get_child(cont, 0), LV_GRID_ALIGN_CENTER, 0, 1, LV_GRID_ALIGN_CENTER, 0, 1); lv_obj_set_grid_cell(lv_obj_get_child(cont, 1), LV_GRID_ALIGN_CENTER, 1, 1, LV_GRID_ALIGN_CENTER, 0, 1); lv_obj_set_grid_cell(lv_obj_get_child(cont, 2), LV_GRID_ALIGN_CENTER, 2, 1, LV_GRID_ALIGN_CENTER, 0, 1); lv_obj_set_grid_cell(lv_obj_get_child(cont, 3), LV_GRID_ALIGN_CENTER, 3, 1, LV_GRID_ALIGN_CENTER, 0, 1); lv_obj_set_grid_cell(lv_obj_get_child(cont, 4), LV_GRID_ALIGN_CENTER, 4, 1, LV_GRID_ALIGN_CENTER, 0, 1); /*Be sure page 0 is centered*/ lv_obj_scroll_to_view(lv_obj_get_child(cont, 0), LV_ANIM_OFF); }帮我注释一下这段代码
这段代码是 LittlevGL (LVGL)的示例代码,实现了一个可以左右滑动的页面(类似于轮播图),页面可以居中对齐。下面是代码注释:
```C
void lv_example_scroll_2_dir(void) {
/*创建一个容器,作为滑动页面的容器*/
lv_obj_t* cont = lv_obj_create(lv_scr_act());
lv_obj_set_size(cont, 400, 300);
/*设置容器只能左右滑动一页*/
lv_obj_add_flag(cont, LV_OBJ_FLAG_SCROLL_ONE);
/*设置容器滑动时,页面停留在中心*/
lv_obj_set_scroll_snap_x(cont, LV_SCROLL_SNAP_CENTER);
/*关闭滚动条*/
lv_obj_set_scrollbar_mode(cont, LV_SCROLLBAR_MODE_OFF);
/*容器添加滑动事件*/
lv_obj_add_event_cb(cont, scroll_end_event, LV_EVENT_SCROLL_BEGIN/*LV_EVENT_ALL*//*LV_EVENT_SCROLL*//*LV_EVENT_SCROLL_END*/, NULL);
lv_obj_add_event_cb(cont, scroll_end_event, LV_EVENT_SCROLL_END, NULL);
/*容器居中*/
lv_obj_center(cont);
/*创建一个网格,用于布局页面*/
lv_coord_t col_dsc[] = { LV_GRID_CONTENT, LV_GRID_CONTENT, LV_GRID_CONTENT, LV_GRID_CONTENT, LV_GRID_CONTENT, LV_GRID_TEMPLATE_LAST };
lv_coord_t row_dsc[] = { LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST };
lv_obj_set_grid_dsc_array(cont, col_dsc, row_dsc);
/*创建 10 个页面*/
for (int i = 0; i < 10; i++) {
lv_obj_t* obj = lv_obj_create(cont);
lv_obj_set_size(obj, lv_pct(33), lv_pct(100));
lv_obj_t* label = lv_label_create(obj);
lv_label_set_text_fmt(label, "Page %d", i);
lv_obj_set_style_border_width(obj, 0, 0);
}
/*将第 0、1、2、3、4 个页面放到网格中,使它们居中*/
lv_obj_set_grid_cell(lv_obj_get_child(cont, 0), LV_GRID_ALIGN_CENTER, 0, 1, LV_GRID_ALIGN_CENTER, 0, 1);
lv_obj_set_grid_cell(lv_obj_get_child(cont, 1), LV_GRID_ALIGN_CENTER, 1, 1, LV_GRID_ALIGN_CENTER, 0, 1);
lv_obj_set_grid_cell(lv_obj_get_child(cont, 2), LV_GRID_ALIGN_CENTER, 2, 1, LV_GRID_ALIGN_CENTER, 0, 1);
lv_obj_set_grid_cell(lv_obj_get_child(cont, 3), LV_GRID_ALIGN_CENTER, 3, 1, LV_GRID_ALIGN_CENTER, 0, 1);
lv_obj_set_grid_cell(lv_obj_get_child(cont, 4), LV_GRID_ALIGN_CENTER, 4, 1, LV_GRID_ALIGN_CENTER, 0, 1);
/*将第 2、3 个页面隐藏*/
//lv_obj_add_flag(lv_obj_get_child(cont, 2), LV_OBJ_FLAG_HIDDEN);
//lv_obj_add_flag(lv_obj_get_child(cont, 3), LV_OBJ_FLAG_HIDDEN);
/*将页面 0 居中显示*/
lv_obj_scroll_to_view(lv_obj_get_child(cont, 0), LV_ANIM_OFF);
}
```
注释中已经解释了每一行代码的作用,其中有些代码是被注释掉了的,这可能是作者在开发过程中的调试代码。
阅读全文