当有用户可能感兴趣的事情发生的时候,会在LVGL中触发Event。例如一个Object被点击、被拖动、改变其值的时候。
用户可以给一个Object设置一个回调函数来查看事件。一个实际的回调函数如下:
lv_obj_t * btn = lv_btn_create(lv_scr_act(), NULL);
lv_obj_set_event_cb(btn, my_event_cb); /*Assign an event callback*/
...
static void my_event_cb(lv_obj_t * obj, lv_event_t event)
{
switch(event) {
case LV_EVENT_PRESSED:
printf("Pressed\n");
break;
case LV_EVENT_SHORT_CLICKED:
printf("Short clicked\n");
break;
case LV_EVENT_CLICKED:
printf("Clicked\n");
break;
case LV_EVENT_LONG_PRESSED:
printf("Long press\n");
break;
case LV_EVENT_LONG_PRESSED_REPEAT:
printf("Long press repeat\n");
break;
case LV_EVENT_RELEASED:
printf("Released\n");
break;
}
/*Etc.*/
}
多个Object可以共用一个事件回调。
Event types
Generic events
不区分类型,所有的Object(Button、Label、Slider等)都会接收到这些通用的事件。
Related to the input devices
当Object被按下/释放的时候会发送这些事件。这些事件可用于Pointer\Keypad\Encoder\Button。前往Overview of input devices章节查看详情。
- LV_EVENT_PRESSED Object被按下。
- LV_EVENT_PRESSING Object正在被按下(在按下的过程中持续发送)。
- LV_EVENT_PRESS_LOST 输入设备仍然按下,但是已经不在这个Object的范围内。
- LV_EVENT_SHORT_CLICKED 在LV_INDEV_LONG_PRESS_TIME之前释放。如果发生了拖动就不会发送。
- LV_EVENT_LONG_PRESSED 按下持续了LV_INDEV_LONG_PRESS_TIME。如果发生了拖动就不会发送。
- LV_EVENT_LONG_PRESSED_REPEAT 在LV_INDEV_LONG_PRESS_TIME之后,每隔LV_INDEV_LONG_PRESS_REP_TIME发送一次。如果发生了拖动就不会发送。
- LV_EVENT_CLICKED 如果没有发生拖动,当释放的时候会发送(无论长按短按)。
- LV_EVENT_RELEASED 即使发生了拖动,当Object被放开的时候都会发送。如果在按下过程中从Object划走并在其范围外释放就不会发送,这种情况会发送LV_EVENT_PRESS_LOST。
Related to pointer
这类事件只会是Pointer类设备发送(鼠标或者触控板)。
- LV_EVENT_DRAG_BEGIN Object开始拖动。
- LV_EVENT_DRAG_END Object停止拖动(包括扔)。
- LV_EVENT_DRAG_THROW_BEGIN Object开始扔(拖动之后释放) 。
Related to keypad and encoder
这类事件由Keyoad和Encoder类设备发送。
- LV_EVENT_KEY 发送按键给Object,通常发生在其被按下或者在长按后持续发送。键值可以通过uint32_t *key = lv_event_get_data()获取。
- LV_EVENT_FOCUSED Object在其组中获得焦点。
- LV_EVENT_DEFOCUSED Object在其组中失去焦点。
General events
LVGL发送的其他事件
- LV_EVENT_DELETE Object被删除。这时候可以释放相关资源。
Special events
这类事件是某些Object特有的。
- LV_EVENT_VALUE_CHANGED Object的值发生变化(如Slider)。
- LV_EVENT_INSERT Object中被插入一些东西(典型的是Text area)。
- LV_EVENT_APPLY “Ok”、“Apply”或者类似的按键被点击(典型的是键盘)。
- LV_EVENT_CANCEL “Close”、“Canel”或者类似的按键被点击(典型的是键盘)。
- LV_EVENT_REGRESH 请求刷新Object。只有用户发送,LVGL不会主动发送。
查看Object type’s documentation,这里详细说明了Object会发送那些事件。
Custom data
有些事件会包含自定义数据。例如在某些情况下,LV_EVENT_VALUE_CHANGED会包含新值。获取详细信息请查看Object type’s documentation。在事件的回调函数里面调用lv_event_get_data()来获取自定义数据。
自定义数据的类型由发送事件的Object决定,但是有下列特殊情况:
- 如果是数字,类型就是uint32_t *或者int32_t *。
- 如果是文本,类型就是char* 或者const char *。
Send events manually
Arbitrary events
调用lv_event_send(obj, LV_EVENT_…, &custom_data)来手动给Object发送事件。
例如,可以通过模拟按键按下来关闭消息框(尽管有更简洁的方式实现这一功能):
/*Simulate the press of the first button (indexes start from zero)*/
uint32_t btn_id = 0;
lv_event_send(mbox, LV_EVENT_VALUE_CHANGED, &btn_id);
Refresh event
LV_EVENT_REFRESH是一个特殊的事件,因为它被用于用户通知Object刷新自身。它的应用场景有:
- 通知Label根据一些值(如当前时间)的变化刷新它的文本。
- 当语言发生改变的时候,刷新Label。
- 如果达到了某些条件,使能按键(如输入了正确的PIN)。
- 达到某种限制之后,向Object添加Style或者从Object去除Style。
在这些场景中,最简单的使用方法是调用下面的函数:
- lv_event_send_refresh(obj) 这个函数是对lv_event_send(obj, LV_EVENT_REFRESH, NULL)的封装。所以它仅仅是向Object发送LV_EVENT_REFRESH事件。
- lv_event_send_refresh_recursive(obj) 这个函数给Object及其所有的子Object发送LV_EVENT_REFRESH事件。如果参数传递NULL,所有Display上的所有Object都会被刷新。