LVGL中的事件

文章目录

    • 🧱 一、什么是 LVGL 事件?
    • 🎯 二、事件回调的注册
      • 参数解释:
      • 示例:
    • 📚 三、常见事件类型(`lv_event_code_t`)
      • ✅ 1. 输入类事件(用户交互)
      • ✅ 2. 组件状态类事件
      • ✅ 3. 生命周期类事件
      • ✅ 4. 滚动与拖动类事件
    • ⚙️ 四、事件回调函数结构
    • 🧪 五、完整示例:按钮点击显示消息
    • 🧠 六、LVGL 事件的高级用法
      • ✅ 一次处理多个事件
      • ✅ 使用用户数据传参
    • 📌 总结


LVGL(Light and Versatile Graphics Library) 中,事件系统 是控件间交互的核心机制。它让你能响应按钮点击、滑动、值变化、焦点获取等各种行为。

我们来系统性地讲解:


🧱 一、什么是 LVGL 事件?

事件(lv_event_t)是 LVGL 中 控件生命周期或用户操作引发的动作通知

控件通过事件系统通知外部“某件事发生了”,我们通过注册回调函数处理这些事件,完成逻辑响应。

比如:

  • 按钮被点击(点击事件)
  • 滚动条滚动(值改变事件)
  • 对象被删除(清理事件)

🎯 二、事件回调的注册

事件处理函数的注册使用 lv_obj_add_event_cb() 函数:

lv_obj_add_event_cb(obj, my_event_cb, LV_EVENT_CLICKED, user_data);

