提示:本博客作为学习笔记,有错误的地方希望指正

文章目录

  • 一、event 简介
    • 1.1概述 Overview
    • 1.2为对象添加事件 Add events to the object
    • 1.3从对象中移除事件 Remove event(s) from an object
    • 1.4代码事件 Events code
    • 1.5用户事件 Custom events
    • 1.6发送事件 Sending events
    • 1.7刷新事件 Refresh event
    • 1.8事件回调中结构体领域 Fields of lv_event_t
    • 1.9冒泡事件 Event bubbling
  • 二、事件 API
  • 三、示例
    • 3.1按键实现事件回调显示
    • 3.2按键回调多事件判断检测
    • 3.3实现事件添加标志位

一、event 简介

1.1概述 Overview

  在LVGL中,当发生一些用户可能感兴趣的事情时,事件就会被触发,例如,一个对象:
点击、滚动、它的值变了、重绘,等等。

1.2为对象添加事件 Add events to the object

  用户可以给一个对象分配回调函数来查看它的事件。其中添加的示例如下所示:

lv_obj_t * btn = lv_btn_create(lv_scr_act());                   //创建btn对象
lv_obj_add_event_cb(btn, my_event_cb, LV_EVENT_CLICKED, NULL);  //添加事件回调
/*callback*/
static void my_event_cb(lv_event_t * event)                     //事件回调函数
{printf("Clicked\n");
}

  在示例中,LV_EVENT_CLICKED意味着只有单击事件将调用my_event_cb。LV_EVENT_ALL可用于接收所有事件。
  lv_obj_add_event_cb的最后一个参数是指向事件中可用的任何自定义数据的指针。
  此外我们还可以将更多的事件添加到一个对象中,例如:

lv_obj_add_event_cb(obj, my_event_cb_1, LV_EVENT_CLICKED, NULL);
lv_obj_add_event_cb(obj, my_event_cb_2, LV_EVENT_PRESSED, NULL);
lv_obj_add_event_cb(obj, my_event_cb_3, LV_EVENT_ALL, NULL);

  即使相同的事件回调也可以用于具有不同user_data的对象,例如:

lv_obj_add_event_cb(obj, increment_on_click, LV_EVENT_CLICKED, &num1);
lv_obj_add_event_cb(obj, increment_on_click, LV_EVENT_CLICKED, &num2);

  事件将按添加时的顺序调用,更多的对象可以使用相同的事件回调。

1.3从对象中移除事件 Remove event(s) from an object

  可以使用lv_obj_remove_event_cb(obj, event_cb)函数或lv_obj_remove_event_dsc(obj, event_dsc)从对象中删除事件。Event_dsc是由lv_obj_add_event_cb返回的指针。

1.4代码事件 Events code

  代码事件前面btn那篇文章超纲的讲了一部分,这里在叙述一下加深印象。事件的分类:输入设备事件、绘制事件、其他事件、特殊事件、自定义事件。所有对象(如按钮/标签/滑块等),无论其类型如何,都接收输入设备,绘图和其他事件。但是,特殊事件是特定于特定小部件类型的。查看小部件的文档以了解它们何时被发送,自定义事件是由用户添加的,因此这些不会被LVGL发送。

