嵌入式UI开发-lvgl+wsl2+vscode系列:5、事件(Events)

一、前言

这节进行事件的总结,通过事件回调方式将用户和ui的交互行为绑定组合起来。

二、事件示例

1、示例1(点击事件)

#include "../lv_examples.h"
#if LV_BUILD_EXAMPLES && LV_USE_SWITCHstatic void event_cb(lv_event_t * e)
{LV_LOG_USER("Clicked");static uint32_t 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, "%"LV_PRIu32, cnt);cnt++;
}/*** 为按钮添加点击事件*/
void lv_example_event_1(void)
{lv_obj_t * btn = lv_button_create(lv_screen_active());lv_obj_set_size(btn, 100, 50);lv_obj_center(btn);lv_obj_add_event_cb(btn, event_cb, LV_EVENT_CLICKED, NULL);lv_obj_t * label = lv_label_create(btn);lv_label_set_text(label, "Click me!");lv_obj_center(label);
}#endif

events1.gif
展示:为按钮添加点击事件,当用户点击时触发事件回调,在其中修改按钮的label的内容,通过全局变量点击一次则叠加一次该值。

2、示例2(处理多个事件)

#include "../lv_examples.h"
#if LV_BUILD_EXAMPLES && LV_USE_SWITCHstatic void event_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;default:break;}
}/*** 处理多个事件*/
void lv_example_event_2(void)
{lv_obj_t * btn = lv_button_create(lv_screen_active());lv_obj_set_size(btn, 100, 50);lv_obj_center(btn);lv_obj_t * btn_label = lv_label_create(btn);lv_label_set_text(btn_label, "Click me!");lv_obj_center(btn_label);lv_obj_t * info_label = lv_label_create(lv_screen_active());lv_label_set_text(info_label, "The last button event:\nNone");lv_obj_add_event_cb(btn, event_cb, LV_EVENT_ALL, info_label);
}#endif

events2.gif
展示:处理多个事件,包括按钮的点击、按下、长按、重复长按事件的处理。

3、示例3(冒泡事件)

#include "../lv_examples.h"
#if LV_BUILD_EXAMPLES && LV_USE_FLEXstatic void event_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);
}/*** 演示事件冒泡*/
void lv_example_event_3(void)
{lv_obj_t * cont = lv_obj_create(lv_screen_active());lv_obj_set_size(cont, 290, 200);lv_obj_center(cont);lv_obj_set_flex_flow(cont, LV_FLEX_FLOW_ROW_WRAP);uint32_t i;for(i = 0; i < 30; i++) {lv_obj_t * btn = lv_button_create(cont);lv_obj_set_size(btn, 70, 50);lv_obj_add_flag(btn, LV_OBJ_FLAG_EVENT_BUBBLE);lv_obj_t * label = lv_label_create(btn);lv_label_set_text_fmt(label, "%"LV_PRIu32, i);lv_obj_center(label);}lv_obj_add_event_cb(cont, event_cb, LV_EVENT_CLICKED, NULL);
}#endif

events3.gif
展示:事件冒泡(和js的冒泡事件类似,就是事件包含夫和子,比如例子中的容器和按钮,这里容器点击时事件不做处理,按钮事件则变为红色)

4、示例4(draw绘制事件)

#include "../lv_examples.h"#if LV_BUILD_EXAMPLESstatic uint32_t size = 0;
static bool size_dec = false;static void timer_cb(lv_timer_t * timer)
{lv_obj_invalidate(timer->user_data);if(size_dec) size--;else size++;if(size == 50) size_dec = true;else if(size == 0) size_dec = false;
}static void event_cb(lv_event_t * e)
{lv_obj_t * obj = lv_event_get_target(e);lv_draw_task_t * draw_task = lv_event_get_draw_task(e);lv_draw_dsc_base_t * base_dsc = draw_task->draw_dsc;if(base_dsc->part == LV_PART_MAIN) {lv_draw_rect_dsc_t draw_dsc;lv_draw_rect_dsc_init(&draw_dsc);draw_dsc.bg_color = lv_color_hex(0xffaaaa);draw_dsc.radius = LV_RADIUS_CIRCLE;draw_dsc.border_color = lv_color_hex(0xff5555);draw_dsc.border_width = 2;draw_dsc.outline_color = lv_color_hex(0xff0000);draw_dsc.outline_pad = 3;draw_dsc.outline_width = 2;lv_area_t a;a.x1 = 0;a.y1 = 0;a.x2 = size;a.y2 = size;lv_area_align(&obj->coords, &a, LV_ALIGN_CENTER, 0, 0);lv_draw_rect(base_dsc->layer, &draw_dsc, &a);}
}/*** 演示draw事件的使用*/
void lv_example_event_4(void)
{lv_obj_t * cont = lv_obj_create(lv_screen_active());lv_obj_set_size(cont, 200, 200);lv_obj_center(cont);lv_obj_add_event_cb(cont, event_cb, LV_EVENT_DRAW_TASK_ADDED, NULL);lv_obj_add_flag(cont, LV_OBJ_FLAG_SEND_DRAW_TASK_EVENTS);lv_timer_create(timer_cb, 30, cont);
}#endif

