LVGL4种输入设备详解(触摸、键盘、实体按键、编码器)

lvgl有触摸、键盘、实体按键、编码器四种输入设备

先来分析一下这四种输入设备有什么区别

(1)LV_INDEV_TYPE_POINTER

主要用于触摸屏

用到哪个输入设备保留哪个其他的也是,保留触摸屏输入的任务注册,其它几种种输入任务的注册,注释掉

添加自己触摸函数

(2)LV_INDEV_TYPE_KEYPAD

要使用键盘或者编码器必须将创建个组,具体参考编码器

  • 必须创建一个对象组:并且必须使用lv_group_t * g = lv_group_create()

  • 将对象添加到组中lv_group_add_obj(g, obj)

  • 创建的组必须分配给输入设备:lv_indev_set_group(my_indev, g)

它的输入处理函数keypad_read中,就根据输入的不同按键(LV_KEY_UP,LV_KEY_DOWN,LV_KEY_LEFT,LV_KEY_RIGHT,LV_KEY_ENTER等)对Keypad所绑定的group内的组件进行操作,如焦点的切换、进度条的滑动。比如说对于一个Table来说,里面的数据很多,有一个滑动条,这个滑动条就受LV_KEY_UP和LV_KEY_DOWN键控制;而对于一个Tabview来说,Tab的切换则是受LV_KEY_LEFT和LV_KEY_RIGHT键控制。而Group中的组件之间的焦点切换则是通过LV_KEY_PREV和LV_KEY_NEXT键切换。

(3)LV_INDEV_TYPE_BUTTON

就是一个实体按键,适用于GUI中焦点永远在某一个组件上的情况。按下物理按键就代表GUI中的按键按下。

修改成按钮实际坐标

添加按键按下函数

(4)LV_INDEV_TYPE_ENCODER

使用编码器,您可以执行以下操作:

  1. 按下它的按钮

  2. 长按其按钮

  3. 左转

  4. 右转

简而言之,Encoder 输入设备的工作原理如下:

  • 通过转动编码器,您可以专注于下一个/上一个对象。

  • 当您在简单对象(如按钮)上按下编码器时,它将被单击。

  • 如果您在复杂对象(如列表、消息框等)上按下编码器,该对象将进入编辑模式,您可以通过转动编码器在对象内导航。

  • 要退出编辑模式,请长按按钮。

组的创建

从注释可以知道要使用键盘或者编码器必须将创建个组

可以使用自定义组和默认组

自定义组创建过程

  • 必须创建一个对象组:并且必须使用lv_group_t * g = lv_group_create()

  • 将对象添加到组中lv_group_add_obj(g, obj)

  • 创建的组必须分配给输入设备:lv_indev_set_group(my_indev, g)

以滑块为例

红色为聚焦时的状态,这个状态左旋右旋可以修改滑块值和检测按键按下

在lv_port.c中使用编码器

可以在用到的地方创建自定义组,那样可以不用声明组,但要声明输入设备

