【全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开发中的工作有所启发。感谢您的阅读!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CXO清单:低代码平台必备的16个基本功能:从需求到实现的全面指南

对于 CIO、CTO 和 CDO&#xff08;在此统称为 CXO&#xff09;来说&#xff0c;认识到快速变化的技术和竞争格局以及他们在组织中的角色变化至关重要。处理持续不断的软件开发请求、考虑不断变化的业务流程、提高客户和法规的透明度、提高企业数据安全性以及在短时间内扩展基础…

2024斋月大促跨境卖家准备指南

市场覆盖西欧、中东、东南亚、北非地区的跨境电商卖家注意了&#xff0c;2024年的斋月即将开启&#xff0c;较往年日期&#xff0c;今年提前了10天左右&#xff0c;斋月的第一天预测在3月11日星期一到来。 根据Google搜索数据可知&#xff0c;目前已经进入高频“斋月”搜索期&…

与数组相关经典面试题

&#x1d649;&#x1d65e;&#x1d658;&#x1d65a;!!&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦ &#x1f44f;&#x1f3fb;‧✧̣̥̇:Solitary-walk ⸝⋆ ━━━┓ - 个性标签 - &#xff1a;来于“云”的“羽球人”。…

嵌入式学习第十六天

制作俄罗斯方块小游戏&#xff08;一&#xff09; 分析&#xff1a; printf函数高级用法 \033[&#xff1a;表示转义序列的开始 m&#xff1a;表示转义序列的结束 0&#xff1a;重置所有属性 1&#xff1a;设置粗体或高亮 30-37&#xff1a;设置字体色 30: 黑 31: 红 32:…

江科大stm32学习笔记10——对射式红外传感器

一、接线 上电之后可以看到对射式红外传感器亮两个灯&#xff0c;如果此时用挡光片挡住两个黑色方块中间的部分&#xff0c;则只亮一个灯。 二、代码 将4-1的工程文件夹复制粘贴一份&#xff0c;重命名为“5-1 对射式红外传感器计次”&#xff0c;打开keil&#xff0c;右键添…

C++/数据结构:二叉搜索树的实现与应用

目录 一、二叉搜索树简介 二、二叉搜索树的结构与实现 2.1二叉树的查找与插入 2.2二叉树的删除 2.3二叉搜索树的实现 2.3.1非递归实现 2.3.2递归实现 三、二叉搜索树的k模型和kv模型 一、二叉搜索树简介 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0…

LeetCode刷题记录:(5)前K个高频元素

LeetCode传送通道 很好的一道题&#xff01; 核心知识点&#xff1a; …①map频率统计&#xff1b; …②优先级队列(不用的话见解法二) //解法一 class Solution {public int[] topKFrequent(int[] nums, int k) {int[] result new int[k];//1.次数统计mapMap<Integer,Inte…

ElementUI Form:Input 输入框

ElementUI安装与使用指南 Input 输入框 点击下载learnelementuispringboot项目源码 效果图 el-input.vue &#xff08;Input 输入框&#xff09;页面效果图 项目里el-input.vue代码 <script> export default {name: el_input,data() {return {input: ,input1: ,i…

Mac内存清理的方法,Mac老用户都用这几种方法清理Mac内存

Mac磁盘空间又爆满了&#xff1f;系统运行又卡了&#xff1f;你的Mac需要清理内存啦&#xff01;如果你正在为“您的磁盘内存不足”的提示所困扰&#xff0c;或者你的Mac电脑突然运行缓慢和迟缓&#xff0c;那么你可能需要了解以下几种Mac释放内存的方法。 一、清理缓存 在配…

正点原子--STM32中断系统学习笔记

1、什么是中断&#xff1f; 原子哥给出的概念是这样的&#xff1a;打断CPU正常执行的程序&#xff0c;转而处理紧急程序&#xff0c;然后返回原暂停的程序继续运行&#xff0c;就叫中断。 当发生中断时&#xff0c;当前执行的程序会被暂时中止&#xff0c;进而进入中断处理函…

