LVGL Event——事件


Events(事件)

Event(​​​事件)

当发生用户可能感兴趣的事情时,LVGL 中会触发事件,例如当一个对象被点击、滚动、数值被改变、重绘等。

 
用户可以为对象分配回调函数以查看其事件。在实践中,它看起来像这样:

lv_obj_t * btn = lv_btn_create(lv_scr_act());

//Assign an event callback
lv_obj_add_event_cb(btn, my_event_cb, LV_EVENT_CLICKED, NULL);  

static void my_event_cb(lv_event_t * event)
{
    printf("Clicked\n");
}
 
在示例中 LV_EVENT_CLICKED 意味着只有当对象发生点击事件时,就会触发事件从而进入事件处理回调函数 my_event_cb 。有关所有选项,请参阅事件代码列表。LV_EVENT_ALL 可用于接收所有事件。

lv_obj_add_event_cb 的最后一个参数是指向事件中可用的任何自定义数据的指针。稍后将更详细地描述。

可以向一个对象添加更多事件,如下所示:

lv_obj_add_event_cb(obj, my_event_cb_1, LV_EVENT_CLICKED, NULL);
lv_obj_add_event_cb(obj, my_event_cb_2, LV_EVENT_PRESSED, NULL);
lv_obj_add_event_cb(obj, my_event_cb_3, LV_EVENT_ALL, NULL);     

   /*No filtering, receive all events*/

如果传入的用户数据不一样,一个对象可以绑定同一个事件回调函数多次。例如:

lv_obj_add_event_cb(obj, increment_on_click, LV_EVENT_CLICKED, &num1);
lv_obj_add_event_cb(obj, increment_on_click, LV_EVENT_CLICKED, &num2);

这些事件将按照添加的顺序被调用。更多的对象可以使用相同的 事件回调。

Remove event(s) from an object(从对象中删除事件)


可以使用 lv_obj_remove_event_cb(obj, event_cb) 函数或 lv_obj_remove_event_dsc(obj, event_dsc) 从对象中删除事件。 event_dsc 是一个由 lv_obj_add_event_cb 返回的指针。

Event codes
查看原文
事件代码可以分为以下几类:

输入设备事件(Input device events)

绘图事件(Drawing events)

其他事件(Special events)

特殊事件(Other events)

自定义事件(Custom events)

请查阅源码:lvgl/src/core/lv_event.h (lv_event_code_t)

所有对象(例如按钮/标签/滑块等),无论其类型如何,都会接收 Input device、Drawing 和 Other 事件。

然而,特殊事件 特定于特定的小部件类型。查看 widgets' 文档 了解何时发送,

自定义事件 由用户添加,因此这些事件永远不会由 LVGL 发送。

存在以下事件代码:

Input device events(输入设备事件)


LV_EVENT_PRESSED 对象已被按下

LV_EVENT_PRESSING 对象被按下(按下时连续调用)

LV_EVENT_PRESS_LOST 对象仍被按下,但光标/手指已滑离对象

LV_EVENT_SHORT_CLICKED 对象被按下一小段时间,然后释放它。如果滚动则不会调用。

LV_EVENT_LONG_PRESSED 对象已按下输入设备驱动程序中指定的至少 long_press_time。如果滚动则不会调用。

LV_EVENT_LONG_PRESSED_REPEAT 在每个 long_press_repeat_time 毫秒的 long_press_time 之后调用。如果滚动则不会调用。

LV_EVENT_CLICKED 如果对象没有滚动,则在释放时调用(无论是否长按)

LV_EVENT_RELEASED 在对象被释放后的每种情况下调用

LV_EVENT_SCROLL_BEGIN 开始滚动。事件参数是 NULL 或 lv_anim_t *,如果需要,可以修改滚动动画描述符。

LV_EVENT_SCROLL_END 滚动结束。

LV_EVENT_SCROLL 对象被滚动

LV_EVENT_GESTURE 检测到手势。使用 lv_indev_get_gesture_dir(lv_indev_get_act()); 获取手势

LV_EVENT_KEY 一个密钥被发送到对象。使用 lv_indev_get_key(lv_indev_get_act()); 获取密钥

LV_EVENT_FOCUSED 对象被聚焦

LV_EVENT_DEFOCUSED 对象散焦

LV_EVENT_LEAVE 对象散焦但仍被选中