extern lv_indev_t * indev_encoder;
static lv_obj_t * slider1_label;
static lv_obj_t * slider2_label;
static lv_obj_t * slider3_label;
static lv_obj_t * slider4_label;static void slider_event_cb(lv_event_t * e)
{lv_obj_t * slider = lv_event_get_target(e);int value = lv_slider_get_value(slider);char buf[8];lv_snprintf(buf, sizeof(buf), "%d%%", value);// 根据滑块更新对应的标签if (slider == lv_obj_get_child(lv_scr_act(), 0)) {lv_label_set_text(slider1_label, buf);} else if (slider == lv_obj_get_child(lv_scr_act(), 2)) {lv_label_set_text(slider2_label, buf);} else if (slider == lv_obj_get_child(lv_scr_act(), 4)) {lv_label_set_text(slider3_label, buf);} else if (slider == lv_obj_get_child(lv_scr_act(), 6)) {lv_label_set_text(slider4_label, buf);}
}void lv_example_slider_1(void)
{/* 创建第一个滑块 */lv_obj_t * slider1 = lv_slider_create(lv_scr_act());lv_obj_set_size(slider1, 200, 10);  // 设置滑块的大小lv_obj_align(slider1, LV_ALIGN_TOP_MID, 0, 20);  // 将第一个滑块对齐到顶部中间lv_obj_add_event_cb(slider1, slider_event_cb, LV_EVENT_VALUE_CHANGED, NULL);/* 创建第一个滑块的标签 */slider1_label = lv_label_create(lv_scr_act());lv_label_set_text(slider1_label, "0%");lv_obj_align_to(slider1_label, slider1, LV_ALIGN_OUT_BOTTOM_MID, 0, 10);/* 创建第二个滑块 */lv_obj_t * slider2 = lv_slider_create(lv_scr_act());lv_obj_set_size(slider2, 200, 10);  // 设置滑块的大小lv_obj_align(slider2, LV_ALIGN_TOP_MID, 0, 80);  // 将第二个滑块对齐到第一个滑块下方lv_obj_add_event_cb(slider2, slider_event_cb, LV_EVENT_VALUE_CHANGED, NULL);/* 创建第二个滑块的标签 */slider2_label = lv_label_create(lv_scr_act());lv_label_set_text(slider2_label, "0%");lv_obj_align_to(slider2_label, slider2, LV_ALIGN_OUT_BOTTOM_MID, 0, 10);/* 创建第三个滑块 */lv_obj_t * slider3 = lv_slider_create(lv_scr_act());lv_obj_set_size(slider3, 200, 10);  // 设置滑块的大小lv_obj_align(slider3, LV_ALIGN_TOP_MID, 0, 140);  // 将第三个滑块对齐到第二个滑块下方lv_obj_add_event_cb(slider3, slider_event_cb, LV_EVENT_VALUE_CHANGED, NULL);/* 创建第三个滑块的标签 */slider3_label = lv_label_create(lv_scr_act());lv_label_set_text(slider3_label, "0%");lv_obj_align_to(slider3_label, slider3, LV_ALIGN_OUT_BOTTOM_MID, 0, 10);/* 创建第四个滑块 */lv_obj_t * slider4 = lv_slider_create(lv_scr_act());lv_obj_set_size(slider4, 200, 10);  // 设置滑块的大小lv_obj_align(slider4, LV_ALIGN_TOP_MID, 0, 200);  // 将第四个滑块对齐到第三个滑块下方lv_obj_add_event_cb(slider4, slider_event_cb, LV_EVENT_VALUE_CHANGED, NULL);/* 创建第四个滑块的标签 */slider4_label = lv_label_create(lv_scr_act());lv_label_set_text(slider4_label, "0%");lv_obj_align_to(slider4_label, slider4, LV_ALIGN_OUT_BOTTOM_MID, 0, 10);/* 创建 group */lv_group_t * group = lv_group_create();// 将滑块添加到组中lv_group_add_obj(group, slider1);lv_group_add_obj(group, slider2);lv_group_add_obj(group, slider3);lv_group_add_obj(group, slider4);// 将 group 绑定到输入设备(假设 indev_encoder 已初始化)lv_indev_set_group(indev_encoder, group);
}

使用默认组

对于一些比较复杂的组件使用默认组可以很方便

  • 在lvgl中有些部件,在创建的时候加入到默认组中,但是默认组变量lvgl并没有帮助我们初始化好,我们需要在创建部件之前初始化好才能使用默认组,这个自定义组一样不同的是对于创建时添加:

lv_group_t * g = lv_group_create(); // 创建一个组
lv_group_set_default(g);             // 设置为默认组

之后在需要的地方获取和绑定默认组

/* 获取group */
lv_group_t * group = lv_group_get_default();// 将 group 绑定到输入设备
lv_indev_set_group(indev_encoder, group);

以tabview为例

可以在这里创建默认组