事件代码可以分为以下几类:
• 输入设备的事件
• 绘画事件
• 其他事件
• 特殊事件
• 自定义事件LV_EVENT_ALL = 0,               /**<对象所有事件*/
/**输入设备事件*/
LV_EVENT_PRESSED,                /**<对象已被按下*/
LV_EVENT_PRESSING,           /**<对象正在被按下(按下时连续调用)*/
LV_EVENT_PRESS_LOST,             /**<对象仍在被按下,但将光标/手指滑离对象*/
LV_EVENT_SHORT_CLICKED,      /**<对象被短时间的按下,然后释放。不调用,如果滚动*/
LV_EVENT_LONG_PRESSED,       /**<对象至少被按下' long_press_time '。不调用,如果滚动*/
LV_EVENT_LONG_PRESSED_REPEAT,    /**<在每个`long_press_repeat_time`中`long_press_time`之后调用ms.如果滚动则不调用。*/
LV_EVENT_CLICKED,                /**<释放时调用如果没有滚动(无论长按)*/
LV_EVENT_RELEASED,           /**<在每次对象被释放时调用*/
LV_EVENT_SCROLL_BEGIN,       /**<滚动开始*/
LV_EVENT_SCROLL_END,             /**<滚动结束*/
LV_EVENT_SCROLL ,                /**< 滚动*/
LV_EVENT_GESTURE,                /**<检测到手势。使用“lv_indev_get_gesture_dir(lv_indev_get_act())”获得手势*/
LV_EVENT_KEY,                    /**<一个key被发送到对象。用' lv_indev_get_key(lv_indev_get_act())); '获得键*/
LV_EVENT_FOCUSED,                /**<对象被聚焦*/
lv_event_DEFOCUSED,          /**<对象离焦*/
LV_EVENT_LEAVE,              /**<对象被散焦但仍然被选中*/
LV_EVENT_HIT_TEST,           /**<执行高级命中测试*/* / / * *绘制事件*/
LV_EVENT_COVER_CHECK,            /**<检查对象是否完全覆盖了一个区域。事件参数是' lv_cover_check_info_t  '*/
lv_event_REFR_ext_draw_size,     /**<获得对象周围所需的额外绘制区域(例如阴影)。event参数是' lv_coord_t * '来存储大小*/
LV_EVENT_DRAW_MAIN_BEGIN,        /**<开始主绘图阶段*/
LV_EVENT_DRAW_MAIN,          /**<执行主绘图*/
LV_EVENT_DRAW_MAIN_END,      /**<完成主绘图阶段*/
LV_EVENT_DRAW_POST_BEGIN,        /**<开始post绘制阶段(当所有子元素绘制完成时)*/
LV_EVENT_DRAW_POST,          /**<执行post绘制阶段(当所有子元素都绘制时)*/
LV_EVENT_DRAW_POST_END,      /**<完成post绘制阶段(当所有子元素都绘制时)*/
LV_EVENT_DRAW_PART_BEGIN,        /**<开始绘制零件。事件参数是' lv_obj_draw_dsc_t * '。*/
LV_EVENT_DRAW_PART_END,      /**<绘制零件结束。事件参数是' lv_obj_draw_dsc_t * '。*/* / / * *特别事件*/
LV_EVENT_VALUE_CHANGED,      /**<对象的值已经改变(即滑块移动)*/
LV_EVENT_INSERT,                 /**<将文本插入到对象中。事件数据是' char * '正在插入*/
LV_EVENT_REFRESH,                /**<通知对象刷新其上的某些内容(为用户)*/
LV_EVENT_READY,              /**<进程已完成*/
LV_EVENT_CANCEL,                 /**<进程已被取消*/* / / * *其他事件*/
LV_EVENT_DELETE,                 /**<对象正在被删除*/
LV_EVENT_CHILD_CHANGED,      /**< Child was removed/added*/
LV_EVENT_SIZE_CHANGED,       /**<对象坐标/大小已更改*/
LV_EVENT_STYLE_CHANGED,      /**<对象的样式已更改*/
LV_EVENT_LAYOUT_CHANGED,         /**<子节点的位置由于布局重新计算而改变*/
LV_EVENT_GET_SELF_SIZE,      /**<获取小部件的内部大小*/
_LV_EVENT_LAST                  /**默认事件个数*/

1.5用户事件 Custom events

  MY_EVENT_1 = lv_event_register_id()可以注册任何自定义事件代码;并且可以通过lv_event_send(obj, MY_EVENT_1, &some_data)发送到任何对象。

1.6发送事件 Sending events

  手动发送事件到一个对象,使用lv_event_send(obj, <EVENT_CODE> &some_data)。
例如,它可以用来手动关闭一个消息框,通过模拟一个按钮按下(尽管有更简单的方法):

