当前位置: 首页 > news >正文

LVGL学习笔记 28 - 键盘keyboard

目录

1. 设置关联文本框

2. 设置模式

2.1 LV_KEYBOARD_MODE_TEXT_LOWER

2.2 LV_KEYBOARD_MODE_TEXT_UPPER

2.3 LV_KEYBOARD_MODE_SPECIAL

2.4 LV_KEYBOARD_MODE_NUMBER

2.5 LV_KEYBOARD_MODE_USER_1 ~ LV_KEYBOARD_MODE_USER_4

3. 使能弹窗模式

4. 更改按键布局

5. 事件


键盘是一个特殊的按键矩阵,自身实现了按键(map)映射和其他功能。

lv_obj_t* kb = lv_keyboard_create(lv_scr_act());
lv_obj_set_align(kb, LV_ALIGN_CENTER);

键盘默认是铺满当前页面的,可以通过lv_obj_set_size设置大小。

1. 设置关联文本框

void lv_keyboard_set_textarea(lv_obj_t * obj, lv_obj_t * ta)

参数ta是文本框的句柄。

lv_obj_set_size(kb, 400, 200);
lv_obj_t* tx = lv_textarea_create(lv_scr_act());
lv_obj_align(tx, LV_ALIGN_CENTER, 0, -160);
lv_keyboard_set_textarea(kb, tx);

2. 设置模式

void lv_keyboard_set_mode(lv_obj_t * obj, lv_keyboard_mode_t mode)

支持的模式有:

2.1 LV_KEYBOARD_MODE_TEXT_LOWER

显示小写字母,默认的情况。

2.2 LV_KEYBOARD_MODE_TEXT_UPPER

显示大写字母,包括键盘和文本框显示。

lv_keyboard_set_mode(kb, LV_KEYBOARD_MODE_TEXT_UPPER);

2.3 LV_KEYBOARD_MODE_SPECIAL

显示特殊字符。

lv_keyboard_set_mode(kb, LV_KEYBOARD_MODE_SPECIAL);

2.4 LV_KEYBOARD_MODE_NUMBER

显示数字。

 lv_keyboard_set_mode(kb, LV_KEYBOARD_MODE_NUMBER);

2.5 LV_KEYBOARD_MODE_USER_1 ~ LV_KEYBOARD_MODE_USER_4

用户自定义模式。这4个用户模式并没有实现,需要自己改lv_keyboard.c,默认是和小写模式一样。以LV_KEYBOARD_MODE_USER_1为例,增加一个游戏手柄的键盘。显示的效果如下:

在static const char * * kb_map[9]前增加数组:

static const char* const default_kb_map_joystick[] = {LV_SYMBOL_SETTINGS, LV_SYMBOL_OK, "\n"," ", LV_SYMBOL_UP, " ", "\n",LV_SYMBOL_LEFT, LV_SYMBOL_RIGHT, "A", "B","\n"," ", LV_SYMBOL_DOWN, " ", ""
};

数组每个变量表示一个按键上的显示字符串,用“\n”表示换行, “”表示结束。把这个数组替换到kb_map数组中 

static const char * * kb_map[9] = {(const char * *)default_kb_map_lc,(const char * *)default_kb_map_uc,(const char * *)default_kb_map_spec,(const char * *)default_kb_map_num,(const char * *)default_kb_map_joystick,(const char * *)default_kb_map_lc,(const char * *)default_kb_map_lc,(const char * *)default_kb_map_lc,(const char * *)NULL,
};

另外再增加一个数组default_kb_ctrl_joystick_map来布局按键的大小。

static const lv_btnmatrix_ctrl_t default_kb_ctrl_joystick_map[] = {1, 1,LV_BTNMATRIX_CTRL_HIDDEN | 1, 2, LV_BTNMATRIX_CTRL_HIDDEN | 5, 1, 1, 1, 1,LV_BTNMATRIX_CTRL_HIDDEN | 1, 2, LV_BTNMATRIX_CTRL_HIDDEN | 5
};