YIA主题如何关闭新版本升级提示?WordPress主题怎么取消升级提醒?

前两天YIA主题发布了升级到2.8版本&#xff0c;新增了一些功能&#xff0c;优化调整修复了一些功能&#xff0c;但是这些功能调整幅度不大&#xff0c;加上boke112百科使用的YIA主题已经进行了很多方面的个性化修改&#xff0c;所以就懒得升级了&#xff0c;但是每次进入WordPr…

C++基础语法学习笔记

C Tutorial 1.基础语法 C 应用&#xff1a;操作系统、图形用户界面和嵌入式系统 C和C区别&#xff1a;C支持类和对象 C语法 #include <iostream> using namespace std;int main(){cout << "hello world!";return 0; }int main () { cout << &q…

Flutter canvas 画一条会动的波浪线 进度条

之前用 Flutter Canvas 画过一个三角三角形&#xff0c;html 的 Canvas 也画过一次类似的&#xff0c; 今天用 Flutter Canvas 试了下 感觉差不多&#xff1a; html 版本 大致效果如下&#xff1a; 思路和 html 实现的类似&#xff1a; 也就是找出点的位置&#xff0c;使用二阶…

Linux部署DataEase数据分析工具并结合内网穿透实现任意设备远程查看数据

文章目录 前言1. 安装DataEase2. 本地访问测试3. 安装 cpolar内网穿透软件4. 配置DataEase公网访问地址5. 公网远程访问Data Ease6. 固定Data Ease公网地址 前言 DataEase 是开源的数据可视化分析工具&#xff0c;帮助用户快速分析数据并洞察业务趋势&#xff0c;从而实现业务…

Docker安装MongoDB并做副本集群

mongodb cluster 1. 创建外挂目录并授权 mkdir -p /home/mongo1/db /home/mongo1/log mkdir -p /home/mongo2/db /home/mongo2/log mkdir -p /home/mongo3/db /home/mongo3/log chmod 755 2. 拉取最新mongodb docker pull mongo3. 创建副本集结点 docker run -itd --namemong…

代码随想录算法刷题训练营day21

代码随想录算法刷题训练营day21&#xff1a;LeetCode(501)二叉搜索树中的众数、LeetCode(530)二叉搜索树的最小绝对差 LeetCode(501)二叉搜索树中的众数 题目 代码 import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map;/*…

一些大语言模型(LLM)相关的开源项目

一些大语言模型&#xff08;LLM&#xff09;相关的开源项目 更多文章访问: https://www.cyisme.top 因为站内限制问题&#xff0c;有些图片无法显示&#xff0c;导致阅读体验较差&#xff0c;可以访问原文&#xff1a;《一些大语言模型&#xff08;LLM&#xff09;相关的开源项…

Linux逻辑卷(LV)扩容

Linux逻辑卷&#xff08;LV&#xff09;扩容 1、准备物理磁盘&#xff08;分区和不分区都行&#xff09;&#xff0c;可以使用lsblk命令查看新增的磁盘&#xff0c;如下图sde就是我们新增磁盘&#xff0c;容量为600G。 2、将新磁盘变成物理卷&#xff08;PV&#xff09; pvcr…

疾控中心污水采样器的招标参数有哪些

技术指标 1 采样程序&#xff1a;可以预先编制 10 种采样程序&#xff0c;一键式启动&#xff1b; 2 采样方式&#xff1a;平行采样、 定时定量采样、定流定量采样、 定时比例采样、液位比例采样、即时定量采样等&#xff1b; 3 采样记录&#xff1a;可保存 10000 条采样记录…

dockerpipwork相关测试过程

pipework可以减轻docker实施过程中的工作量&#xff0c;在网上也找了几篇类似的文章&#xff0c;按照相应配置&#xff0c;结果并不相同 如下测试过程记录下&#xff1a; docker run -it --rm --name c1 busybox docker run -it --rm --name c2 busyboxpipework br1 c1 192…