事件
详细介绍
当发生用户可能感兴趣的事情时,LVGL 中会触发事件,例如当一个对象
- 被点击
- 滚动
- 数值被改变
- 重绘等。
lv_obj_t * btn = lv_btn_create(lv_scr_act());
lv_obj_add_event_cb(btn, my_event_cb, LV_EVENT_CLICKED, NULL); /*Assign an event callback*/
...
static void my_event_cb(lv_event_t * event)
{
printf("Clicked\n");
}
在示例中 LV_EVENT_CLICKED 意味着只有当对象发生点击事件时,就会触发事件从而进入事件处理回调函数 my_event_cb 。
函数接口
//事件回调函数
lv_obj_add_event_cb(btn, event_handler, LV_EVENT_CLICKED, &user_data);
//手动发送事件到对象
lv_event_send(obj, LV_EVENT_..., &user_data)
lv_event_get_target
*获得事件最初瞄准的对象。即使事情是冒泡,也是一样的。
@param e 指向事件描述符的指针
@return 返回event_code的目标
struct _lv_obj_t * lv_event_get_target(lv_event_t * e);
作用
lv_event_get_current_target
*获取事件的当前目标。它是事件处理程序被调用的对象。
*如果事件没有冒泡,则与“normal”目标相同。
@param e 指向事件描述符的指针
@return 返回指向event_code当前目标的指针
struct _lv_obj_t * lv_event_get_current_target(lv_event_t * e);
作用
lv_event_get_code
*获取事件的事件代码
@param e 指向事件描述符的指针
@return 返回事件代码。(如。“LV_EVENT_CLICKED”、“LV_EVENT_FOCUSED”等)
lv_event_code_t lv_event_get_code(lv_event_t * e);
作用
lv_event_get_param
*获取事件发送时传递的参数
@param e 指向事件描述符的指针
@return 返回指向参数的指针
void * lv_event_get_param(lv_event_t * e);
作用
返回事件结构体e的成员param
void * lv_event_get_param(lv_event_t * e)
{
return e->param;
}
该成员param由lv_event_send赋值
lv_res_t lv_event_send(lv_obj_t * obj, lv_event_code_t event_code, void * param)
{
if(obj == NULL) return LV_RES_OK;
LV_ASSERT_OBJ(obj, MY_CLASS);
lv_event_t e;
e.target = obj;
e.current_target = obj;
e.code = event_code;
e.user_data = NULL;
e.param = param;
e.deleted = 0;
e.stop_bubbling = 0;
e.stop_processing = 0;
/*从事件中使用的对象构建一个简单的链表,重要的是要知道这个对象是否被嵌套事件删除了从' event_cb '调用。
*Build a simple linked list from the objects used in the events
*It's important to know if this object was deleted by a nested event
*called from this `event_cb`.*/
e.prev = event_head;
event_head = &e;
/*发送事件 Send the event*/
lv_res_t res = event_send_core(&e);
/*从列表中删除此元素 Remove this element from the list*/
event_head = e.prev;
return res;
}
lv_event_get_user_data
当事件在对象上注册时,获取user_data
@param e 指向事件描述符的指针
@return 返回指针user_data
void * lv_event_get_user_data(lv_event_t * e);
作用
lv_event_stop_bubbling
*停止事件冒泡。
*仅当在事件处理链的中间调用时有效。
@param e 指向事件描述符的指针
void lv_event_stop_bubbling(lv_event_t * e);
作用
lv_event_stop_processing
*停止处理此事件。
*仅当在事件处理链的中间调用时有效。
@param e 指向事件描述符的指针
void lv_event_stop_processing(lv_event_t * e);
作用
lv_event_register_id
注册一个新的,自定义的事件ID。
它的用法和例句一样。’ LV_EVENT_CLICKED '发送自定义事件
@return 返回新的事件id
@example
uint32_t LV_EVENT_MINE = 0;
……
LV_EVENT_MINE = lv_event_register_id();
……
lv_event_send(obj, LV_EVENT_MINE, &some_data);
uint32_t lv_event_register_id(void);
作用
_lv_event_mark_deleted
可以调用嵌套事件,其中一个事件可能属于正在被删除的对象。
*将该对象的’ event_temp_data ‘标记为删除,以知道它的’ lv_event_send ‘应该返回’ LV_RES_INV ’
@param obj 指针指向一个对象,标记为已删除
void _lv_event_mark_deleted(struct _lv_obj_t * obj);
void _lv_event_mark_deleted(lv_obj_t * obj)
{
lv_event_t * e = event_head;
while(e) {
if(e->current_target == obj || e->target == obj) e->deleted = 1;
e = e->prev;
}
}
作用
lv_obj_add_event_cb
为一个对象添加一个事件处理函数。
用于用户对对象发生的事件做出反应。
一个对象可以有多个事件处理程序。它们被调用的顺序与它们被添加的顺序相同。
@param obj 指针指向一个对象
@param filter 应该被调用事件代码(例如:’ LV_EVENT_CLICKED ‘)。’ LV_EVENT_ALL ‘可以用于接收所有事件。
@param event_cb 新的事件函数
@param user_data 自定义数据将在’ event_cb '中可用
@return 返回事件描述符的指针。可以在::lv_obj_remove_event_dsc使用
struct _lv_event_dsc_t * lv_obj_add_event_cb(struct _lv_obj_t * obj, lv_event_cb_t event_cb, lv_event_code_t filter,void * user_data);
作用
lv_obj_remove_event_cb
删除对象的事件处理程序函数。
@param obj 指针指向一个对象
@param event_cb 是要删除的事件函数,或者’ NULL '是要删除第一个添加的事件回调函数
@return 如果任何事件处理程序被删除,@返回true
bool lv_obj_remove_event_cb(struct _lv_obj_t * obj, lv_event_cb_t event_cb);
作用
lv_obj_remove_event_cb_with_user_data
从一个对象中移除一个带有特定user_data的事件处理函数。
@param obj 指针指向一个对象
@param event_cb 事件函数删除,或’ NULL ‘只有’ user_data '重要。
@param event_user_data 指定在::lv_obj_add_event_cb中的user_data
@return 如果任何事件处理程序被删除,@返回true
bool lv_obj_remove_event_cb_with_user_data(struct _lv_obj_t * obj, lv_event_cb_t event_cb,const void * event_user_data);
作用
lv_obj_remove_event_dsc
已弃用,因为如果一个对象中添加了多个事件处理程序,则不工作。
删除一个对象的事件处理函数。
@param obj 指针指向一个对象
@param event_dsc 指针指向要删除的事件描述符(由::lv_obj_add_event_cb返回)
@return 如果任何事件处理程序被删除,@返回true
bool lv_obj_remove_event_dsc(struct _lv_obj_t * obj, struct _lv_event_dsc_t * event_dsc);
作用
lv_obj_get_event_user_data
事件回调对象的用户数据。总是会返回第一个匹配’ event_cb '的对象。
@param obj指针指向一个对象
@param event_cb事件函数
@返回user_data
void * lv_obj_get_event_user_data(struct _lv_obj_t * obj, lv_event_cb_t event_cb);
作用
lv_event_get_indev
获取作为参数传递给indev相关事件的输入设备。
@param e 指向事件的指针
@return 返回触发事件的indev,如果调用与indev不相关的事件,则返回NULL
lv_indev_t * lv_event_get_indev(lv_event_t * e);
作用
lv_event_get_draw_part_dsc
获得部分绘制描述符作为参数传递到’ lv_event_draw_part_begin /END '。
@param e 指向事件的指针
@return 返回部件绘制描述符来挂钩图形,如果调用不相关的事件则返回NULL
lv_obj_draw_part_dsc_t * lv_event_get_draw_part_dsc(lv_event_t * e);
作用
lv_event_get_draw_ctx
获取绘制上下文,它应该是绘制函数的第一个参数。
即:’ LV_EVENT_DRAW_MAIN/POST ', ’ LV_EVENT_DRAW_MAIN/POST_BEGIN ', ’ LV_EVENT_DRAW_MAIN/POST_END ’
@param e 指向事件的指针
@return 返回绘制上下文的指针,如果调用不相关的事件,则返回NULL
lv_draw_ctx_t * lv_event_get_draw_ctx(lv_event_t * e);
作用
lv_event_get_old_size
获取对象在其大小改变前的旧区域。可以在’ LV_EVENT_SIZE_CHANGED '中使用
@param e 指向事件的指针
@return 返回原来的绝对区域,如果调用不相关的事件则返回NULL
const lv_area_t * lv_event_get_old_size(lv_event_t * e);
作用
lv_event_get_key
获取作为参数传递给事件的键。可以在“LV_EVENT_KEY”中使用
@param e 指向事件的指针
@return 返回触发键或NULL,如果调用一个不相关的事件
uint32_t lv_event_get_key(lv_event_t * e);
作用
lv_event_get_scroll_anim
获得滚动的动画描述符。可以在“LV_EVENT_SCROLL_BEGIN”中使用
@param e 指向事件的指针
@return 返回滚动对象的动画。(可根据需要修改)
lv_anim_t * lv_event_get_scroll_anim(lv_event_t * e);
作用
lv_event_set_ext_draw_size
设置新的额外绘制大小。可以在“lv_event_ref_ext_draw_size”中使用
@param e 指向事件的指针
@param size 新的额外的绘制大小
void lv_event_set_ext_draw_size(lv_event_t * e, lv_coord_t size);
作用
lv_event_get_self_size_info
获取一个指向“lv_point_t”变量的指针,在该变量中保存自己的大小(宽度为“point->x”和高度为“point->y”)。
可以在’ LV_EVENT_GET_SELF_SIZE ‘中使用
@param e 指向事件的指针
@return 返回指针到’ lv_point_t '或NULL,如果调用不相关的事件
lv_point_t * lv_event_get_self_size_info(lv_event_t * e);
作用
lv_event_get_cover_area
获得一个指向一个区域的指针,该区域应该检查对象是否完全覆盖了它。
可用于“LV_EVENT_HIT_TEST”
@param e 指向事件的指针
@return 返回一个带绝对坐标的区域进行检查
const lv_area_t * lv_event_get_cover_area(lv_event_t * e);
作用
lv_event_set_cover_res
*设置覆盖检查结果。可以在“LV_EVENT_COVER_CHECK”中使用
@param e 指向事件的指针
@param 对::lv_cover_check_info_t元素进行了解析
void lv_event_set_cover_res(lv_event_t * e, lv_cover_res_t res);