lv_obj_set_event_cb与lv_obj_add_event_cb有什么区别
时间: 2023-08-04 21:07:36 浏览: 711
lv_obj_set_event_cb 和 lv_obj_add_event_cb 是 LittlevGL 图形库中用于设置对象事件回调函数的两个函数。
区别如下:
1. 参数类型不同:lv_obj_set_event_cb 接受一个对象指针和一个事件回调函数指针作为参数,而 lv_obj_add_event_cb 接受一个对象指针、一个事件类型和一个事件回调函数指针作为参数。
2. 功能不同:lv_obj_set_event_cb 用于设置对象的默认事件回调函数,该回调函数将在对象接收到任何事件时被调用。而 lv_obj_add_event_cb 用于添加特定事件类型的回调函数,可以为对象添加多个不同类型的事件回调函数。
3. 使用方式不同:lv_obj_set_event_cb 只需调用一次,设置对象的默认事件回调函数。而 lv_obj_add_event_cb 可以多次调用,为对象添加多个不同类型的事件回调函数。
总结来说,lv_obj_set_event_cb 设置对象的默认事件回调函数,而 lv_obj_add_event_cb 则是为对象添加特定类型的事件回调函数。
相关问题
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);
}
```
注释中已经解释了每一行代码的作用,其中有些代码是被注释掉了的,这可能是作者在开发过程中的调试代码。
lv_obj_add_style一直循环刷新背景颜色
如果你想要通过循环刷新背景颜色,可以使用 `lv_obj_add_style` 函数来为对象添加样式。然后,通过在循环中修改样式的属性来达到刷新的效果。下面是一个示例代码,展示了如何在 LVGL 中循环刷新背景颜色:
```c
#include "lvgl/lvgl.h"
lv_obj_t *obj;
lv_style_t style;
void setup(void)
{
lv_obj_t *scr = lv_disp_get_scr_act(NULL);
obj = lv_obj_create(scr, NULL);
lv_obj_set_size(obj, LV_HOR_RES, LV_VER_RES);
lv_obj_align(obj, NULL, LV_ALIGN_CENTER, 0, 0);
lv_style_init(&style);
lv_style_set_bg_color(&style, lv_palette_main(0));
lv_style_set_bg_opa(&style, LV_OPA_COVER);
lv_obj_add_style(obj, LV_OBJ_PART_MAIN, &style);
}
void refresh_background_color(void)
{
static uint8_t color_index = 0;
lv_style_set_bg_color(&style, lv_palette_main(color_index));
lv_obj_refresh_style(obj, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT);
color_index++;
if (color_index >= LV_PALETTE_LAST) {
color_index = 0;
}
}
int main(void)
{
lv_init();
lv_disp_drv_t disp_drv;
lv_disp_drv_init(&disp_drv);
disp_drv.disp_flush = your_flush_cb; // 设置你的显示驱动回调函数
lv_disp_drv_register(&disp_drv);
setup();
while (1) {
lv_task_handler();
your_event_handler(); // 处理你的事件
// 每隔一段时间刷新背景颜色
lv_tick_inc(10); // 增加 LVGL 的系统时钟
if (lv_tick_get() % 1000 == 0) {
refresh_background_color();
}
}
return 0;
}
```
在上面的示例代码中,我们创建了一个对象 `obj`,并通过 `lv_style_set_bg_color` 函数设置了初始的背景颜色。然后,我们通过 `lv_obj_add_style` 函数将样式应用到对象上。在 `refresh_background_color` 函数中,我们通过修改样式的背景颜色属性来刷新背景颜色,并调用 `lv_obj_refresh_style` 函数来更新对象的样式。
你可以根据需要修改示例中的相关参数,比如刷新的时间间隔和背景颜色变化的方式。同时,你还需要根据自己的具体情况实现显示驱动回调函数和事件处理函数。
希望这个示例对你有所帮助!如有任何疑问,请随时提问。
阅读全文