【全csdn最前沿LVGL9】按钮的使用(lv_button)、标签的使用(lv_label)

文章目录

  • 前言
  • 一、按钮概述
  • 二、按钮的使用
    • 2.1 创建一个按钮
    • 2.2 按钮的样式
  • 三、标签概述
  • 四、标签的使用
    • 4.1 创建一个标签
    • 4.2 样式
    • 4.3 设置文本
    • 4.4 长文本模式
    • 4.5 文本选择
    • 4.6 文本对齐
    • 4.7 非常长的文本
    • 4.8 字体
      • 设置字体
      • 支持的Unicode字符
      • 字体列表
      • 特殊的字体
  • 总结


前言

欢迎来到本文,我们将一同探索 LVGL(LittlevGL)库中按钮(lv_button)和标签(lv_label)组件的使用。LVGL作为一款嵌入式图形库,提供了现代、可自定义的用户界面解决方案,而按钮和标签是其强大功能中的两个关键组件。

在本文中,我们将深入了解如何使用lv_button创建交互式按钮,以及如何使用lv_label展示文本内容。这两个组件的结合使用可以为嵌入式系统提供直观、美观的用户界面,为用户提供更好的交互体验。


一、按钮概述

首先,我们需要知道的是,按钮也属于lv_obj_t类型,所以我们前面讲的style这些在btn也适用!
与基本对象相比,按钮没有新的功能。它们在语义上很有用,并且具有略有不同的默认设置。

按钮默认与基本对象有以下几点不同:

不能滚动
添加到默认组中
默认高度和宽度设置为 LV_SIZE_CONTENT。

二、按钮的使用

2.1 创建一个按钮

我们可以使用lv_btn_create(parent)函数来创建,他的返回值也是lv_obj_t*类型

示例代码:

lv_obj_t *btn = lv_btn_create(lv_scr_act());
lv_obj_set_pos(btn,lv_pct(50),lv_pct(50));
lv_obj_set_size(btn,lv_pct(25),lv_pct(25));

在这里插入图片描述

2.2 按钮的样式

按钮只有一个部分可以设置其样式:LV_PART_MAIN
他可以设置其他的状态和LV_PART_MAIN来共同搭配他的样式

三、标签概述

标签就是一个显示文字的一个对象

四、标签的使用

4.1 创建一个标签

我们可以使用:lv_label_create(parent)函数来创建,他的返回值也是:lv_obj_t*
示例代码:

lv_obj_t *label = lv_label_create(lv_scr_act());
lv_obj_set_pos(label,lv_pct(50),lv_pct(50));
lv_obj_set_size(label,lv_pct(25),lv_pct(25));

在这里插入图片描述

4.2 样式

他有三部分:
LV_PART_MAIN(主体部分): 该部分使用了所有典型的背景属性和文本属性。填充值可用于在文本和背景之间添加空间。
LV_PART_SCROLLBAR(滚动条部分): 当文本大于部件的尺寸时显示的滚动条。
LV_PART_SELECTED(选定部分): 描述选定文本的样式。只能使用文本颜色和背景颜色样式属性。
示例代码:

lv_obj_t *label = lv_label_create(lv_scr_act());
static lv_style_t style_shadow;
lv_style_init(&style_shadow);
lv_style_set_text_color(&style_shadow, lv_color_hex(0xEF88BE));lv_obj_add_style(label, &style_shadow, 0);lv_obj_set_pos(label,lv_pct(50),lv_pct(50));
lv_obj_set_size(label,lv_pct(25),lv_pct(25));

4.3 设置文本

通过 lv_label_set_text 在运行时设置标签文本: 使用 lv_label_set_text(label, "New text") 函数可以在运行时动态分配缓冲区,并将提供的字符串复制到该缓冲区中。因此,在该函数返回后,您无需保留传递给 lv_label_set_text() 的文本。

使用 lv_label_set_text_fmt 以 printf 格式设置文本: 通过 lv_label_set_text_fmt(label, "Value: %d", 15) 可以使用 printf 格式设置文本。这使得可以使用类似 printf 的格式,动态地将数值等内容嵌入到文本中。

标签能够显示来自静态字符缓冲区的文本: 使用 lv_label_set_text_static(label, "Text") 可以从静态字符缓冲区显示文本。在这种情况下,文本并未存储在动态内存中,而是直接使用给定的缓冲区。这意味着数组不能是在函数退出时会超出范围的本地变量。对于 lv_label_set_text_static(),可以安全使用常量字符串(除非与 LV_LABEL_LONG_DOT 一起使用,因为它会就地修改缓冲区),因为它们存储在ROM存储器中,始终可访问。