每个数组成员是一个16位的变量,低3位表示按键的宽度比例,例如第一行2个按键,取值1,1表示这2个按键在这一行是占据这一行的比例是50%:50%,其他位表示按键的属性,具体可以参考lv_btnmatrix_ctrl_t的定义。同样,添加到数组kb_ctrl中。

static const lv_btnmatrix_ctrl_t * kb_ctrl[9] = {default_kb_ctrl_lc_map,default_kb_ctrl_uc_map,default_kb_ctrl_spec_map,default_kb_ctrl_num_map,default_kb_ctrl_joystick_map,default_kb_ctrl_lc_map,default_kb_ctrl_lc_map,default_kb_ctrl_lc_map,NULL,
};

这个键盘可以不需要text,所以去掉文本框的设置,显示效果如上图。

    lv_obj_t* kb = lv_keyboard_create(lv_scr_act());lv_obj_set_align(kb, LV_ALIGN_CENTER);lv_obj_set_size(kb, 400, 200);//lv_obj_t* tx = lv_textarea_create(lv_scr_act());//lv_obj_align(tx, LV_ALIGN_CENTER, 0, -160);//lv_keyboard_set_textarea(kb, tx);lv_keyboard_set_mode(kb, LV_KEYBOARD_MODE_USER_1);

3. 使能弹窗模式

void lv_keyboard_set_popovers(lv_obj_t * obj, bool en)

en为TRUE时表示使能弹窗模式,注意这种模式必须按键的属性有LV_BTNMATRIX_CTRL_POPOVER,例如上例中游戏手柄中的设置属性就没有,使能后也不会看到任何效果。

4. 更改按键布局

功能和用户模式类似,通过函数lv_keyboard_set_map改变按键布局。

void lv_keyboard_set_map(lv_obj_t * obj, lv_keyboard_mode_t mode, const char * map[],const lv_btnmatrix_ctrl_t ctrl_map[])

后面2个参数就是之前用户模式对应的数组。

lv_keyboard_set_map(kb, LV_KEYBOARD_MODE_TEXT_LOWER, (const char**)default_kb_map_joystick, default_kb_ctrl_joystick_map);

设置后显示效果与之前的方式一样。

5. 事件

键盘有一个默认的事件lv_keyboard_def_event_cb处理按键行为结果。

当按键的字符串为“abc”时表示切换到小写模式:

if(strcmp(txt, "abc") == 0) {keyboard->mode = LV_KEYBOARD_MODE_TEXT_LOWER;lv_btnmatrix_set_map(obj, kb_map[LV_KEYBOARD_MODE_TEXT_LOWER]);lv_keyboard_update_ctrl_map(obj);return;
}

同理,“ABC”表示切换到大写模式,“1#”表示切换到特殊字符模式。

默认事件发送了LV_EVENT_CANCEL、LV_EVENT_READY事件,用户可以利用这2个事件完成字符串的输入。例如LV_EVENT_CANCEL事件:

static void kbClear_cb(lv_event_t* event)
{lv_keyboard_t* kb = (lv_keyboard_t*)event->target;lv_textarea_set_text(kb->ta, "");
}lv_obj_add_event_cb(kb, kbClear_cb, LV_EVENT_CANCEL, NULL);

相关文章:

LVGL学习笔记 28 - 键盘keyboard

目录 1. 设置关联文本框 2. 设置模式 2.1 LV_KEYBOARD_MODE_TEXT_LOWER 2.2 LV_KEYBOARD_MODE_TEXT_UPPER 2.3 LV_KEYBOARD_MODE_SPECIAL 2.4 LV_KEYBOARD_MODE_NUMBER 2.5 LV_KEYBOARD_MODE_USER_1 ~ LV_KEYBOARD_MODE_USER_4 3. 使能弹窗模式 4. 更改按键布局 5. 事…...

【Microsoft 支持】【数据库-MySql】当您尝试从大于 5000 的 TCP 端口连接时收到错误 WSAENOBUFS (10055)

