芯课堂 | LVGL基础知识(二)

引言

在 LVGL 中,用户界面的基本构建块是对象,也称为小部件(widget)。默认情况下,LVGL在背景上绘制旧对象,在前景上绘制新对象。

对象层级(Layers)

创建对象层级顺序

默认情况下,LVGL在背景上绘制旧对象,在前景上绘制新对象。

例如,假设我们向父对象添加了一个名为 button1 的按钮,然后又添加了另一个名为button2的按钮。由于先创建了 button1,所以 button1 会被 button2 及其子对象覆盖。

图片

    /*Create a screen*/

    lv_obj_t * scr = lv_obj_create(NULL, NULL);

    lv_scr_load(scr);                                                               /*Load the screen*/

    /*Create 2 buttons*/

    lv_obj_t * btn1 = lv_btn_create(scr, NULL);         /*Create a button on the screen*/

    lv_btn_set_fit(btn1, true, true);                   /*Enable to automatically set the size according to the content*/

    lv_obj_set_pos(btn1, 60, 40);                                   /*Set the position of the button*/

    lv_obj_t * btn2 = lv_btn_create(scr, btn1);         /*Copy the first button*/

    lv_obj_set_pos(btn2, 180, 80);                          /*Set the position of the button*/

    /*Add labels to the buttons*/

    lv_obj_t * label1 = lv_label_create(btn1, NULL);        /*Create a label on the first button*/

    lv_label_set_text(label1, "Button 1");                  /*Set the text of the label*/

    lv_obj_t * label2 = lv_label_create(btn2, NULL);        /*Create a label on the second button*/

    lv_label_set_text(label2, "Button 2");                  /*Set the text of the label*/

    /*Delete the second label*/

    lv_obj_del(label2);

将图层设到前台(foreground)展示

有几种方法可以将对象置于前台:

•使用 lv_obj_set_top(obj,true) 。如果 obj 或它的任何子对象被点击,那么 LVGL 将自动将该对象带到前台。它的工作原理类似于PC机上典型的GUI,当点击背景中的窗口时,它会在前台展示。

•使用lv_obj_move_foreground(obj) 显式地告诉库将对象带到前台。类似地,使用 lv_obj_move_background(obj) 将对象 obj 移动到背台。

•当使用 lv_obj_set_parent(obj,new_parent) 时, obj 将在 new_parent 的前面。

顶层和系统层

LVGL 有两个特殊的图层;layer_top 和 layer_sys 。两者在显示器的所有屏幕上都是可见且通用的。但是,它们不会在多个物理显示器之间共享。layer_top 始终位于默认屏幕 ( lv_scr_act() )的顶部, layer_sys 则位于 layer_top 的顶部。用户可以使用 layer_top 来创建一些随处可见的内容。例如,菜单栏,弹出窗口等。如果启用了 click 属性,那么 layer_top 将吸收所有用户单击并充当模态。

     lv_obj_set_click(lv_layer_top(), true);

layer_sys 也用于LVGL。例如,它将鼠标光标放在那里以确保它始终可见。

事件(Events)

LVGL中可触发事件,用于与用户进行交互。例如一个对应对象的事件可以有:

•被点击

•被拖拽

•被更改了数值

•等等

我们可以将回调函数分配给对象以处理这些事件。例如:

lv_obj_t * btn = lv_btn_create(lv_scr_act(), NULL);

lv_obj_set_event_cb(btn, my_event_cb);      /* 指定一个事件回调函数 */

    ...

    static void my_event_cb(lv_obj_t * obj, lv_event_t event)

    {

            switch(event) {

                    case LV_EVENT_PRESSED:              /* 对象被按下 */

                            printf("Pressed\n");

                            break;

                    case LV_EVENT_SHORT_CLICKED:        /* 对象被点击 */

                            printf("Short clicked\n");

                            break;

                    case LV_EVENT_CLICKED:              /* 对象被短点击 */

                            printf("Clicked\n");

                            break;

                    case LV_EVENT_LONG_PRESSED:         /* 对象被长按 */

                            printf("Long press\n");

                            break;

                    case LV_EVENT_LONG_PRESSED_REPEAT:  /* 对象被重复长按 */

                            printf("Long press repeat\n");

                            break;

                    case LV_EVENT_RELEASED:             /* 对象被释放 */

                            printf("Released\n");

                            break;

            }

               /*Etc.*/

    }

注意:多个对象可以使用同一回调函数。

事件类型

事件类型有如下几种:

通用事件

所有对象(例如 Buttons/Labels/Sliders 等)都可以接收这些通用事件。

与输入设备有关的事件

当用户按下/释放对象时,将发送这些消息。它们不仅用于指针,还可以用于键盘,编码器和按钮输入设备。访问输入设备概述部分以了解有关它们的更多信息。

•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_REP_TIME 毫秒的 LV_INDEV_LONG_PRESS_TIME 之后调用。如果拖动则不调用。

•LV_EVENT_CLICKED 如果未拖动则调用释放(无论长按)