示例代码:

lv_obj_t *label = lv_label_create(lv_scr_act());
static lv_style_t style_shadow;
lv_style_init(&style_shadow);
lv_style_set_text_color(&style_shadow, lv_color_hex(0xEF88BE));lv_obj_add_style(label, &style_shadow, 0);lv_obj_set_pos(label,lv_pct(50),lv_pct(50));
lv_obj_set_size(label,lv_pct(25),lv_pct(25));lv_label_set_text(label,"Hello World");

在这里插入图片描述

4.4 长文本模式

默认情况下,标签的宽度和高度设置为LV_SIZE_CONTENT。因此,标签的大小会自动扩展以适应文本的大小。另外,如果显式设置了宽度或高度(使用lv_obj_set_width()或布局),则可以根据多种长模式策略来处理宽度超过标签宽度的行。类似地,如果文本的高度大于标签的高度,也可以应用这些策略。

LV_LABEL_LONG_WRAP: 换行处理过长的行。如果高度为LV_SIZE_CONTENT,则标签的高度将被扩展;否则,文本将被截断(默认情况)。
LV_LABEL_LONG_DOT: 用点(.)替换标签右下角的最后3个字符。
LV_LABEL_LONG_SCROLL: 如果文本宽度大于标签,则水平来回滚动。如果高度大于标签,则垂直滚动。只滚动一个方向,水平滚动具有更高的优先级。
LV_LABEL_LONG_SCROLL_CIRCULAR: 如果文本宽度大于标签,则水平连续滚动。如果高度大于标签,则垂直滚动。只滚动一个方向,水平滚动具有更高的优先级。
LV_LABEL_LONG_CLIP: 简单地裁剪文本超出标签部分。

可以使用lv_label_set_long_mode(label, LV_LABEL_LONG_...)指定长模式。

需要注意的是,LV_LABEL_LONG_DOT以就地方式操作文本缓冲区,以添加/删除点。当使用lv_label_set_text()或lv_label_set_array_text()时,会分配一个单独的缓冲区,因此这个实现细节是不可见的。但是,lv_label_set_text_static()不同,如果您计划使用LV_LABEL_LONG_DOT,则传递给lv_label_set_text_static()的缓冲区必须是可写的。

4.5 文本选择

如果启用了 LV_LABEL_TEXT_SELECTION,文本的一部分可以被选择。这类似于在个人电脑上使用鼠标选择文本的方式。整个机制(点击并拖动手指/鼠标来选择文本)是在文本区域(Text area)中实现的,而标签(Label)小部件只允许使用 lv_label_get_text_selection_start(label, start_char_index)lv_label_get_text_selection_start(label, end_char_index) 进行手动文本选择。

4.6 文本对齐

为了水平对齐标签中的文本行,可以使用 text_align 样式属性,通过 lv_obj_set_style_text_align() lv_style_set_text_align() 进行设置。请注意,它只在以下情况下产生可见效果:

标签小部件的宽度大于文本中最长行的宽度
文本具有多行且行长度不相等
简而言之,文本选择允许用户通过点击和拖动手势选择标签或文本区域中的文本。而文本对齐则通过设置样式属性,确保标签中的文本在水平方向上对齐,前提是标签的宽度足够大且文本包含多行且行长度不同。

他的函数原型为:void lv_obj_set_style_text_align(lv_obj_t *obj, lv_text_align_t value, lv_style_selector_t selector)
参数2为:lv_text_align_t 类型,他的定义如下:

enum _lv_text_align_t {LV_TEXT_ALIGN_AUTO, /**< Align text auto*/LV_TEXT_ALIGN_LEFT, /**< Align text to left*/LV_TEXT_ALIGN_CENTER, /**< Align text to center*/LV_TEXT_ALIGN_RIGHT, /**< Align text to right*/
};

有自动对齐,左对齐、右对齐,中心对齐

在 LittlevGL(LVGL)图形库中,lv_style_selector_t 是一个结构体类型,用于管理样式选择器。样式选择器允许在 LVGL 中根据不同的状态为对象应用不同的样式。

这个结构体通常用于在对象(如按钮、标签等)的不同状态下选择应用的样式。例如,按钮可以有普通状态、按下状态、禁用状态等,而每个状态都可能需要不同的样式。

lv_style_selector_t 结构体的定义通常包含了不同状态下应用的样式指针,例如:

typedef struct {const lv_style_t * normal;      /**< Pointer to the normal style. */const lv_style_t * active;      /**< Pointer to the active (clicked, selected etc.) style. */const lv_style_t * inactive;    /**< Pointer to the inactive (disabled) style. */
} lv_style_selector_t;

lv_style_set_text_align()的函数原型如下
void lv_style_set_text_align(lv_style_t *style, lv_text_align_t value)
参数二直接填lv_obj_set_style_text_align的参数二即可,他的值上面有写

4.7 非常长的文本

LVGL 能够通过保存额外的数据(约12个字节)来提高绘制速度,从而有效地处理非常长的标签(例如,> 40k 个字符)。要启用此功能,请在 lv_conf.h 中设置 LV_LABEL_LONG_TXT_HINT 为 1。

4.8 字体

设置字体

我们可以通过下面这个函数来设置label的字体:

lv_style_set_text_font(&my_style, &lv_font_montserrat_28);  /*Set a larger font*/

字体具有格式属性。该属性描述了字形绘制数据的存储方式,分为两个类别:传统简单格式和高级格式。在传统简单格式中,字体以位图的简单数组形式存储。而在高级格式中,字体以不同的方式存储,比如矢量图、SVG 等。

在传统简单格式中,存储的值用于确定像素的不透明度。这样,通过更高的 bpp(每像素位数),字母的边缘可以更加平滑。可能的 bpp 值为 1、2、4 和 8(较高的值表示更好的质量)。

格式属性还影响存储字体所需的内存量。例如,format = LV_FONT_GLYPH_FORMAT_A4 的字体与 format = LV_FONT_GLYPH_FORMAT_A1 相比,几乎要大四倍。

支持的Unicode字符

LVGL支持UTF-8编码的Unicode字符。你的编辑器需要配置为将代码/文本保存为UTF-8(通常这是默认设置),并确保在lv_conf.h中将LV_TXT_ENC设置为LV_TXT_ENC_UTF8(这是默认值)。

示例代码:

lv_label_set_text(label1, LV_SYMBOL_OK);

字体列表

LV_FONT_MONTSERRAT_12: 12 px font
LV_FONT_MONTSERRAT_14: 14 px font
LV_FONT_MONTSERRAT_16: 16 px font
LV_FONT_MONTSERRAT_18: 18 px font
LV_FONT_MONTSERRAT_20: 20 px font
LV_FONT_MONTSERRAT_22: 22 px font
LV_FONT_MONTSERRAT_24: 24 px font
LV_FONT_MONTSERRAT_26: 26 px font
LV_FONT_MONTSERRAT_28: 28 px font
LV_FONT_MONTSERRAT_30: 30 px font
LV_FONT_MONTSERRAT_32: 32 px font
LV_FONT_MONTSERRAT_34: 34 px font
LV_FONT_MONTSERRAT_36: 36 px font
LV_FONT_MONTSERRAT_38: 38 px font
LV_FONT_MONTSERRAT_40: 40 px font
LV_FONT_MONTSERRAT_42: 42 px font
LV_FONT_MONTSERRAT_44: 44 px font
LV_FONT_MONTSERRAT_46: 46 px font
LV_FONT_MONTSERRAT_48: 48 px font

特殊的字体

LV_FONT_MONTSERRAT_28_COMPRESSED:与普通的 28 像素字体相同,但以 3 bpp 的压缩字体存储。
LV_FONT_DEJAVU_16_PERSIAN_HEBREW:16 像素字体,包含常规范围 + 希伯来文、阿拉伯文、波斯文字母及其所有形式。
LV_FONT_SIMSUN_16_CJK:16 像素字体,包含常规范围以及最常见的 1000 个CJK(中日韩)部首。
LV_FONT_UNSCII_8:8 像素像素完美字体,仅包含ASCII字符。
LV_FONT_UNSCII_16:16 像素像素完美字体,仅包含ASCII字符。

内置字体是全局变量,名称类似于 lv_font_montserrat_16,表示高度为 16 像素的字体。要在样式中使用它们,只需像上面所示添加一个指向字体变量的指针。

具有 bpp = 4 的内置字体包含ASCII字符,并使用Montserrat字体。

除了ASCII范围外,还从FontAwesome字体中添加了以下符号到内置字体中。

在这里插入图片描述
我们可以这样设置上面这些符号字体:

lv_label_set_text(my_label, LV_SYMBOL_OK);

如果你想在符号后面加上文本,则可以这样:

lv_label_set_text(my_label, LV_SYMBOL_OK "Apply");