​ 一、转载原文 When you try to connect from TCP ports greater than 5000 you receive the error ‘WSAENOBUFS (10055)’ Symptoms If you try to set up TCP connections from ports that are greater than 5000, the local computer responds with the following WSAE…...

【学会动态规划】最长湍流子数组(23)

目录 动态规划怎么学? 1. 题目解析 2. 算法原理 1. 状态表示 2. 状态转移方程 3. 初始化 4. 填表顺序 5. 返回值 3. 代码编写 写在最后: 动态规划怎么学? 学习一个算法没有捷径,更何况是学习动态规划, 跟我…...

【网络编程·网络层】IP协议

目录 一、IP协议的概念 二、IP协议的报头 1、四位首部长度 2、16位总长度(解包) 3、8位协议(分用) 4、16位首部校验和 5、8位生存时间 6、32位源IP和32位目的IP 7、4位版本/8位服务类型 8、16位标识 9、3位标志 10、1…...

HTML详解连载(7)

HTML详解连载(7) 专栏链接 [link](http://t.csdn.cn/xF0H3)下面进行专栏介绍 开始喽结构伪类选择器作用 :nth-child(公式)作用举例 伪元素选择器作用注意: PxCoook作用盒子模型-重要组成部分 盒子模型-边框线属性名属性…...

一文打通redis中的String类型

目录 基本介绍 基本语法 常用命令解读 概述 SETNX key value SETNX key value GETRANGE key start end GETSET key value GETBIT key offset MGET key1 [key2..] STRLEN key 基本介绍 ①String是Redis最基本的类型,一个key对应一个value。 ②String类型是二进制…...

优测云服务平台|【压力测试功能升级】轻松完成压测任务

一、本次升级主要功能如下: 1.多份报告对比查看测试结果 2.报告新增多种下载格式 Word格式Excel格式 3.新增多种编排复杂场景的控制器 漏斗控制器并行控制器事务控制器仅一次控制器分组控制器集合点 4.新增概览页面,包含多种统计维度 二、报告对比…...

UseEffect中使用setState更新后获取的值为何依然是更新前

刚开始学习React的新手经常遇到这样的问题,使用useState去更新某个数据,然后再取更新后的数据,取发现数据并没有更新。 在 React 中,useState 的更新确实是异步的,这是由 React 的内部机制所决定的。React 会对多次状…...

去掉鼠标系列之一: 语雀快捷键使用指南

其实应该是系列之二了,因为前面写了一个关于Interlij IDEA的快捷键了。 为什么要写这个了,主要是觉得一会儿用鼠标,一会儿键盘,一点儿不酷,我希望可以一直用键盘,抛开鼠标。后面陆续记录一下各个软件的快捷…...

【Linux】Reactor模式

Reactor模式 Reactor模式的定义 Reactor反应器模式,也叫做分发者模式或通知者模式,是一种将就绪事件派发给对应服务处理程序的事件设计模式。 Reactor模式的角色构成 Reactor主要由以下五个角色构成: reactor模式的角色 角色解释Handle(句…...

【LeetCode 算法】Merge Two Binary Trees 合并二叉树

文章目录 Merge Two Binary Trees 合并二叉树问题描述:分析代码PreOrder DFSPreOrder Tag Merge Two Binary Trees 合并二叉树 问题描述: 给你两棵二叉树: root1 和 root2 。 想象一下,当你将其中一棵覆盖到另一棵之上时&#…...

系统架构设计师---2017年下午试题1分析与解答(试题五)

2017年下午试题1分析与解答 试题五 阅读以下关于Web系统架构设计的叙述,在答题纸上回答问题1至问题3. 【说明】 某电子商务企业因发展良好,客户量逐步增大,企业业务不断扩充,导致其原有的B2C商品交易平台己不能满足现有业务需求。因此,该企业委托某软件公司重新开发一套…...

el-table实现静态和动态合并单元格 以及内容显示的问题

实现效果图 <el-tablev-loading"loading":data"tableData"style"width: 100%":row-class-name"tableRowClassName"size"small"><el-table-column fixed label"序号" width"50"><el-tab…...

STM32F40X系列FSMC8路驱动LCD显示屏(LY-TFT30-39P-1509 芯片hx8352)

hx8352_8080_8bit_FMSC板级驱动 1.LCD相关1.1LCD参数1.2 LCD引脚1.3 LCD实物1.4 LCD引脚解释 2.接线关系3.STM32F40x基于FMSC16bit修改1)地址偏移2)删除多余GPIO3)修改FMSC的配置4&#xff09;LCD初始化寄存器 3.板驱动程序4.运行结果 1.LCD相关 1.1LCD参数 LCD控制芯片&…...