•LV_EVENT_RELEASED 在上面每种情况下都被调用,即使对象已被拖动也被释放。如果在按下并从对象外部释放时从对象上滑出,则不会调用。在这种情况下,将发送 LV_EVENT_PRESS_LOST 。

指针相关的事件

这些事件仅由类似指针的输入设备(例如鼠标或触摸板)触发

•LV_EVENT_DRAG_BEGIN 开始拖动对象

•LV_EVENT_DRAG_END 拖动完成(包括拖动)

•LV_EVENT_DRAG_THROW_BEGIN 拖动开始(用“动量”拖动后释放)

与键盘和编码器相关的事件

这些事件由键盘和编码器输入设备发送。在 [overview/indev](输入设备)部分中了解有关组的更多信息。

•LV_EVENT_KEY 键值发送到对象。通常在按下它或在长按之后重复时。可以通过以下方式检索键值 uint32_t * key = lv_event_get_data()

•LV_EVENT_FOCUSED 该对象集中在其组中

•LV_EVENT_DEFOCUSED 该对象在其组中散焦

一般事件

LVGL库发送的其他一般事件。

LV_EVENT_DELETE 该对象正在被删除。释放相关的用户分配数据。

特殊事件

这些事件特定于特定的对象类型。

•LV_EVENT_VALUE_CHANGED 对象值已更改(例如,对于滑块)

•LV_EVENT_INSERT 有内容插入到对象中。(通常到文本区域)

•LV_EVENT_APPLY 单击“确定”,“应用”或类似的特定按钮。(通常来自键盘对象)

•LV_EVENT_CANCEL 单击“关闭”,“取消”或类似的特定按钮。(通常来自键盘对象)

•LV_EVENT_REFRESH 查询以刷新对象。永远不会由库发送,但可以由用户发送。

请访问特定对象类型的文档,以了解对象类型使用了哪些事件。

自定义事件包含的数据

一些事件可能包含自定义数据。例如,在某些情况下, LV_EVENT_VALUE_CHANGED 会告知新值。有关更多信息,请参见特定对象类型的文档。要在事件回调中获取自定义数据,请使用 lv_event_get_data() 。

自定义数据的类型取决于发送对象,但如果是下面两种情况需要特殊对待:

•数值,则为 uint32_t * 或 int32_t * 类型

•字符,则为 char * 或 const char * 类型

手动发送事件

任意事件

要将事件手动发送到对象,请使用 lv_event_send(obj, LV_EVENT_..., &custom_data) 。

例如,它可以通过模拟按钮按下来手动关闭消息框(尽管有更简单的方法):

  /*Simulate the press of the first button (indexes start from zero)*/

    uint32_t btn_id = 0;

    lv_event_send(mbox, LV_EVENT_VALUE_CHANGED, &btn_id);

刷新事件

LV_EVENT_REFRESH 是特殊事件,因为它旨在供用户用来通知对象刷新自身。一些例子:

•通知标签根据一个或多个变量(例如当前时间)刷新其文本

•语言更改时刷新标签

•如果满足某些条件,请启用按钮(例如,输入正确的PIN)

•如果超出限制,则向对象添加样式/从对象删除样式等

处理类似情况的最简单方法是利用以下函数:

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 作为参数传递,则将刷新所有显示的所有对象。

以上就关于在 LVGL 中,用户界面的基本构建块之对象层级和事件的介绍。如您有疑问,欢迎联系我们一起交流! 

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

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

相关文章

优化独立站网页布局,提升30%用户留存

近几年很多老板都意识到私域流量的重要性,也都开始从各类平台转战独立站。但是独立站起步也是困难重重,首先很直接的问题就是独立站的搭建,今天咱们就抛开技术,单纯聊聊网页的排版布局。 1. 忌文字多 不是说不让用文字&#xff…

2023:毕业后工作多年机械转编程——心路历程

还记得当初自己为什么选择计算机? 刚接触计算机的时候,是因为工作接触到了一款国家基本服务的软件,跟几个程序员大神们相处了半年,加班到凌晨也不觉得累。我当时是做的工作对标现在的产品经理,但我当时在公司的岗位仅…

vue前端表单常用的邮箱、电话、身份证、url、Ip等正则式多语言版校验

utils工具类中创建verify.js 常用表單校驗 //正则校验的正则表达式,这里注意正则表达式中的‘\’要使用‘\\’转义 const patterns {"name": "^[a-zA-Z_][0-9a-zA-Z_]{0,}$","phone": "^(13[0-9]|14[5|7]|15[0|1|2|3|4|5|6|7…

数字人对话系统 Linly-Talker(已加入Qwen和GeminiPro加强对话+上传任意图片的数字人)

🔥🔥🔥数字人对话系统 Linly-Talker🔥🔥🔥(已加入Qwen和GeminiPro加强对话上传任意图片的数字人) English 简体中文 欢迎大家star我的仓库 https://github.com/Kedreamix/Linly-Ta…

Git专栏篇

一、基础知识 二、常用手段 1. 复制其他提交到本分支 目的:现有git仓库,该仓库有两个分支a和b,将a分支的最近三个版本提交内容复制 到b分支的提交上。 在 Linux 系统中,你可以按照以下步骤将分支 A 的最近三个版本的提交内容复…