参数解释:

  • obj:要监听的对象
  • my_event_cb:事件回调函数(函数指针)
  • LV_EVENT_CLICKED:要监听的事件类型
  • user_data:用户自定义数据指针,会传给回调(可为 NULL

示例:

void my_event_cb(lv_event_t * e)
{lv_event_code_t code = lv_event_get_code(e);lv_obj_t * target = lv_event_get_target(e);if (code == LV_EVENT_CLICKED) {printf("Button clicked!\n");}
}

📚 三、常见事件类型(lv_event_code_t

LVGL 的事件可以分为几类:

✅ 1. 输入类事件(用户交互)

事件宏描述
LV_EVENT_PRESSED用户按下对象(触摸/点击)
LV_EVENT_PRESSING按住过程中
LV_EVENT_PRESS_LOST按住但滑出控件范围
LV_EVENT_RELEASED用户释放了对象
LV_EVENT_CLICKED完整的一次点击(按下+释放)
LV_EVENT_LONG_PRESSED长按触发
LV_EVENT_LONG_PRESSED_REPEAT长按后重复触发

✅ 2. 组件状态类事件

事件宏描述
LV_EVENT_FOCUSED控件获取焦点
LV_EVENT_DEFOCUSED控件失去焦点
LV_EVENT_VALUE_CHANGED控件的值发生变化(如 slider)

✅ 3. 生命周期类事件

事件宏描述
LV_EVENT_DRAW_MAIN_BEGIN/END绘制开始/结束(自定义绘制用)
LV_EVENT_DELETE控件即将被删除
LV_EVENT_CHILD_CHANGED子对象添加/删除

✅ 4. 滚动与拖动类事件

事件宏描述
LV_EVENT_SCROLL_BEGIN开始滚动
LV_EVENT_SCROLL_END滚动停止
LV_EVENT_SCROLL正在滚动
LV_EVENT_SCROLL_DRAW_BEGIN/END滚动绘制开始/结束

⚙️ 四、事件回调函数结构

void my_event_cb(lv_event_t * e)
{lv_event_code_t code = lv_event_get_code(e);  // 获取事件类型lv_obj_t * obj = lv_event_get_target(e);      // 获取触发对象void * user_data = lv_event_get_user_data(e); // 获取用户数据if(code == LV_EVENT_CLICKED) {printf("Clicked: %s\n", lv_obj_get_style_text(obj, LV_PART_MAIN));}
}

🧪 五、完整示例:按钮点击显示消息

void btn_event_cb(lv_event_t * e)
{lv_event_code_t code = lv_event_get_code(e);lv_obj_t * btn = lv_event_get_target(e);if(code == LV_EVENT_CLICKED) {printf("按钮被点击了!\n");lv_obj_t * label = lv_obj_get_child(btn, 0);lv_label_set_text(label, "已点击!");}
}void create_btn()
{lv_obj_t * btn = lv_btn_create(lv_scr_act());lv_obj_center(btn);lv_obj_t * label = lv_label_create(btn);lv_label_set_text(label, "点我");lv_obj_center(label);lv_obj_add_event_cb(btn, btn_event_cb, LV_EVENT_CLICKED, NULL);
}

🧠 六、LVGL 事件的高级用法

✅ 一次处理多个事件

lv_obj_add_event_cb(obj, my_cb, LV_EVENT_ALL, NULL);

然后在 my_cb 里判断 code 即可。


✅ 使用用户数据传参

struct {int count;const char * msg;
} my_data = {0, "点击次数"};lv_obj_add_event_cb(obj, my_cb, LV_EVENT_CLICKED, &my_data);

在回调中获取:

void * data = lv_event_get_user_data(e);

📌 总结

LVGL 的事件系统 = 控件行为通知机制:

  • lv_obj_add_event_cb() 注册回调;
  • lv_event_t 是事件容器;
  • lv_event_get_code() 获取事件类型;
  • 支持交互、生命周期、绘图等多个事件维度;
  • 能通过用户数据传递自定义信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/905040.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

警惕C#版本差异多线程中的foreach陷阱

警惕C#版本差异多线程中的foreach陷阱​ 同样的代码,不同的结果闭包捕获的“时间差”问题绕过闭包陷阱的三种方法Lambda立即捕获(代码简洁)显式传递参数(兼容性最佳)使用Parallel.ForEach(官方推荐)注意事项:版本兼容性指南警惕多线程中的foreach陷阱:C#版本差异引发的…

mac u盘重装mac10.15Catalina系统

我的电脑提mac2017的air 重装过程 (文件夹中间有空格时为 Install\ macOS\ Catalina 才行) (有需要的,最好做一下备份,有些东西可以及时找到配置和文件之类的, u盘制作是在mac电脑上操作的) 一、先下载系统镜像文件或自行到官方…

说说es配置项的动态静态之分和集群配置更新API

这天因为某件工作来到了es官网某个参数配置相关的页面,注意到了下图圆圈里的“Dynamic”: 链接:https://www.elastic.co/guide/en/elasticsearch/reference/8.1/modules-cluster.html#misc-cluster-settings 显然这是对配置项的一个描述&am…

2025软考【系统架构设计师】:两周极限冲刺攻略(附知识点解析+答题技巧)

距离2025上半年“系统架构设计师”考试已经只剩最后两周了,还没有准备好的小伙伴赶紧行动起来。为了帮助大家更好的冲刺学习,特此提供一份考前冲刺攻略。本指南包括考情分析、答题技巧、注意事项三个部分,可以参考此指南进行最后的复习要领&a…

web animation API 锋利的css动画控制器 (更新中)

什么是web animation api 以及为什么要使用web animation api? web animation API 是web页面中控制DOM元素动画效果的javascript原生API。 它能够逐个关键帧控制动画效果,具有Timeline 机制‌能通过javascript来实现动画的暂停,播放&#x…

Linux基础io知识

理解 "文件" 狭义理解 文件在磁盘里 磁盘是永久性存储介质,因此文件在磁盘上的存储是永久性的 磁盘是外设(即是输出设备也是输入设备) 磁盘上的文件 本质是对文件的所有操作,都是对外设的输入和输出 简称 IO 广义理解…

视频编解码学习三之显示器续

一、现在主流的显示器是LCD显示器吗? 是的,现在主流的显示器仍然是 LCD(液晶显示器,Liquid Crystal Display),但它已经细分为多种技术类型,并和其他显示技术(如OLED)形成…

[测试]并发模拟工具Apache Bench 进行AB压力测试

下载(windows) https://www.apachelounge.com/download/ 下载后解压,解压后进入bin目录,打开CMD,即可使用 命令 ab.exe -n 请求总数 -c 并发数 http://网站/ 比如ab.exe -n 1000 -c 100 http://127.0.0.1:5555/ 看不懂的话直接把结果让AI分析…

LeetCode 热题 100 138. 随机链表的复制

LeetCode 热题 100 | 138. 随机链表的复制 大家好,今天我们来解决一道经典的链表问题——随机链表的复制。这道题在 LeetCode 上被标记为中等难度,要求深拷贝一个带有随机指针的链表。 问题描述 给你一个长度为 n 的链表,每个节点包含一个额…

开源分享:TTS-Web-Vue系列:Vue3实现固定顶部与吸顶模式组件

🎯 本文是TTS-Web-Vue系列的第十三篇文章,重点介绍项目中固定顶部导航和内容区域吸顶模式的实现方案。通过这些优化,我们大幅提升了用户在滚动页面时的交互体验,使关键操作区域始终可见,同时实现了更现代化的界面视觉效…

Docker、Docker-compose、K8s、Docker swarm之间的区别

1.Docker docker是一个运行于主流linux/windows系统上的应用容器引擎,通过docker中的镜像(image)可以在docker中构建一个独立的容器(container)来运行镜像对应的服务; 例如可以通过mysql镜像构建一个运行mysql的容器,既可以直接进入该容器命…

用浏览器打开pdf,如何使用划词翻译?

1. 浏览器 | 扩展 | 获取 Microsoft Edge 扩展 2. 搜索 “沙拉查词” 点击“获取” 3. 扩展这里选择 管理扩展 勾选 “允许访问文件url” 注:这里一定要勾选,否则沙拉查词无法访问.pdf 文件!!!会出现下图错误 4. 右击…

深入解析STM32中断机制:从原理到外部中断实战

知识点1【中断的介绍】 单片机的中断——硬件中断 Linux操作系统的中断——软件中断 中断是指计算机运行过程中,出现某种意外情况需要主机干预,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后有返回原本暂停的程序继续运…

【入门】打印字母塔

描述 输入行数N,打印图形. 输入描述 输入只有一行&#xff0c;包括1个整数。(N<15) 输出描述 输出有N行. #include <bits/stdc.h> using namespace std; int main() { char t;int n,f;cin>>n;for(int i1;i<n;i){tchar(65i);for(int j1;j<n-i;j){cout…

CentOS 7.9 安装详解:手动分区完全指南

CentOS 7.9 安装详解&#xff1a;手动分区完全指南 为什么需要手动分区&#xff1f;CentOS 7.9 基本分区说明1. /boot/efi 分区2. /boot 分区3. swap 交换分区4. / (根) 分区 可选分区&#xff08;进阶设置&#xff09;5. /home 分区6. /var 分区7. /tmp 分区 分区方案建议标准…

油冷式电动滚筒设计:关键技术解析与应用前景

引言 电动滚筒作为一种集动力传输、减速和驱动功能于一体的机电一体化设备&#xff0c;在输送机械、矿山设备、食品加工等领域广泛应用。随着工业设备向高效化、紧凑化和智能化发展&#xff0c;传统风冷式电动滚筒的散热效率与负载能力已逐渐难以满足需求。油冷式电动滚筒凭借…

Android开发-Activity附加信息

在Android应用开发中&#xff0c;除了基本的界面跳转和数据传递之外&#xff0c;我们还经常需要为Activity添加一些附加信息&#xff08;Metadata&#xff09;&#xff0c;以支持更复杂的配置需求或与系统进行交互。这些附加信息可以通过<meta-data>标签在AndroidManifes…

2025第九届御网杯网络安全大赛线上赛 区域赛WP (MISC和Crypto)(详解-思路-脚本)

芜湖~ 御网杯线上分是越来越精细 区域赛都有了 然后不过多评价 整体不算难 以下是我自己的一些思路和解析 有什么问题或者建议随时都可以联系我 目录 芜湖~ MISC #被折叠的显影图纸 #光隙中的寄生密钥 #ez_xor #套娃 #easy_misc #ez_pictre Crypto #easy签到题 …

‌中继器:网络中的“血包”与“加时器”‌

在探讨网络技术时&#xff0c;我们往往会遇到各种专业术语和设备&#xff0c;中继器便是其中之一。然而&#xff0c;对于非技术人员或初学者来说&#xff0c;这些概念可能显得抽象且难以理解。今天&#xff0c;我将通过一个生动的比喻——将中继器比作网络中的“血包”与“加时…

MySQL----高级查询

目录标题 ⭐**多表查询的格式**⭐**查询前说明**一.**使用内连接**inner join**进行多表查询****1.介绍****2.事例** 二.**使用外连接**outer join**进行多表查询**1.**介绍** ⭐多表查询的格式 其一 select *&#xff5c;字段列表 from 表1[查询类型] join 表名2 on 连接条件…