Fields of 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
,则事件也将发送到其父级,依此类推。
- lv_event_get_target(e); 获取事件最初针对的对象。即使事件是冒泡的,这个目标都是固定的。
- lv_event_get_current_target(e); 获取事件的当前目标,这个函数返回当前处理事件的对象 。
区别如下:
- lv_event_get_target(e):
- 这个函数返回原始的事件目标,也就是事件最初被发送到的对象。无论事件如何传播或冒泡,这个目标都是固定的。
- lv_event_get_current_target(e):
- 这个函数返回当前处理事件的对象。考虑一个情况,当一个事件从子对象冒泡到其父对象时,
lv_event_get_current_target(e)
将返回父对象,而lv_event_get_target(e)
仍然返回子对象。也就是说,lv_event_get_current_target(e)
可以在事件传播期间改变,而lv_event_get_target(e)
始终是固定的。
- 这个函数返回当前处理事件的对象。考虑一个情况,当一个事件从子对象冒泡到其父对象时,
为了更好地理解这两者的差异,考虑一个实际场景。假设你有一个按钮(button)在一个容器(container)内。当你点击按钮时,事件首先发送到按钮,然后可能冒泡到容器。
- 如果你在容器的事件处理函数中调用
lv_event_get_target(e)
,它将返回按钮。 - 但如果你调用
lv_event_get_current_target(e)
,它将返回容器,因为容器是当前处理事件的对象。
当然关于lv_event_get_target(e)
与lv_event_get_current_target(e)
区别,我认为爸爸理论是最好理解的:
lv_event_get_target是永远不变的,目标是固定的。用点击事件来说,点啥就是啥。开启冒泡的时候,lv_event_get_current_target是会变的,点啥就去找爸爸。
比如说get_target是谁被打,get_current_target是通知有人被打了。我是你爸爸,你被打了会来通知我。我被打了不会通知你,因为不会往下传递消息。但是被打这个事情,我们两个都有可能会发生。所以get_target可能是你,也可能是我。但是在开启冒泡的前提下,get_current_target只可能是爸爸我。而不可能是儿子。
和啵啵斗嘴的日常,虽然啵啵很强,但是我就是不承认,这个爸爸理论是我独创!!!