linux 环境下安装ffmpeg。

参考 https://www.anquanclub.cn/9782.html 下载解压 wget http://www.ffmpeg.org/releases/ffmpeg-3.1.tar.gz tar -zxvf ffmpeg-3.1.tar.gz cd ffmpeg-3.1. ./configure --prefix/usr/local/ffmpeg make && make install 之后在 ffmepg目录下执行 ./ffmpeg -versio…

CMake中引入第三方库

CMake中,如果我们需要引入第三方库,首先想到的是用find_package函数。的确,如果我们引入的第三方库是一些比较标准的库如OpenCV可以用下面的代码。 set(OpenCV_DIR xxxx) # xxxx目录包含OpenCVConfig.cmake find_package(opencv required) #…

XOR运算文件加密示例

前言: XOR加密是一种非常简单的加密技术属于对称加密(相同的密钥进行加密和解密),不提供机密性或完整性验证因此不适用于高度敏感的数据,容易受到各种攻击,包括已知明文攻击。在实际应用中,应该…

实时记录和查看Apache 日志

Apache 是一个开源的、广泛使用的、跨平台的 Web 服务器,保护 Apache Web 服务器平台在很大程度上取决于监控其上发生的活动和事件,监视 Apache Web 服务器的最佳方法之一是收集和分析其访问日志文件。 Apache 访问日志提供了有关用户如何与您的网站交互…

外贸客户邮箱采集软件的工作原理

外贸客户邮箱采集软件是专为外贸从业人员设计的工具,旨在帮助用户快速、准确地获取潜在客户的邮箱地址。此类软件在国际贸易中发挥着越来越重要的作用,尤其在当前数字化时代,有效的客户邮箱采集已成为外贸业务成功的关键因素之一。 该软件的…

Volcano Controller控制器源码解析

Volcano Controller控制器源码解析 本文从源码的角度分析Volcano Controller相关功能的实现。 本篇Volcano版本为v1.8.0。 Volcano项目地址: https://github.com/volcano-sh/volcano controller命令main入口: cmd/controller-manager/main.go controller相关代码目录: pkg/co…

一加 Buds 3正式发布:普及旗舰音质 一加用户首选

1月4日,一加新品发布会正式推出旗下新款耳机一加 Buds 3。延续一加经典美学,秉承音质完美主义追求,一加 Buds 3全面普及一加旗舰耳机体验,其搭载旗舰同款“超清晰同轴双单元”,配备49dB 4000Hz超宽频主动降噪&#xff…

pandas时间加减

在 Pandas 中,可以使用加减法运算符(、-)对时间序列进行加减运算。还可以使用 pd.DateOffset 或 pd.Timedelta 对时间序列进行偏移。 示例: import pandas as pd# 创建时间序列 date_rng pd.date_range(start1/1/2020, end1/10/2020, freqD) df pd.D…

万界星空科技MES系统中的生产管理

MES系统能够帮助企业实现生产计划管理、生产过程控制、产品质量管理、车间库存管理、项目看板管理等,提高企业制造执行能力。 万界星空MES系统特点: 1. 采用强大数据采集引擎、整合数据采集渠道(RFID、条码设备、PLC、Sensor、IPC、PC等&…

【中小型企业网络实战案例 七】配置限速

相关学习文章: 【中小型企业网络实战案例 一】规划、需求和基本配置 【中小型企业网络实战案例 二】配置网络互连互通【中小型企业网络实战案例 三】配置DHCP动态分配地址 【中小型企业网络实战案例 四】配置OSPF动态路由协议【中小型企业网络实战案例 五】配置可…

C++系列十三:C++中的引用

C中的引用 1. 引用的声明与初始化2. 引用在函数中的应用3. 引用的注意事项与陷阱 引用在C中是一种特殊的变量,它为其他变量提供了一个别名。这意味着,引用和它所引用的变量实际上是同一个实体。通过引用,可以直接访问和修改变量的值&#xff…

Hubery-个人项目经历记录

研究生期间很有幸的进入到了崔老师的组,从此也就进入到了分析人体生理信号的领域,充满挑战的同时也充满了乐趣。借着CSDN整理一下近几年来参与的项目,这里蕴含着我各种美好的回忆,也作为一个展示自己的平台吧。 开始之前&#xff…

作业--day41

利用模板类完成顺序表 #include <iostream>using namespace std;//模板类 template <typename T> class SeqTab{T arr[20];int maxsize; public:SeqTab():maxsize(0){}void Insert(T a);void Search(T a);void Delete(int index);void Show(); };//尾插 template …

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之线性布局容器Column组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之线性布局容器Column组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、Column组件 沿垂直方向布局的容器。 子组件 可以包含子组件。 接…

完美解决Github 2fa二次验证问题

完美解决Github 2fa二次验证问题 原文阅读 https://onedayxyy.cn/docs/github-2fa 前言 你的 Github 账户可能被封禁! 教你应对 Github 最新的 2FA 二次验证! 无地区限制, 无额外设备的全网最完美方案 1、2FA 的定义 双因素身份验证 (2FA) 是一种身份和访管理安全方法&…