events4.gif
展示:draw事件使用(和android以及其它的一些gui的绘制事件类似,一般用来画圆或者画线,对于初学者来说不用太多深入,暂时了解存在这种方式,可以后续再来深入研究)

三、最后

基本上前三种事件就足够大多数场景用了,嵌入式场景一般不会使用特别复杂的UI设计,但是也需要对绘制事件有一个印象,说不定有独特的设计会需要这种事件来支持,特别是实现一些复杂炫酷动画的时候。

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

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

相关文章

Chapter8 透明效果——Shader入门精要学习笔记

一、基本概念 在Unity中通常使用两种方法来实现透明效果 透明度测试&#xff08;无法达到真正的半透明效果&#xff09;透明度混合&#xff08;关闭了深度写入&#xff09; 透明度测试 基本原理&#xff1a;设置一个阈值&#xff0c;只要片元的透明度小于阈值&#xff0c;就…

全球AI新闻速递7.1

全球AI新闻速递 1.科大讯飞发布讯飞星火 V4.0。 2.成都人形机器人创新中心&#xff1a;基于视觉扩散架构的人形机器人任务生成式模型 R-DDPRM。 3.安徽省人形机器人产业创新中心获批&#xff0c;将打造国内首创、世界领先研究基地。 4.亳州牵手华为打造华佗中医药大模型。 …

[论文精读]Variational Graph Auto-Encoders

论文网址&#xff1a;[1611.07308] Variational Graph Auto-Encoders (arxiv.org) 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎…

DL/T 645与modbus协议是否兼容,有何关系?

不兼容。645是电表协议&#xff0c;modbus是通用控制协议&#xff0c;两个是平行关系&#xff0c;两个协议都可以使用485通信协议&#xff08;物理接口协议&#xff09;进行传输&#xff0c;或传输介质与物理接口相同&#xff0c;软件协议不同。 Modbus有以下三种通信模式 在…

ARM功耗管理软件之时钟电源树

安全之安全(security)博客目录导读 思考&#xff1a;功耗管理软件栈及示例&#xff1f;WFI&WFE&#xff1f;时钟&电源树&#xff1f;DVFS&AVS&#xff1f; 目录 一、时钟&电源树简介 二、时钟树示例 三、电源树示例 一、时钟&电源树简介 时钟门控与自…

Victor CMS v1.0 SQL 注入漏洞(CVE-2022-28060)

前言 CVE-2022-28060 是 Victor CMS v1.0 中的一个SQL注入漏洞。该漏洞存在于 /includes/login.php 文件中的 user_name 参数。攻击者可以通过发送特制的 SQL 语句&#xff0c;利用这个漏洞执行未授权的数据库操作&#xff0c;从而访问或修改数据库中的敏感信息。 漏洞详细信…

论文阅读_优化RAG系统的检索

英文名称: The Power of Noise: Redefining Retrieval for RAG Systems 中文名称: 噪声的力量&#xff1a;重新定义RAG系统的检索 链接: https://arxiv.org/pdf/2401.14887.pdf 作者: Florin Cuconasu, Giovanni Trappolini, Federico Siciliano, Simone Filice, Cesare Campag…

App测试技术(纯理论)