uint32_t btn_id = 0;
lv_event_send(mbox, LV_EVENT_VALUE_CHANGED, &btn_id);

1.7刷新事件 Refresh event

  LV_EVENT_REFRESH是一个特殊事件,因为它被设计为用户用来通知对象刷新自己。一些例子:
1、根据一个或多个变量(例如当前时间)通知标签刷新其文本
2、当语言改变时刷新标签
3、如果符合某些条件(例如输入正确的密码),启用一个按钮
4、如果超出了限制,可以向对象添加或从对象中删除样式,等等

1.8事件回调中结构体领域 Fields of lv_event_t

  lv_event_t 是传递给事件回调的唯一参数,它包含关于事件的所有数据。

typedef struct _lv_event_t {struct _lv_obj_t * target;           //获得事件最初瞄准的对象。即使事件是冒泡的,也是一样的。struct _lv_obj_t * current_target;  //获取事件的当前目标。它是被调用事件处理程序的对象。lv_event_code_t code;                //获取事件的事件代码void * user_data;                    //获取在对象上注册事件时传递的user_datavoid * param;                      //当事件被发送时,获取参数传递struct _lv_event_t * prev;           uint8_t deleted : 1;
} lv_event_t;

  Lv_event_t是传递给事件回调的唯一参数,它包含关于事件的所有数据。以下值可以从它中获得:

lv_event_get_code(e)         //获取事件代码
lv_event_get_current_target(e)  //获取发送事件的对象。即对象事件处理程序正在被调用。
lv_event_get_target(e)          //获取最初触发事件的对象(与Lv_event_get_target(如果启用了事件冒泡)
lv_event_get_user_data(e)       //获取作为lv_obj_add_event_cb的最后一个参数传递的指针。
lv_event_get_param(e)           //获取传递的参数作为lv_event_send的最后一个参数

1.9冒泡事件 Event bubbling

  如果 lv_obj_add_flag(obj, LV_OBJ_FLAG_EVENT_BUBBLE) 所有的事件也会被发送到对象的父对象。如果父进程也启用了LV_OBJ_FLAG_EVENT_BUBBLE,那么该事件也将被发送到它的父进程,以此类推。事件的目标参数总是当前目标对象,而不是原始对象。要获取原始目标,请在事件处理程序中调用lv_event_get_original_target(e)。

二、事件 API

  事件的API