LV_EVENT_HIT_TEST 执行高级命中测试。使用 lv_hit_test_info_t * a = lv_event_get_hit_test_info(e) 并检查 a->point 是否可以点击对象。如果没有则 a->res = false

Drawing events(绘图事件)
 


LV_EVENT_COVER_CHECK 检查对象是否完全覆盖一个区域。事件参数是lv_cover_check_info_t *。

LV_EVENT_REFR_EXT_DRAW_SIZE 获取对象周围所需的额外绘制区域(例如用于阴影)。事件参数是 lv_coord_t * 来存储大小。仅用更大的值覆盖它。

LV_EVENT_DRAW_MAIN_BEGIN 开始主绘图阶段。

LV_EVENT_DRAW_MAIN 执行主绘图

LV_EVENT_DRAW_MAIN_END 完成主绘制阶段

LV_EVENT_DRAW_POST_BEGIN 开始后期绘制阶段(当所有孩子都被绘制时)

LV_EVENT_DRAW_POST 执行后期绘制阶段(当所有孩子都被绘制时)

LV_EVENT_DRAW_POST_END 完成后期绘制阶段(当所有孩子都被绘制时)

LV_EVENT_DRAW_PART_BEGIN 开始绘制零件。事件参数是lv_obj_draw_dsc_t *。了解更多 此处。

LV_EVENT_DRAW_PART_END 完成绘制零件。事件参数是lv_obj_draw_dsc_t *。了解更多 此处。

Other events(其他事件)


 
LV_EVENT_DELETE 对象正在被删除

LV_EVENT_CHILD_CHANGED 孩子被移除/添加

LV_EVENT_SIZE_CHANGED 对象坐标/大小已更改

LV_EVENT_STYLE_CHANGED 对象的样式已更改

LV_EVENT_BASE_DIR_CHANGED 基础目录已经改变

LV_EVENT_GET_SELF_SIZE 获取小部件的内部尺寸

Special events(特殊事件)

LV_EVENT_VALUE_CHANGED 对象的值已更改(即滑块移动)

LV_EVENT_INSERT 正在向对象插入文本。事件数据是插入的char *。

LV_EVENT_REFRESH 通知对象刷新其上的某些内容(对于用户)

LV_EVENT_READY 一个过程已经完成

LV_EVENT_CANCEL 一个过程被取消

Custom events(自定义事件)


任何自定义事件代码都可以通过 uint32_t MY_EVENT_1 = lv_event_register_id(); 注册

并且可以使用 lv_event_send(obj, MY_EVENT_1, &some_data) 发送到任何对象

Sending events(发送事件)

 
要手动向对象发送事件,请使用 lv_event_send(obj, <EVENT_CODE> &some_data)。

例如,这可用于通过模拟按钮按下来手动关闭消息框(尽管有更简单的方法可以做到这一点):

/*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 是一个特殊事件,因为它被设计为用户使用它来通知对象刷新自身。一些例子:

通知标签根据一个或多个变量(例如当前时间)刷新其文本

当语言改变时刷新标签

如果满足某些条件(例如输入正确的 PIN),则启用按钮

如果超出限制,则向/从对象添加/删除样式等

Fields of lv_event_t(lv_event_t 的字段)


lv_event_t 是传递给事件回调的唯一参数,它包含有关事件的所有数据。可以从中获得以下值:

lv_event_get_code(e) 获取触发的事件代码

lv_event_get_target(e) 获取事件发送到(关联)的对象

lv_event_get_original_target(e) 获取事件最初发送到的对象(与 lv_event_get_target 不同,如果 event bubbling 被启用)

lv_event_get_user_data(e) 获取作为 lv_obj_add_event_cb 的最后一个参数传递的指针。

lv_event_get_param(e) 获取作为 lv_event_send 的最后一个参数传递的参数

Event bubbling(事件冒泡)
 


如果启用了 lv_obj_add_flag(obj, LV_OBJ_FLAG_EVENT_BUBBLE),所有事件也将发送到对象的父级。如果父级也启用了LV_OBJ_FLAG_EVENT_BUBBLE,则事件也将发送到其父级,依此类推。

事件的 target 参数始终是当前目标对象,而不是原始对象。在事件处理程序中获取原始目标调用 lv_event_get_original_target(e)。

 
 

  • 14
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值