嵌入式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; 目录 一、时钟&电源树简介 二、时钟树示例 三、电源树示例 一、时钟&电源树简介 时钟门控与自…

人工智能与机器学习原理精解【1】

文章目录 Rosenblatt感知器基础收敛算法算法概述算法步骤关键点说明总结 C实现要点代码 参考文献 Rosenblatt感知器 基础 感知器&#xff0c;也可翻译为感知机&#xff0c;是一种人工神经网络。它可以被视为一种最简单形式的前馈式人工神经网络&#xff0c;是一种二元线性分类…

【技术路线选择】:Qt or macOS/iOS ?

【技术路线选择】&#xff1a;Qt or macOS/iOS ? 【Question 1】&#xff1a; I have more than two years of experience developing with the following skills: Qt C and macOS/iOS development. Im interested in pursuing a software engineering career and would …

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…

半导体中名词“wafer”“chip”“die”中文名字和用途

①wafer——晶圆 wafer 即为图片所示的晶圆&#xff0c;由纯硅(Si)构成。一般分为6英寸、8英寸、12英寸规格不等&#xff0c;晶片就是基于这个wafer上生产出来的。晶圆是指硅半导体集成电路制作所用的硅晶片&#xff0c;由于其形状为圆形&#xff0c;故称为晶圆;在硅晶片上可加…

App测试技术(纯理论)

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

php 命令行模式详解

PHP 的命令行模式&#xff08;Command Line Interface, CLI&#xff09;是 PHP 的一个特定版本或运行时配置&#xff0c;它允许 PHP 脚本在没有 Web 服务器的情况下直接在命令行环境中执行。CLI 版本的 PHP 通常不包含 CGI 或者其他 web server 接口&#xff0c;因此更轻量级&a…

Redis的使用(一)概述

1.绪论 redis是一款用c编写的kv数据库&#xff0c;它具有丰富的数据类型&#xff0c;并且执行原子操作&#xff0c;自带数持久化&#xff0c;并且实现了集群部署等功能&#xff0c;我们来看看它有哪些特点: 1.提供了丰富的数据结构&#xff0c;比如string&#xff0c;list&am…

【第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” 也…

jenkins配置git

参考&#xff1a; 容器化部署 Jenkins&#xff0c;并配置SSH远程操作服务器_jenkins ssh-CSDN博客

类和对象【上】【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…