lv_res_t lv_event_send(lv_obj_t * obj, lv_event_code_t event_code, void * param) //发送一个事件给对象
lv_res_t lv_obj_event_base(const lv_obj_class_t * class_p, lv_event_t * e)          //由小部件内部使用,调用祖先小部件类型的事件处理程序
lv_obj_t * lv_event_get_target(lv_event_t * e)                                      //获得事件最初瞄准的对象。即使事件是冒泡的,也是一样的。
lv_obj_t * lv_event_get_current_target(lv_event_t * e)                              //获取事件的当前目标。它是被调用事件处理程序的对象。
lv_event_code_t lv_event_get_code(lv_event_t * e)                                   //获取事件的事件代码
void * lv_event_get_param(lv_event_t * e)                                           //当事件被发送时,获取参数传递
void * lv_event_get_user_data(lv_event_t * e)                                       //获取在对象上注册事件时传递的user_data
uint32_t lv_event_register_id(void)                                                 //注册一个新的自定义事件ID。
void _lv_event_mark_deleted(lv_obj_t * obj)                                         //可以调用嵌套事件,其中一个可能属于正在删除的对象。
struct _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)  //为对象添加一个事件处理函数。
bool lv_obj_remove_event_dsc(lv_obj_t * obj, struct _lv_event_dsc_t * event_dsc)    //移除一个对象的事件处理函数。
lv_indev_t * lv_event_get_indev(lv_event_t * e)                                     //获取作为参数传递给indev相关事件的输入设备。
lv_obj_draw_part_dsc_t * lv_event_get_draw_part_dsc(lv_event_t * e)                 //获得零件绘制描述符作为参数传递到' LV_EVENT_DRAW_PART_BEGIN/END '。
const lv_area_t * lv_event_get_clip_area(lv_event_t * e)                            //获取剪辑区域作为参数来绘制事件事件。
const lv_area_t * lv_event_get_old_size(lv_event_t * e)                             //获取对象改变大小之前的旧区域。可以在' LV_EVENT_SIZE_CHANGED '中使用
uint32_t lv_event_get_key(lv_event_t * e)                                           //获取作为参数传递给事件的密钥。可以在' LV_EVENT_KEY '中使用
lv_anim_t * lv_event_get_scroll_anim(lv_event_t * e)                                //获取滚动的动画描述符。可以在' LV_EVENT_SCROLL_BEGIN '中使用
void lv_event_set_ext_draw_size(lv_event_t * e, lv_coord_t size)                    //设置新的额外绘制尺寸。可以在' lv_event_ref_ext_draw_size '中使用
lv_point_t * lv_event_get_self_size_info(lv_event_t * e)                            //获取一个指向' lv_point_t '变量的指针,其中自我大小应该保存(宽度在' point->x '和高度' point->y ')。
lv_hit_test_info_t * lv_event_get_hit_test_info(lv_event_t * e)                     //获取一个指向' lv_hit_test_info_t '变量的指针,该变量将保存命中测试结果。可以在' LV_EVENT_HIT_TEST '中使用
const lv_area_t * lv_event_get_cover_area(lv_event_t * e)                           //获取一个指向区域的指针,该区域应该被检查对象是否完全覆盖它。
void lv_event_set_cover_res(lv_event_t * e, lv_cover_res_t res)                     //设置封面检查的结果。可以在' LV_EVENT_COVER_CHECK '中使用

三、示例

3.1按键实现事件回调显示

/**************************************************  函数名称 :  btn_event_cb*  参    数 : 无*  函数功能 : 按键事件回调显示*************************************************/
static void btn_event_cb(lv_event_t * e)
{static unsigned int cnt = 1;lv_obj_t *btn = lv_event_get_target(e);            //获得事件最初瞄准的对象。即使事件是冒泡的,也是一样的。lv_obj_t * label = lv_obj_get_child(btn,0);        //通过子对象的索引获取子对象。lv_label_set_text_fmt(label,"%u",cnt);             //为标签设置一个新的格式化文本。内存将分配给存储文本的标签。cnt++;
}
/**************************************************  函数名称 :  event_show_1*  参    数 : 无*  函数功能 : 实现事件回调函数*************************************************/
void event_show_1()
{lv_obj_t * btn = lv_btn_create(lv_scr_act());      //创建btn对象      lv_obj_set_size(btn,100,50);                       //设置对象尺寸lv_obj_center(btn);                                //居中对象lv_obj_add_event_cb(btn,btn_event_cb,LV_EVENT_CLICKED,NULL);   //添加对象回调函数lv_obj_t * label = lv_label_create(btn);           //创建labellv_label_set_text(label,"Click me!");              //设置label的文字lv_obj_center(label);                              //居中对象
}

3.2按键回调多事件判断检测

