用户工具

站点工具


icore4tlvgl_8

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

后一修订版
前一修订版
icore4tlvgl_8 [2020/12/04 17:33]
zgf 创建
icore4tlvgl_8 [2022/04/01 11:12]
sean
行 2: 行 2:
 |技术支持电话|**0379-69926675-801**||| |技术支持电话|**0379-69926675-801**|||
 |技术支持邮件|Gingko@vip.163.com||| |技术支持邮件|Gingko@vip.163.com|||
-|技术论坛|http://​www.eeschool.org||| 
 ^  版本 ​ ^  日期 ​ ^  作者 ​ ^  修改内容 ​ ^ ^  版本 ​ ^  日期 ​ ^  作者 ​ ^  修改内容 ​ ^
 |  V1.0  |  2020-11-26 ​ |  yang  |  初次建立 ​ |  |  V1.0  |  2020-11-26 ​ |  yang  |  初次建立 ​ | 
  
-===== 实验lv_btn按钮 ​=====+===== 实验Events事件 ​=====
  
 +==== 一、事件简介 ====
  
-{{ :icore4t:icore4t_rtt_lvgl_7_1.gif?direct |}}+在LVGL运行过程中,发生某些事情时会触发LVGL事件,例如某个对象 
 +  * **被点击** 
 +  * **被拖拽** 
 +  * **其值已更改,等等** 
 + 
 +用户可以给对象分配回调函数以查看这些事件,并作出相应的操作。下面就是一个按钮被按下时长不同触发不同事件的例子。 
 + 
 +{{ :icore4t:icore4t_rtt_lvgl_8_1.gif?direct |}}
  
 <code c> <code c>
 +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"​); ​                /* 设置标签初始内容 */ 
 +}
 </​code>​ </​code>​
 +
 +注意:多个对象可以使用同一事件回调函数。
 +
 +==== 二、事件类型 ====
 +
 +**2.1通用事件**
 +
 +LVGL的所有对象(例如 Buttons / Labels / Sliders 等)都将接收这些通用事件,而不管它们的类型如何。
 +
 +**2.2输入设备相关**
 +
 +当用户按下/​释放对象时发送这些消息。它们不仅用于按钮输入设备,还可以用于键盘,编码器和指针。该部分内容在输入设备章节会有详细介绍。
 +  * **LV_EVENT_PRESSED** 该对象已被按下。
 +  * **LV_EVENT_PRESSING** 该对象被按下(在按下时连续发送)。
 +  * **LV_EVENT_PRESS_LOST** 输入设备仍被按压,但已不在该对象上。
 +  * **LV_EVENT_SHORT_CLICKED** 该对象在 **LV_INDEV_LONG_PRESS_TIME** 定义的时间内被释放,则发送单击事件,若对象被拖动则不触发。
 +  * **LV_EVENT_LONG_PRESSED** 对象被按压时长超过 **LV_INDEV_LONG_PRESS_TIME** 定义的时间,则发送长按事件,若对象被拖动则不触发。
 +  * **LV_EVENT_LONG_PRESSED_REPEAT**当对象被按压时长超过 **LV_INDEV_LONG_PRESS_TIME** 定义的时间后,每 **LV_INDEV_LONG_PRESS_REP_TIME** 毫秒触发一次,若对象被拖动则不触发。
 +  * **LV_EVENT_CLICKED** 对象被单击或长按后被释放,发送该事件,若对象被拖动则不触发。
 +  * **LV_EVENT_RELEASED** 当对象被释放时调用,即使它被拖动,但是在对象上按下然后从对象上滑出并在对象外部释放时,则不会调用。在这种情况下事件** LV_EVENT_PRESS_LOST** 被发送。
 +
 +相关阈值定义,可以在 **lv_conf.h** 中找到并根据需求修改。
 +{{ :​icore4t:​icore4t_rtt_lvgl_8_2.png?​direct |}}
 +
 +**2.3指针相关**
 +
 +这些事件仅由类似指针的输入设备(例如鼠标或触摸板)发送
 +  * **LV_EVENT_DRAG_BEGIN** 开始拖动对象。
 +  * **LV_EVENT_DRAG_END** 拖动完成(包括拖动)。
 +  * **LV_EVENT_DRAG_THROW_BEGIN** 开始拖动(释放后具有拖动“动量”)。
 +
 +**2.4键盘和编码器相关**
 +
 +下面这些事件由键盘和编码器输入设备发送。该部分内容在输入设备章节会有详细介绍。
 +  * **LV_EVENT_KEY** 对象发送一个键值,通常在按压后触发或长时间按压后重复触发。
 +  * **LV_EVENT_FOCUSED** 对象在其所在的组中获得焦点。
 +  * **LV_EVENT_DEFOCUSED** 对象在其所在的组中失去焦点。
 +
 +**2.5一般事件**
 +
 +库发送的其他一般事件。
 +  * **LV_EVENT_DELETE** 正在删除对象。释放相关的用户分配数据。
 +
 +**2.6特别事件**
 +
 +这些事件特定于特定的对象类型。
 +  * **LV_EVENT_VALUE_CHANGED** 对象值已更改(例如,对于Slider)。
 +  * **LV_EVENT_INSERT** 某物插入到对象中(通常插入到文本区域)。
 +  * **LV_EVENT_APPLY** ​ “Ok”,​“Apply”这类的特定按钮被单击(通常来自键盘对象)。
 +  * **LV_EVENT_CANCEL** “Close”,​“Cancel”这类的特定按钮被单击(通常来自键盘对象)。
 +  * **LV_EVENT_REFRESH** 查询以刷新对象。库不会发送,但用户可以发送。
 +
 +==== 三、自定义数据 ====
 +
 +一些事件可能包含自定义数据。例如,**LV_EVENT_VALUE_CHANGED** 在某些情况下会传递新值。要在事件回调中获取自定义数据,请使用 **lv_event_get_data()**。
 +
 +自定义数据的类型取决于发送对象,例如
 +
 +  * 数据是一个数,则类型为 uint32_t * 或者 int32_t *
 +  * 数据是文本内容,则类型为 char * 或者 const char *
 +
 +==== 四、手动发送事件 ====
 +
 +**4.1任意事件**
 +
 +要将事件手动发送到对象,请使用 **lv_event_send(obj,​ LV_EVENT_...,​ &​custom_data)**
 +例如,它可以通过模拟按钮按下来手动关闭消息框(尽管有更简单的方法):
 +<code c>
 +/​*模拟按下第一个按钮(索引从零开始)*/​
 +uint32_t btn_id = 0;
 +lv_event_send(mbox,​ LV_EVENT_VALUE_CHANGED,​ &​btn_id);​
 +</​code>​
 +
 +**4.2刷新事件**
 +
 +**LV_EVENT_REFRESH** 是一个特殊事件,因为它旨在供用户用来通知对象刷新自身。下面是一些例子:
 +  * (1)通知标签根据一个或多个变量(例如当前时间)刷新其文本。
 +  * (2)语言更改时刷新标签。
 +  * (3)如果满足某些条件,则启用按钮(例如,输入正确的 PIN)。
 +  * (4)如果超出限制,则将样式添加到对象/​从对象删除样式,等等。
 +
 +处理类似情况的最简单方法是使用以下函数。函数 **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** 作为参数传递,则所有屏幕的所有对象都将刷新。
icore4tlvgl_8.txt · 最后更改: 2022/04/01 11:12 由 sean