小象课堂在线授课教育系统

此项目包含后端全部代码&#xff0c;前端包括后台和web界面的源码&#xff0c;数据库用的mysql,可当作课设或者毕设&#xff0c;还可写入自己的简历中 web界面展示&#xff1a; 前端后台界面展示&#xff1a; 用户管理 课程管理 内容配置 订单管理 系统管理 系统监控...

Android 电池容量获取

Android 原生设置电池容量是在 power_profile.xml 中配置&#xff0c;此文件默认在 frameworks 目录下&#xff0c;也可能有 overlay 目录文件。 <!-- This is the battery capacity in mAh (measured at nominal voltage) --><item name"battery.capacity"…...

无涯教程-Perl - tell函数

描述 此函数返回指定FILEHANDLE中读取指针的当前位置(以字节为单位)。如果省略FILEHANDLE,则它将返回上次访问的文件中的位置。 语法 以下是此函数的简单语法- tell FILEHANDLEtell返回值 此函数以字节为单位返回当前文件位置。 例 以下是显示其基本用法的示例代码,要检…...

【论文综述】Transformer 综述

中国科学院、东南大学等联合发表最新的视觉 Transformer 综述_中科院AI算法工程师的博客-CSDN博客 Transformer综述大全&#xff08;1&#xff09;【A Survey of Visual Transformers】_香博士的博客-CSDN博客 Transformer综述大全&#xff08;2&#xff09;【A Survey of Vi…...

博客摘录「 佛祖保佑,永无bug——springboot启动图案的修改方法」2023年6月8日

挺有意思的。佛祖保佑永无BUG 神兽护体 代码注释(各种版本)_风流 少年的博客-CSDN博客...

【JavaEE进阶】SpringBoot 日志

文章目录 一. 日志有什么用?二. 自定义日志打印1. 日志的使用与打印 三. 日志级别1. 日志级别有什么用?2. 日志级别的分类及使用 四. 日志持久化五. 更简单的日志输出---Lombok1. Lombok的使用2. lombok原理解释2.1 Lombok更多注解说明 一. 日志有什么用? 在Java中&#xf…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中&#xff0c;iftop是网络管理的得力助手&#xff0c;能实时监控网络流量、连接情况等&#xff0c;帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

Linux 中如何提取压缩文件 ?

Linux 是一种流行的开源操作系统&#xff0c;它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间&#xff0c;使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的&#xff0c;要在 …...

Razor编程中@Html的方法使用大全

文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...

macOS 终端智能代理检测

&#x1f9e0; 终端智能代理检测&#xff1a;自动判断是否需要设置代理访问 GitHub 在开发中&#xff0c;使用 GitHub 是非常常见的需求。但有时候我们会发现某些命令失败、插件无法更新&#xff0c;例如&#xff1a; fatal: unable to access https://github.com/ohmyzsh/oh…...

MySQL体系架构解析(三):MySQL目录与启动配置全解析

MySQL中的目录和文件 bin目录 在 MySQL 的安装目录下有一个特别重要的 bin 目录&#xff0c;这个目录下存放着许多可执行文件。与其他系统的可执行文件类似&#xff0c;这些可执行文件都是与服务器和客户端程序相关的。 启动MySQL服务器程序 在 UNIX 系统中&#xff0c;用…...