/**************************************************  函数名称 :  event_show_cb*  参    数 : 无*  函数功能 : 按键事件回调显示*************************************************/
static void event_show2_cb(lv_event_t * e)
{lv_event_code_t code = lv_event_get_code(e);       //获取事件的事件代码lv_obj_t * label = lv_event_get_user_data(e);      //获取用户携带数据switch(code){case LV_EVENT_PRESSED:                          //按压事件lv_label_set_text(label,"The last button event:\nLV_EVENT_PRESSED");break;case LV_EVENT_CLICKED:                          //点击事件lv_label_set_text(label,"The last button event:\nLV_EVENT_CLICKED");break;case LV_EVENT_LONG_PRESSED:                     //长按压事件lv_label_set_text(label,"The last button event:\nLV_EVENT_LONG_PRESSED");break; case LV_EVENT_LONG_PRESSED_REPEAT:              //重复按压事件lv_label_set_text(label,"The last button event:\nLV_EVENT_LONG_PRESSED_REPEAT");break;case LV_EVENT_KEY:                              //KEY事件lv_label_set_text(label,"The last button event:\nLV_EVENT_KEY");break;default:break;}
}/**************************************************  函数名称 :  event_show_2*  参    数 : 无*  函数功能 : 按键联动,实现Label动画显示*************************************************/
void event_show_2()
{lv_obj_t * btn = lv_btn_create(lv_scr_act());      //创建按钮对象lv_obj_set_size(btn,100,50);                       //设置按钮尺寸lv_obj_center(btn);                                //居中对象lv_obj_t *  btn_label = lv_label_create(btn);      //创建labellv_label_set_text(btn_label,"Click Me!");          //设置字内容lv_obj_center(btn_label);                          //居中lv_obj_t * info_label = lv_label_create(lv_scr_act());         //创建labellv_label_set_text(info_label,"The last button event:\nNone");  //设置label内容lv_obj_add_event_cb(btn,event_show2_cb,LV_EVENT_ALL,info_label);//设置对调函数
}

3.3实现事件添加标志位

/**************************************************  函数名称 :  event_show_3_cb*  参    数 : 无*  函数功能 : 事件回调函数*************************************************/
static void event_show_3_cb (lv_event_t * e)
{lv_obj_t * target = lv_event_get_target(e);           //获得事件最初瞄准的对象。即使事件是冒泡的,也是一样的。       lv_obj_t * cont = lv_event_get_current_target(e);     //获取事件的当前目标。它是被调用事件处理程序的对象。if(target == cont) return;                            //判断最初瞄准对象和当前获取的对象是否一致lv_obj_set_style_bg_color(target,lv_palette_main(LV_PALETTE_RED),0); //设置对象背景颜色
}
/**************************************************  函数名称 :  event_show_3*  参    数 : 无*  函数功能 : 事件联动*************************************************/
void event_show_3()
{lv_obj_t * cont = lv_obj_create(lv_scr_act());        //创建对象lv_obj_set_size(cont,290,200);                        //设置对象尺寸lv_obj_center(cont);                                  //居中对象lv_obj_set_flex_flow(cont,LV_FLEX_FLOW_ROW_WRAP);     //设置对象伸缩流 LV_FLEX_FLOW_ROW_WRAP 伸缩流行缠绕unsigned int i;for(i=0;i<30;i++){lv_obj_t * btn = lv_btn_create(cont);              //创建对象lv_obj_set_size(btn,80,50);                        //设置对象尺寸lv_obj_add_flag(btn,LV_OBJ_FLAG_EVENT_BUBBLE);     //添加对象标志位 对象标志事件气泡lv_obj_t * label = lv_label_create(btn);           //创建Labellv_label_set_text_fmt(label,"%u",i);               //设置Label显示内容lv_obj_center(label);                              //居中对象}lv_obj_add_event_cb(cont,event_show_3_cb,LV_EVENT_CLICKED,NULL);  //添加事件回调函数
}