之前我们也学习过一些普通用例的设计, 如功能, 性能, 安全性, 兼容性, 易用性, 界面的测试用例设计, 之前我们讲的基本都是对于Web应用而言的, 这里我们来讲一下移动端的App测试用例设计. 功能方面 安装&卸载测试 这是只属于App的一类测试, 再平常我们使用移动设备(手机…

【第11章】MyBatis-Plus条件构造器(上)

文章目录 前言一、功能详解1. allEq2. eq3. ne4. gt5. ge6. lt7. le8. between9. notBetween10. like11. notLike12. likeLeft13. likeRight14. notLikeLeft15. notLikeRight16. isNull17. in18. notIn19. inSql20. notInSql21. eqSqlSince 3.5.622. gtSql Since 3.4.3.223. ge…

Linux4(Docker)

目录 一、Docker介绍 二、Docker结构 三、Docker安装 四、Docker 镜像 五、Docker 容器 六、Docker 安装nginx 七、Docker 中的MySQL部署 一、Docker介绍 Docker&#xff1a;是给予Go语言实现的开源项目。 Docker的主要目标是“Build,Ship and Run Any App,Anywhere” 也…

类和对象【上】【C++】

P. S.&#xff1a;以下代码均在VS2019环境下测试&#xff0c;不代表所有编译器均可通过。 P. S.&#xff1a;测试代码均未展示头文件stdio.h的声明&#xff0c;使用时请自行添加。 博主主页&#xff1a;LiUEEEEE                        …

依托天拓四方工业智能网关实现CNC数控机床的远程运维

随着工业4.0时代的到来&#xff0c;智能制造和工业互联网成为了推动制造业转型升级的重要力量。CNC数控机床作为制造业的核心设备&#xff0c;其运行效率与稳定性直接关系到企业的生产效益。因此&#xff0c;实现CNC数控机床的远程运维&#xff0c;对于提升企业竞争力、降低运营…

安装 Docker 环境(通过云平台创建一个实例实现)

目录 1. 删除原有 yum 2. 手动配置 yum 源 3. 删除防火墙规则 4. 保存防火墙配置 5. 修改系统内核。打开内核转发功能。 6. 安装 Docker 7. 设置本地镜像仓库 8.重启服务 1. 删除原有 yum rm -rfv /etc/yum.repos.d/* 2. 手动配置 yum 源 使用 centos7-1511.iso 和 Xi…

Java [ 基础 ] 方法引用 ✨

✨探索Java基础✨ Java基础&#xff1a;方法引用 方法引用是Java 8中引入的一种新特性&#xff0c;它使得代码更加简洁和易读。方法引用提供了一种可以直接引用已有方法作为Lambda表达式的替代方案。本文将深入介绍方法引用的基本概念、使用方法、具体实例及其在实际开发中的…

【深入浅出 】——【Python 字典】——【详解】

目录 1. 什么是 Python 字典&#xff1f; 1.1 字典的基本概念 1.2 字典的用途 1.3 字典的优势 2. 字典的基本特点 2.1 键的唯一性 2.2 可变性 2.3 无序性 3. 如何创建字典&#xff1f; 3.1 使用 {} 符号 3.2 使用 dict() 工厂方法 3.3 使用 fromkeys() 方法 4. 字…

[工业网络][2] 安全背景知识

安全背景知识 物理、网络和人员安全 在考虑企业和工业的安全性时&#xff0c;安全从业人员传统上将自己划分为三个专业领域。我们借助于安全中经常使用的两个术语来描述这三个领域 业内人士。属于您的设施的人员&#xff0c;包括员工和受邀承包商&#xff0c;访客或交付和服…

K8s的基本使用和认识

目录 介绍 控制端 Node(节点) 控制端与节点的关系图 基本使用 创建和运行资源 查找和参看资源 修改和删除资源 介绍 控制端 api-server(api)是集群的核心是k8s中最重要的组件,因为它是实现声明式api的关键 kubernetes api-server的核心功能是提供了Kubernetes各类资…

应用监控SkyWalking调研

参考&#xff1a; 链路追踪( Skyworking )_skywalking-CSDN博客 企业级监控项目Skywalking详细介绍&#xff0c;来看看呀-CSDN博客 SkyWalking 极简入门 | Apache SkyWalking 使用 SkyWalking 监控 ClickHouse Server | Apache SkyWalking https://zhuanlan.zhihu.com/p/3…

Linux应急响应靶机 2

一、靶机介绍 应急响应靶机-Linux2 前景需要&#xff1a;看监控的时候发现webshell告警&#xff0c;领导让你上机检查你可以救救安服仔吗&#xff01;&#xff01; 1,提交攻击者IP 2,提交攻击者修改的管理员密码(明文) 3,提交第一次Webshell的连接URL(http://xxx.xxx.xxx.…

【每日刷题】Day78

【每日刷题】Day78 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 1608. 特殊数组的特征值 - 力扣&#xff08;LeetCode&#xff09; 2. 1385. 两个数组间的距离值 - …