目录

银杏科技有限公司旗下技术文档发布平台
技术支持电话0379-69926675-801
技术支持邮件Gingko@vip.163.com
版本 日期 作者 修改内容
V1.0 2020-11-26 yang 初次建立

实验八:Events事件

一、事件简介

在LVGL运行过程中,发生某些事情时会触发LVGL事件,例如某个对象

用户可以给对象分配回调函数以查看这些事件,并作出相应的操作。下面就是一个按钮被按下时长不同触发不同事件的例子。

static void my_event_cb(lv_obj_t * obj, lv_event_t event)
{
	switch(event) {
		case LV_EVENT_PRESSED:             /* 事件被按下 */
			lv_label_set_text(label, "Pressed");
			break;
		case LV_EVENT_SHORT_CLICKED:        /* 短点击 */
			lv_label_set_text(label, "Short clicked");
			break;
		case LV_EVENT_CLICKED:              /* 点击 */
			lv_label_set_text(label, "Clicked");
			break;
		case LV_EVENT_LONG_PRESSED:         /* 长按 */
			lv_label_set_text(label, "Long press");
			break;
		case LV_EVENT_LONG_PRESSED_REPEAT:  /* 重复长按 */
			lv_label_set_text(label, "Long press repeat");
			break;
		case LV_EVENT_RELEASED:             /* 释放 */
			lv_label_set_text(label, "Released");
			break;
 }
 }
void lv_gui_run(void)
{
	lvgl2rtt_init("lcd");                                 /* 初始化lvgl2rtt */
 
	lv_obj_t * btn1 = lv_btn_create(lv_scr_act(), NULL);  /* 创建按钮 */
	lv_obj_set_size(btn1, 200, 35);                       /* 设置尺寸 */
	lv_obj_set_event_cb(btn1, my_event_cb);               /* 回调函数 */
	lv_obj_align(btn1, NULL, LV_ALIGN_CENTER, 0, 0);      /* 居中对齐 */
	label = lv_label_create(btn1, NULL);                  /* 为按钮创建标签 */
	lv_label_set_text(label, "Released");                 /* 设置标签初始内容 */ 
}

注意:多个对象可以使用同一事件回调函数。

二、事件类型

2.1通用事件

LVGL的所有对象(例如 Buttons / Labels / Sliders 等)都将接收这些通用事件,而不管它们的类型如何。

2.2输入设备相关

当用户按下/释放对象时发送这些消息。它们不仅用于按钮输入设备,还可以用于键盘,编码器和指针。该部分内容在输入设备章节会有详细介绍。

相关阈值定义,可以在 lv_conf.h 中找到并根据需求修改。

2.3指针相关

这些事件仅由类似指针的输入设备(例如鼠标或触摸板)发送

2.4键盘和编码器相关

下面这些事件由键盘和编码器输入设备发送。该部分内容在输入设备章节会有详细介绍。

2.5一般事件

库发送的其他一般事件。

2.6特别事件

这些事件特定于特定的对象类型。

三、自定义数据

一些事件可能包含自定义数据。例如,LV_EVENT_VALUE_CHANGED 在某些情况下会传递新值。要在事件回调中获取自定义数据,请使用 lv_event_get_data()

自定义数据的类型取决于发送对象,例如

四、手动发送事件

4.1任意事件

要将事件手动发送到对象,请使用 lv_event_send(obj, LV_EVENT_…, &custom_data) 例如,它可以通过模拟按钮按下来手动关闭消息框(尽管有更简单的方法):

/*模拟按下第一个按钮(索引从零开始)*/
uint32_t btn_id = 0;
lv_event_send(mbox, LV_EVENT_VALUE_CHANGED, &btn_id);

4.2刷新事件

LV_EVENT_REFRESH 是一个特殊事件,因为它旨在供用户用来通知对象刷新自身。下面是一些例子:

处理类似情况的最简单方法是使用以下函数。函数 lv_event_send_refresh(obj) 只是 函数 lv_event_send(obj, LV_EVENT_REFRESH, NULL) 的一个包装。因此,它只向对象发送一个 LV_EVENT_REFRESH 事件。

函数 lv_event_send_refresh_recursive(obj) 向一个对象及其所有子对象发送 LV_EVENT_REFRESH 事件。如果将 NULL 作为参数传递,则所有屏幕的所有对象都将刷新。