ESP32 LVGL8.1 ——event 事件 (event 17)相关推荐

  1. 8-26-GLI锁与普通互斥锁、死锁问题、递归锁、信号量、Event事件、并发的tcp通信、进程池线程池

    昨日回顾1 生产者消费者-在生产者和消费者之间,通过队列,增加缓冲,避免了生产者和消费者之间交互-Queue,redis,rabbitmq,kafka-解耦合,队列是微服务的基础2 线程理论,开启-进 ...

  2. Javascript Event事件-总结

    一.事件类型 例如:mouseover鼠标移动到.keydown键盘按下 二.事件目标 是发生的事件或与之相关的对象,window.document和Element对象是最常见的事件目标 三.事件对象 ...

  3. javascript中window.event事件用法详解

    前两天写程序时因为要用到javascript中的window.event事件,于是就在网上搜了一下,终于找到一篇不错的文章,来与大家分享下:  描述   event代表事件的状态,例如触发event对 ...

  4. 第53天:鼠标事件、event事件对象

    -->鼠标事件 -->event事件对象 -->默认事件 -->键盘事件(keyCode) -->拖拽效果 一.鼠标事件 onclick ---------------鼠 ...

  5. input回车触发事件_JavaScript学习笔记(十五)-- Event事件(上)

    EVENT(上) 之前我们简单的了解过一些事件,比如 onclick / onload / onscroll / ... 今天开始,我们详细的学习一些 事件 什么是事件 一个事件由什么东西组成 触发谁 ...

  6. 关于gevent的协程间通信及队列和事件event用法

    前言: 今天就写点gevent的高级点的用法,对于我来说 这些也是常用的gevent模块. gevent的AsyncResutl模块的用途,看字眼的意思是一个异步的任务的结果. 其实官方的说法也让人有 ...

  7. Android层面上对sensor及event事件的处理

    可能这篇总结写得会有一点凌乱,一会讲sensor,一会又讲event的.但是把两者摆在一起也是有原因的,sensor的处理是event事件的基础上实现的,正是因为sensor对event的依赖性,所以 ...

  8. mysql启动时自动启动event事件

    mysql定时执行-mysql event事件 2012年12月07日  ⁄ mysql基础语法  ⁄ 共 3221字 ⁄ 被围观 167 views+⁄ 发帖人:  admin 分别有liunx,j ...

  9. oracle enq ta,【案例】Oracle等待事件event enq: KO - fast object checkpoint解决办法

    [案例]Oracle等待事件event enq: KO - fast object checkpoint解决办法 时间:2016-11-03 10:11   来源:Oracle研究中心   作者:HT ...

  10. 【复习】进程、线程、协程篇,线程锁之Lock\Rlock\信号量、Event事件、Queue队列

    操作系统发展史介绍 进程.与线程区别 python GIL全局解释器锁 线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件 queue队列 生产者消费者模型 ...

最新文章

  1. Oracle Grid Control 10.2.0.5 for Linux 安装和配置指南
  2. HDU 6015 Colorful Tree(2017多校)
  3. clearbom.php,clearBOM.php
  4. 《Java程序设计》实验报告——Java的接口与继承
  5. 从放弃到再入门之拉格朗日对偶问题推导(转)
  6. 在SAP云平台的API portal里创建和管理API
  7. Python机器学习:评价分类结果001准确度和混淆矩阵
  8. C++隐式类类型转换
  9. HAProxy负载均衡代理
  10. [已解决]Eclipse 插件Maven在使用 add dependency,找不到包,解决办法
  11. 全才出书,值得一读——Leo推荐《我也能做CTO之程序员职业规划》
  12. sklearn中xgboost模块的XGBClassifier函数
  13. JAVA毕设项目宠物店管理系统设计与实现(Vue+Mybatis+Maven+Mysql+sprnig+SpringMVC)
  14. HTML上划线 中划线 下划线实现
  15. 快速掌握用户分层模型(RFM)的使用方法|【业务模型】
  16. Live archive 4490 Help Bubu
  17. C/C++复习:向量的数量积
  18. 一段集大成的thymeleaf代码
  19. 万字文肝Redis基础知识
  20. 【光流评估】《Optical Flow Estimation using a Spatial Pyramid Network》2016 Tubingen, Germany

热门文章

  1. svchost.exe是什么进程
  2. 《HTML CSS JavaScript 网页制作》第六章-创建框架结构网页
  3. 【DDD落地实践系列】DDD领域驱动设计如何进行工程化落地
  4. 2022年N1叉车司机考试题目及答案
  5. Backdoor.Zegost木马病毒分析(一)
  6. Ubuntu系统清理工具
  7. tcl怎么实现从服务器拷贝文件夹,如何在TCL中二进制读取文件并通过XMLRPC将其发送到用Python编写的服务器?...
  8. 如何让北京小车摇号中签更容易?
  9. 基于FPGA的SPI-Flash控制器的Verilog设计和验证
  10. nc 监听数据_linux包之nc之nc命令