extern lv_indev_t * indev_encoder;
static lv_obj_t * slider1_label;
static lv_obj_t * slider2_label;
static lv_obj_t * slider3_label;
static lv_obj_t * slider4_label;static void slider_event_cb(lv_event_t * e)
{lv_obj_t * slider = lv_event_get_target(e);int value = lv_slider_get_value(slider);char buf[8];lv_snprintf(buf, sizeof(buf), "%d%%", value);// 根据滑块更新对应的标签if (slider == lv_obj_get_child(lv_scr_act(), 0)) {lv_label_set_text(slider1_label, buf);} else if (slider == lv_obj_get_child(lv_scr_act(), 2)) {lv_label_set_text(slider2_label, buf);} else if (slider == lv_obj_get_child(lv_scr_act(), 4)) {lv_label_set_text(slider3_label, buf);} else if (slider == lv_obj_get_child(lv_scr_act(), 6)) {lv_label_set_text(slider4_label, buf);}
}void lv_example_slider_1(void)
{/* 创建第一个滑块 */lv_obj_t * slider1 = lv_slider_create(lv_scr_act());lv_obj_set_size(slider1, 200, 10);  // 设置滑块的大小lv_obj_align(slider1, LV_ALIGN_TOP_MID, 0, 20);  // 将第一个滑块对齐到顶部中间lv_obj_add_event_cb(slider1, slider_event_cb, LV_EVENT_VALUE_CHANGED, NULL);/* 创建第一个滑块的标签 */slider1_label = lv_label_create(lv_scr_act());lv_label_set_text(slider1_label, "0%");lv_obj_align_to(slider1_label, slider1, LV_ALIGN_OUT_BOTTOM_MID, 0, 10);/* 创建第二个滑块 */lv_obj_t * slider2 = lv_slider_create(lv_scr_act());lv_obj_set_size(slider2, 200, 10);  // 设置滑块的大小lv_obj_align(slider2, LV_ALIGN_TOP_MID, 0, 80);  // 将第二个滑块对齐到第一个滑块下方lv_obj_add_event_cb(slider2, slider_event_cb, LV_EVENT_VALUE_CHANGED, NULL);/* 创建第二个滑块的标签 */slider2_label = lv_label_create(lv_scr_act());lv_label_set_text(slider2_label, "0%");lv_obj_align_to(slider2_label, slider2, LV_ALIGN_OUT_BOTTOM_MID, 0, 10);/* 创建第三个滑块 */lv_obj_t * slider3 = lv_slider_create(lv_scr_act());lv_obj_set_size(slider3, 200, 10);  // 设置滑块的大小lv_obj_align(slider3, LV_ALIGN_TOP_MID, 0, 140);  // 将第三个滑块对齐到第二个滑块下方lv_obj_add_event_cb(slider3, slider_event_cb, LV_EVENT_VALUE_CHANGED, NULL);/* 创建第三个滑块的标签 */slider3_label = lv_label_create(lv_scr_act());lv_label_set_text(slider3_label, "0%");lv_obj_align_to(slider3_label, slider3, LV_ALIGN_OUT_BOTTOM_MID, 0, 10);/* 创建第四个滑块 */lv_obj_t * slider4 = lv_slider_create(lv_scr_act());lv_obj_set_size(slider4, 200, 10);  // 设置滑块的大小lv_obj_align(slider4, LV_ALIGN_TOP_MID, 0, 200);  // 将第四个滑块对齐到第三个滑块下方lv_obj_add_event_cb(slider4, slider_event_cb, LV_EVENT_VALUE_CHANGED, NULL);/* 创建第四个滑块的标签 */slider4_label = lv_label_create(lv_scr_act());lv_label_set_text(slider4_label, "0%");lv_obj_align_to(slider4_label, slider4, LV_ALIGN_OUT_BOTTOM_MID, 0, 10);/* 创建 group */lv_group_t * group = lv_group_create();// 将滑块添加到组中lv_group_add_obj(group, slider1);lv_group_add_obj(group, slider2);lv_group_add_obj(group, slider3);lv_group_add_obj(group, slider4);// 将 group 绑定到输入设备(假设 indev_encoder 已初始化)lv_indev_set_group(indev_encoder, group);
}

实现获取编码器增量值和判断编码器是否按下

参考官方文档

实现获取编码器增量值和判断编码器是否按下 

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

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

相关文章

5G技术解析:从核心概念到关键技术

1. 引言 5G技术的迅猛发展正在重塑我们的生活方式和社会结构。它不仅仅是新一代的移动通信技术,更是一场深刻的技术革命。5G网络正在以其惊人的高速、低延迟和大带宽能力,为智能家居、自动驾驶、工业自动化、远程医疗等另一带来前所未有的可能性。 本文…

背包问题1

核心: // f[i][j] 表示只看前i个物品,总体积是j的情况下,总价值是多少 //res maxx(f[n][]0-v] //f[i][j]: //1 不选第i个物品 f[i][j] f[i-1][j] //2 选第i个物品 f[i][j] f[i-1][j-v[i]] w[i]

Redis | 十大数据类型

