LVGL官方文档-7.11.0-11-Overview-Events

当有用户可能感兴趣的事情发生的时候,会在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都会被刷新。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值