lvgl 常用事件类型介绍

在lvgl 中,也有类似前端h5的事件类型这一属性,但其包含更多种不同的事件类型,以下介绍的为经常用的事件类型。

在lvgl中需要监听事件,需要用到lv_obj_add_event_cb函数,其主要包含了以下一些参数:

_lv_event_dsc_t * lv_obj_add_event_cb(lv_obj_t * obj, lv_event_cb_t event_cb, lv_event_code_t filter, void * user_data);

lv_obj_t * obj // 事件绑定的对象

lv_event_cb_t event_cb // 事件的处理函数,通常是自己需要事件实现的效果的执行函数

lv_event_code_t filter  // 监听的事件类型code,如:点击、长按等等

void * user_data // 事件需要传入的用户自定义数据

本文主要讲述lv_event_code_t 的常用种类,以及如果需要监听多种事件类型时如何监听事件类型

1、LV_EVENT_CLICKED  // 点击事件

2、LV_EVENT_KEY // 按键事件

3、LV_EVENT_SCROLL // 滚动事件,其监听的是正在滚动的状态,还有LV_EVENT_SCROLL_BEGIN,滚动开始;LV_EVENT_SCROLL_END,滚动结束。

4、LV_EVENT_GESTURE // 手势事件,主要用于页面手势切换

5、LV_EVENT_VALUE_CHANGED // 值变化事件,主要是switch、radio、button这种有多种形态的组件使用

6、LV_EVENT_LONG_PRESSED // 长按事件,主要用于页面解锁,进入内部功能时的场景

7、LV_EVENT_ALL // 全部事件,主要用于需要同时监听多个不同事件类型时,可以直接监听此事件类型,然后在回调函数里再分类处理。

以上就是经常用到的事件类型,除此之外还有几个页面生命周期的类型,在lvgl 页面生命周期介绍_lvgl vue-CSDN博客也有介绍。