如果你想添加多个符号,则可以这样:

lv_label_set_text(my_label, LV_SYMBOL_OK LV_SYMBOL_WIFI LV_SYMBOL_PLAY);

总结

本文介绍了在LVGL中使用按钮和标签组件的方法。通过使用lv_button,我们可以轻松创建具有不同交互特性的按钮,而lv_label则提供了展示文本信息的简便方式。这两个组件的灵活组合可以满足各种嵌入式应用的需求,为开发者提供了强大的工具。

通过深入理解按钮和标签的使用,您将能够更好地设计和实现嵌入式系统的用户界面。希望这篇文章对您在LVGL开发中的工作有所启发。感谢您的阅读!

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

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

相关文章

Unity使用反向遮罩实现镂空shader

实现步骤&#xff1a; 1&#xff0c;创建两个材质球&#xff0c;遮罩层的属性如下&#xff1a; 被遮罩层的属性如下&#xff1a; 2&#xff0c;使用两张image&#xff0c;遮罩层在父节点&#xff0c;被遮罩层在子节点&#xff0c;然后分别添加材质球与镂空图片 实现效果如下&a…

k8s存储之PV、PVC

在k8s集群中&#xff0c;资源存储会散落到各个工作节点上&#xff0c;这样对用资源调用很不方便&#xff0c;那么k8s是如何实现存储资源共享的呢&#xff0c;本文浅尝辄止的探讨一下&#xff0c;k8s是通过pv、pvc实现的。 一、PV、PVC的概念 1、持久卷(PV&#xff09; pv是Pe…

2024-01-07-AI 大模型全栈工程师 - AI 产品部署和交付

摘要 2024-01-07 周日 杭州 阴 本节内容: 如何选择 GPU 和云服务器&#xff0c;追求最高性价比如何部署自己的 fine-tune 的模型&#xff0c;向业务提供高可用服务如何控制内容安全&#xff0c;做好算法备案&#xff0c;确保合规 课程内容 1. 硬件选型 a. Nvidia 几乎是模…

IAR编译和调试CMS32L051

0 Preface/Foreword 0.1 参考文档 中微半导体BAT系列单片机学习笔记_V1.1.pdf 1 配置方法 1.1 编译工具链添加 CMS对于IAR工具&#xff0c;有一个插件文件&#xff0c;用于安装对应的CMS系列芯片。 工具名称&#xff1a;iar_plug20210926.7z 按照完成之后&#xff0c;可…

如果我要访问一个网址,那么在网络中会有哪些过程

访问一个网址是我们日常网络使用中非常常见的操作&#xff0c;背后涉及到一系列精密而复杂的步骤。这个过程包括DNS解析、建立TCP连接、发起HTTP请求、服务器处理请求、服务器响应、浏览器渲染等环节。在这篇文章中&#xff0c;我们将深入探讨这些步骤&#xff0c;并解释它们在…

强大的虚拟机Parallels Desktop 19 mac中文激活

Parallels Desktop是一款功能全面、易于使用的虚拟机软件&#xff0c;它为用户提供了在Mac电脑上同时运行多个操作系统的便利。 软件下载&#xff1a;Parallels Desktop 19 mac中文激活版下载 Parallels Desktop 19 mac具有快速启动和关闭虚拟机的能力&#xff0c;让用户能够迅…

基于SpringBoot+Vue学科竞赛管理系统

文章目录 基于SpringBootVue学科竞赛管理系统1系统概述1.3系统设计思想 2相关技术2.1 MYSQL数据库2.2 B/S结构2.3 Spring Boot框架简介2.4 Vue简介 3系统分析3.1可行性分析3.1.1技术可行性3.1.2经济可行性3.1.3操作可行性 3.2系统性能分析3.2.1 系统安全性3.2.2 数据完整性 3.4…

Wampserver 切换中文时无法启动报错处理

在使用 Wampserver 软件时默认为英语&#xff0c;可以看到有语言选择功能&#xff0c;切换其他语言。但选择中文切换后&#xff0c;软件重启时报如下错误&#xff1a; The configuration file contains a systax error on line 44:[EParseError] Mismatched or misplaced quoue…

(十六)串口UART

文章目录 UART简介传输数据帧和波特率定时器1作为串口1波特率发生器串口部分相关寄存器TMODAUXRPCONSCONSBUF 串口1工作模式1&#xff1a;8位UART&#xff0c;波特率可变总体工作原理如何简单接收一个字符和发送数据一步之遥的设置现象演示 UART简介 通用异步收发传输器(Unive…

