如何理解LVGL中当前事件和原始事件?


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); 获取事件的当前目标,这个函数返回当前处理事件的对象 。

区别如下:

  1. lv_event_get_target(e):
    • 这个函数返回原始的事件目标,也就是事件最初被发送到的对象。无论事件如何传播或冒泡,这个目标都是固定的。
  2. 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只可能是爸爸我。而不可能是儿子。

和啵啵斗嘴的日常,虽然啵啵很强,但是我就是不承认,这个爸爸理论是我独创!!!

图图一

图图二


文章作者: 冬瓜冬瓜排骨汤
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 冬瓜冬瓜排骨汤 !
  目录