文章目录 十大数据类型概述key操作命令数据类型命令及落地运用redis字符串(String)redis列表(List)redis哈希表(Hash)redis集合(Set)redis有序集合(ZSet / SortedSet&…

AI-学习路线图-PyTorch-我是土堆

1 需求 PyTorch深度学习快速入门教程(绝对通俗易懂!)【小土堆】_哔哩哔哩_bilibili PyTorch 深度学习快速入门教程 配套资源 链接 视频教程 https://www.bilibili.com/video/BV1hE411t7RN/ 文字教程 https://blog.csdn.net/xiaotudui…

DeepSeek图解10页PDF

以前一直在关注国内外的一些AI工具,包括文本型、图像类的一些AI实践,最近DeepSeek突然爆火,从互联网收集一些资料与大家一起分享学习。 本章节分享的文件为网上流传的DeepSeek图解10页PDF,免费附件链接给出。 1 本地 1 本地部…

C# OpenCvSharp 部署MOWA:多合一图像扭曲模型

目录 说明 效果 项目 代码 下载 参考 C# OpenCvSharp 部署MOWA:多合一图像扭曲模型 说明 算法模型的paper名称是《MOWA: Multiple-in-One Image Warping Model》 ariv链接 https://arxiv.org/pdf/2404.10716 效果 Stitched Image 翻译成中文意思是&…

vite+vue3搭建前端项目并使用 Bulma 框架

vitevue3搭建前端项目并使用 Bulma 框架 bluma css框架参照。 https://bulma.org.cn/documentation/start/overview/ 1. 创建项目 npm init vitelatest ai-imageneration --template vue选择 vue 和 typescript 作为模板: 2. 安装依赖 npm install npm install…

Spring 6.2.2 @scope(“prototype“)原理

Spring Prototype 原理? 前置准备 创建一个MyService类 Scope("prototype") Service("myService") public class MyService {public String getMessage() {return "Hello, World!";} }创建一个main类,用于debug。 pr…

Android车机DIY开发之软件篇(十) NXP MfgTool和UUU的使用

标题Android车机DIY开发之软件篇(十) NXP MfgTool和UUU的使用 一、MfgTool工具 1.基本原理 1、先向DDR下载一个linux系统2. 通过linux完成烧写files里面保存的是最终保存到开发板中的uboot.imx zimage dtb rootfsvbs是在打开mfgtool2和很多参数ucl2.xml表示文件选择 定义自…

RabbitMQ 可靠性投递

文章目录 前言一、RabbitMQ自带机制1、生产者发送消息注意1.1、事务(Transactions)1.2、发布确认(Publisher Confirms)1.2.1、同步1.2.2、异步 2、消息路由机制2.1、使用备份交换机(Alternate Exchanges)2.…

番外02:前端八股文面试题-CSS篇

一:CSS基础 1:CSS选择器及其优先级 2:display的属性值及其作用 属性值作用none元素不显示,并且会从文档流中移除block块类型,默认元素为父元素宽度,可设置宽高,换行显示inline行内元素类型&a…

如何在C++ QT 程序中集成cef3开源浏览器组件去显示网页?

文章目录 1. **准备工作**1.1 下载CEF31.2 配置Qt项目 2. **集成CEF3到Qt窗口**2.1 创建Qt窗口容器2.2 初始化CEF3 3. **处理CEF3消息循环**4. **处理多进程架构**5. **完整代码示例**main.cpp 6. **常见问题**6.1 黑屏问题6.2 窗口嵌入失败6.3 多进程调试 7.**Github源码参考*…

【实用技能】如何借助3D文档控件Aspose.3D, 在Java中无缝制作 3D 球体

概述 创建 3D 球体是 3D 图形设计的一个基本方面。无论您是在开发游戏、模拟还是可视化,无缝创建 3D 球体模型的能力都至关重要。Aspose.3D通过提供强大的 3D 图形 SDK 在各个行业中发挥着重要作用。它允许开发人员轻松创建、操作和转换 3D 模型。此 SDK 对于希望将…

【Leetcode 热题 100】169. 多数元素

问题背景 给定一个大小为 n n n 的数组 n u m s nums nums,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n / 2 ⌋ \lfloor n/2 \rfloor ⌊n/2⌋ 的元素。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 数据约束 n n u…

Docker build时apt update失败

配置好dockerfile后,编译镜像docker build -t my-debian .报错: E: Release file for http://mirrors.org/debian/dists/bookworm-updates/InRelease is not valid yet (invalid for another 3h 15min 21s). Updates for this repository will not be a…

MySql数据库SQL编写规范注意事项

MySQL数据库SQL编写规范对于提高代码可读性、增强代码维护性、优化查询性能、减少错误发生、促进标准化和团队协作以及提升开发效率等方面都具有重要意义。因此,在开发过程中应严格遵守SQL编写规范,以确保代码的质量和效率。 以下是 MySQL 数据库 SQL 编…

Jenkins 使用教程:从入门到精通

在软件开发的复杂流程中,持续集成与持续交付(CI/CD)是提升开发效率和保障软件质量的核心实践。Jenkins 作为一款备受欢迎的开源自动化服务器,在 CI/CD 流程中发挥着举足轻重的作用。本文将深入、详细地介绍 Jenkins 的使用方法&am…

通过k8s请求selfsubjectrulesreviews查询权限

当前是通过kubelet进行查询 curl --cacert /etc/kubernetes/pki/ca.crt \ --cert /var/lib/kubelet/pki/kubelet-client-current.pem \ --key /var/lib/kubelet/pki/kubelet-client-current.pem \ -d - \ -H "Content-Type: application/json" \ -H Accept: applicat…

C语言基础系列【3】VSCode使用

前面我们提到过VSCode有多么的好用,本文主要介绍如何使用VSCode编译运行C语言代码。 安装 首先去官网(https://code.visualstudio.com/)下载安装包,点击Download for Windows 获取安装包后,一路点击Next就可以。 配…

windows安装WSL完整指南

本文首先介绍WSL,然后一步一步安装WSL及Ubuntu系统,最后讲解如何在两个系统之间访问和共享文件信息。通过学习该完整指南,能帮助你快速安装WSL,解决安装和使用过程中的常见问题。 理解WSL(Windows Subsystem for Linux…