一种轻量分表方案-MyBatis拦截器分表实践|京东零售技术实践

背景 部门内有一些亿级别核心业务表增速非常快&#xff0c;增量日均100W&#xff0c;但线上业务只依赖近一周的数据。随着数据量的迅速增长&#xff0c;慢SQL频发&#xff0c;数据库性能下降&#xff0c;系统稳定性受到严重影响。本篇文章&#xff0c;将分享如何使用MyBatis拦…

微软Azure-OpenAI 测试调用及说明

本文是公司在调研如何集成Azure-openAI时&#xff0c;调试测试用例得出的原文&#xff0c;原文主要基于官方说明文档简要整理实现 本文已假定阅读者申请部署了模型&#xff0c;已获取到所需的密钥和终结点 变量名称值ENDPOINT从 Azure 门户检查资源时&#xff0c;可在“密钥和…

Advanced CNN

文章目录 回顾Google NetInception1*1卷积Inception模块的实现网络构建完整代码 ResNet残差模块 Resedual Block残差网络的简单应用残差实现的代码 练习 回顾 这是一个简单的线性的卷积神经网络 然而有很多更为复杂的卷积神经网络。 Google Net Google Net 也叫Inception V…

5、应急响应-拒绝服务钓鱼识别DDOS压力测试邮件反制分析应用日志

目录 前言&#xff1a; 1、#内网应急-日志分析-爆破&横向&数据库 2、#红队APT-钓鱼邮件识别-内容&发信人&附件 3、#拒绝服务攻击-DDOS&CC-代理&防火墙防御 用途&#xff1a;个人学习笔记&#xff0c;欢迎指正&#xff01; 前言&#xff1a; 了解和…

OkHttp完全解读

一&#xff0c;概述 OkHttp作为android非常流行的网络框架&#xff0c;笔者认为有必要剖析此框架实现原理&#xff0c;抽取并理解此框架优秀的设计模式。OkHttp有几个重要的作用&#xff0c;如桥接、缓存、连接复用等&#xff0c;本文笔者将从使用出发&#xff0c;解读源码&am…

深度视频恢复软件推荐,轻松恢复视频文件!

“我在电脑上保存了一些视频&#xff0c;但在清理时却不小心将这些视频删除了&#xff0c;有什么方法可以恢复删除的视频吗&#xff1f;希望大家给我推荐一些好用的方法。” 随着科技的飞速发展&#xff0c;数字媒体已经成为了我们生活中不可或缺的一部分。然而&#xff0c;数字…

国图公考:考公和考编一样吗?

公务员&#xff1a;是指在各级机关中&#xff0c;符合规定&#xff0c;行使职权&#xff0c;执行公务的人员 事业单位&#xff1a;事业单位是指由国家或社会组织举办&#xff0c;从事教育、科学、文化、卫生、体育等社会公益事业的单位。 公务员和事业编都是有编制的&#xf…

dataframe 列按指定字符截取

创建一个示例 import pandas as pd data {Column1: [1~2, 21~3, 3~41, 411~5], } test_df pd.DataFrame(data) print(test_df) 截取 ’~ ‘前、后的值 test_df[Column1_left] test_df[Column1].apply(lambda x: x.split(~)[0] if pd.notnull(x) else np.nan) test_df[…

某赛通电子文档安全管理系统 PolicyAjax SQL注入漏洞复现

0x01 产品简介 某赛通电子文档安全管理系统(简称:CDG)是一款电子文档安全加密软件,该系统利用驱动层透明加密技术,通过对电子文档的加密保护,防止内部员工泄密和外部人员非法窃取企业核心重要数据资产,对电子文档进行全生命周期防护,系统具有透明加密、主动加密、智能…

推荐系统|排序_MMOE

MMOE MMOE是指Multi-gate Mixture-of-Experts 注意看Expert后面加了s&#xff0c;说明了有多个专家。 而在MMOE中专家是指用来对输入特征计算的神经网络&#xff0c;每个神经网络根据输入计算出来的向量都会有所不同。 MMOE的低层 MMOE的上一层 通过MMOE的低层算出的向量和权…

Markdown 图片尺寸对齐等详细使用

✍️作者简介&#xff1a;小北编程&#xff08;专注于HarmonyOS、Android、Java、Web、TCP/IP等技术方向&#xff09; &#x1f433;博客主页&#xff1a; 开源中国、稀土掘金、51cto博客、博客园、知乎、简书、慕课网、CSDN &#x1f514;如果文章对您些帮助请&#x1f449;关…