<think>好的,用户让我介绍一下LVGL中的lv_obj_t结构体类型。首先,我需要回忆一下LVGL的基础知识,确保自己理解正确。LVGL是一个轻量级的嵌入式图形库,用于创建图形用户界面。所有的对象,比如按钮、标签、滑块等,都是基于lv_obj_t这个基本结构体构建的。 接下来,我应该先解释lv_obj_t是什么。它是所有对象的基类,类似于面向对象编程中的基类,其他控件都继承自它。需要说明它的作用,比如管理对象的属性、事件处理、父子关系等。用户可能想知道它的内部结构,但LVGL是开源的,可以直接参考源码,但用户可能不需要太底层的细节,所以应该概括主要成员和作用。 然后,结构体的主要成员。需要列举常见的成员变量,比如父指针、子节点链表、样式、事件回调等。每个成员的作用需要简明扼要,比如parent指向父对象,style管理样式,event_cb处理事件。同时要提到用户通常不需要直接操作这些成员,而是通过API函数来访问和修改,这样用户知道应该如何使用。 接下来,对象创建和继承的关系。说明如何通过lv_obj_create创建基础对象,其他控件如何继承它,比如lv_btn_create内部调用lv_obj_create并添加按钮特有的属性。这部分帮助用户理解对象之间的关系和创建过程。 然后,基本操作函数。列举常用的函数,比如设置大小、位置、添加事件、设置样式等。用户可能需要知道有哪些API可用,而不需要深入每个函数的参数,但给出例子会更好。 最后,总结lv_obj_t的重要性和使用注意事项,比如不要直接修改结构体成员,而是使用API。这样用户能避免潜在的错误。 现在需要检查是否有遗漏的部分。比如,是否提到了样式系统、事件处理机制,或者父子关系的影响(比如父对象移动时子对象跟随)。可能还需要提到LVGL的核心设计理念,比如基于对象的继承和组合,这样用户能更好地理解结构体的设计目的。 另外,用户可能的疑问点:为什么用结构体而不是C++的类?因为LVGL是用C写的,所以用结构体和函数指针模拟面向对象。这点可能需要提及,但用户没有问到,可能不需要深入,但可以简单说明LVGL的面向对象设计思路。 还需要确保遵循系统级指令,比如数学公式的正确格式,但在这个问题中可能用不到数学表达式,不过如果有变量名或代码片段,需要用行内格式。例如,函数名lv_obj_set_size可以用$...$包裹,但可能更合适用代码块,不过用户指令中没有特别要求代码格式,可能不需要。需要确认用户是否允许使用代码块,但根据指令,可能只需要中文回答,结构清晰即可。 最后,确保语言流畅,结构清晰,分点说明,帮助用户逐步理解。避免过于技术性的术语,用通俗的中文解释,同时保持专业性。</think>LVGL中的`lv_obj_t`结构体是其**最核心的基础对象类型**,所有控件(如按钮、标签、滑动条等)均继承自该类型。以下从设计原理和实际应用角度逐步解析: --- ### 一、基础定义与作用 1. **本质** `lv_obj_t`是LVGL的**基类对象**,定义于`lv_obj.h`中。它通过C语言结构体实现了面向对象思想中的**继承**和**多态**特性。 2. **核心职责** - 管理控件的**层级关系**(父子/兄弟) - 处理**布局**与**坐标计算** - 存储**样式属性**(颜色、尺寸、动画等) - 实现**事件响应机制**(点击、拖动等) --- ### 二、关键结构体成员(简化版) ```c typedef struct _lv_obj_t { struct _lv_obj_t* parent; // 父对象指针 lv_ll_t child_ll; // 子对象链表 lv_area_t coords; // 屏幕坐标区域 lv_obj_class_t* class_p; // 指向类描述(多态核心) void* user_data; // 用户自定义数据 lv_style_t* styles; // 样式集合 lv_event_cb_t event_cb; // 事件回调函数 // ... 其他布局/状态标志位 } lv_obj_t; ``` --- ### 三、继承与对象创建 1. **继承机制** 所有控件(如按钮`lv_btn`)通过**组合**方式扩展`lv_obj_t`: ```c typedef struct { lv_obj_t obj; // 基类对象必须作为首个成员 int custom_property; // 子类特有属性 } lv_btn_t; ``` 2. **对象创建** - 基础对象创建: ```c lv_obj_t* obj = lv_obj_create(lv_scr_act()); // 在活动屏幕上创建对象 ``` - 子类对象通过特定API创建(如`lv_btn_create()`),内部仍调用`lv_obj_create()`并扩展功能。 --- ### 四、核心操作API 1. **基础属性设置** ```c lv_obj_set_size(obj, 100, 50); // 设置尺寸 lv_obj_set_pos(obj, 20, 30); // 设置坐标 lv_obj_set_style_bg_color(obj, lv_color_hex(0xFF0000), 0); // 设置背景色 ``` 2. **事件处理** ```c lv_obj_add_event_cb(obj, my_event_handler, LV_EVENT_CLICKED, NULL); ``` 3. **层级管理** ```c lv_obj_move_foreground(obj); // 移至最顶层 lv_obj_set_parent(obj, new_parent); // 修改父对象 ``` --- ### 五、设计注意事项 1. **禁止直接修改结构体成员** 必须通过LVGL提供的API函数(如`lv_obj_set_...()`系列)修改属性,否则可能破坏内部状态。 2. **内存管理** 对象通过`lv_obj_delete()`销毁,LVGL自动处理其子对象和关联资源。 3. **性能优化** 高频操作时优先使用`lv_obj_add/clear_flag(obj, LV_OBJ_FLAG_...)`控制渲染和行为。 --- ### 六、典型应用场景 - 作为**容器**组织界面布局 - 作为**画布**实现自定义绘制 - 作为**基类**扩展自定义控件 通过理解`lv_obj_t`的设计,可更高效地利用LVGL的控件体系和事件机制。实际开发中建议结合LVGL官方文档和示例代码深入学习。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值