LVGL- 按钮矩阵控件

1 按钮矩阵控件

lv_btnmatrix 是 LVGL(Light and Versatile Graphics Library) v8 中提供的一个非常实用的控件,用于创建带有多个按钮的矩阵布局。它常用于实现虚拟键盘、数字键盘、操作面板、选择菜单等场景,特别适用于嵌入式设备、触摸屏等界面。

1.1 功能与特点

lv_btnmatrix 控件的主要功能是展示多个按钮,并提供灵活的布局与交互方式。它的特点包括:

动态布局:按钮布局可以根据需求进行调整,可以显示任意大小和排列方式的按钮。

支持事件回调:按钮矩阵支持绑定事件回调,用户可以在按钮被点击时执行特定的操作。

支持按钮样式设置:每个按钮的样式可以通过 LVGL 的样式机制进行灵活定制,例如字体、颜色、边框、背景等。

1.2 基本结构与工作原理

lv_btnmatrix 是由一组按钮构成的矩阵,其中每个按钮都可以被单独配置和控制。按钮矩阵在实际应用中表现为一组具有相同样式和布局的按钮,可以通过行和列来定义按钮的位置。

1.3 应用场景

虚拟键盘:创建数字键盘、字符键盘等输入设备。

控制面板:用于展示一组操作按钮,如家电控制面板。

选择菜单:实现多选项的选择界面。

2 使用 lv_btnmatrix 的基本步骤:

  1. 创建按钮矩阵对象: 使用 lv_btnmatrix_create 函数来创建按钮矩阵控件。

  2. 设置按钮文本:使用 lv_btnmatrix_set_map 函数来设置按钮的文本布局,可以通过这个函数定义每个按钮的标签。

  3. 设置按钮行为:你可以通过事件回调函数来处理按钮的点击事件。

2.1 创建按钮矩阵

创建一个按钮矩阵对象通常使用 lv_btnmatrix_create() 函数。该函数需要指定父对象,一般情况下,父对象是屏幕对象(lv_scr_act()),表示该控件将在当前显示的屏幕上显示。

    lv_obj_t* btnm = lv_btnmatrix_create(lv_scr_act());

在这里插入图片描述

2.2 设置按钮文本和布局

按钮矩阵最核心的功能之一是设置按钮的文本。按钮的文本布局是通过 lv_btnmatrix_set_map() 函数进行设置的。这个函数使用一个字符串映射(类似于字符数组)来定义按钮的文本,并且支持多行布局。

2.2.1 设置

void lv_btnmatrix_set_map(lv_obj_t * btnm, const char ** map);

btnm:按钮矩阵对象,通常是通过 lv_btnmatrix_create() 创建的按钮矩阵对象。

map:一个指向字符指针数组的指针,每个字符指针数组元素表示按钮矩阵中的一行按钮文本。每个数组元素中的文本可以通过空格分隔按钮。

2.2.2 案例

    static const char* map[] ={"1", "2", "3", "4", "5", "\n","6", "7", "8", "9", "0", "\n","ok", "cancel", ""};lv_btnmatrix_set_map(btnm, map);

在这里插入图片描述

2.3 设置颜色和位置

static lv_style_t style;
lv_style_init(&style);
lv_style_set_bg_color(&style, lv_color_hex(0x003366));      // 背景色:深蓝色
lv_style_set_border_color(&style, lv_color_hex(0xffffff));   // 边框颜色:白色
lv_style_set_text_color(&style, lv_color_hex(0xffffff));     // 文字颜色:白色lv_obj_add_style(btnm, &style, 0);  // 将样式应用到按钮矩阵lv_obj_set_size(btnm, 300, 150);                  // 设置控件尺寸
lv_obj_align(btnm, LV_ALIGN_CENTER, 0, 0);  // 将按钮矩阵居中显示

在这里插入图片描述

2.4 事件处理

按钮矩阵支持事件处理,通常用于响应用户点击某个按钮时的操作。可以为按钮矩阵添加事件回调函数,例如,当按钮状态变化时触发的 LV_EVENT_VALUE_CHANGED 事件。

static void btnm_event_handler(lv_event_t* e)
{lv_obj_t* btn = lv_event_get_target(e);  // 获取被点击的按钮对象uint32_t id = lv_btnmatrix_get_selected_btn(btn);const char* text = lv_btnmatrix_get_btn_text(btn, id);  // 获取按钮的文本LV_LOG("按钮 %s 被点击\n", text);
}lv_obj_add_event_cb(btnm, btnm_event_handler, LV_EVENT_VALUE_CHANGED, NULL);

在这里插入图片描述

2.5 选中或者可选

void lv_btnmatrix_set_btn_ctrl(lv_obj_t *btnm, uint16_t btn_id, lv_btnmatrix_ctrl_t ctrl);

在这里插入图片描述

lv_btnmatrix_set_btn_ctrl(btnm, 10, LV_BTNMATRIX_CTRL_CHECKABLE);  //  ok 可以选中
lv_btnmatrix_set_btn_ctrl(btnm, 11, LV_BTNMATRIX_CTRL_CHECKED);   // cancel 选中

在这里插入图片描述

检查哪个按键是否被按下

if (lv_btnmatrix_has_btn_ctrl(btn, 10, LV_BTNMATRIX_CTRL_CHECKED)) {LV_LOG("按钮 %s 被点击\n", "OK");
}

2.6 修改内部按键的风格

static lv_style_t style_btn;
lv_style_init(&style_btn);
lv_style_set_radius(&style_btn,10);
lv_style_set_border_width(&style_btn, 1);
lv_style_set_border_opa(&style_btn, LV_OPA_COVER);
lv_style_set_border_color(&style_btn, lv_palette_main(LV_PALETTE_RED));
lv_style_set_border_side(&style_btn, LV_BORDER_SIDE_INTERNAL);
lv_style_set_bg_color(&style_btn, lv_palette_main(LV_PALETTE_RED));
lv_style_set_text_color(&style_btn, lv_palette_main(LV_PALETTE_YELLOW));
lv_obj_add_style(btnm, &style_btn, LV_PART_ITEMS);

在这里插入图片描述

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

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

相关文章

excel 批量导出图片并指定命名

一、开发环境 打开excel文件中的宏编辑器和JS代码调试 工具-》开发工具-》WPS宏编辑器 左边是工程区,当打开多个excel时会有多个,要注意不要把代码写到其他工作簿去了 右边是代码区 二、编写代码 宏是js语言,因此变量或者方法可以网上搜…

yolov5基础--yolov5源码阅读(common.py)

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 博主简介:努力学习的22级本科生一枚 🌟​;探索AI算法,C,go语言的世界;在迷茫中寻找光芒…

5.0.5 变换(旋转、缩放、扭曲)

WPF变换可以产生特殊效果,如平移、旋转、扭曲。 变换类 描述TranslateTransform沿着X轴和Y轴平移ScaleTransform 沿着定义的中心点缩放RotateTransform沿着定义的中心点旋转SkewTransform 扭曲元素MatrixTransfrom提供3x3矩阵,用于定义一个自定义变换 1…

如何设置内网映射端口到外网访问?哪些软件可以进行端口映射?

大多数时候我们所使用的服务器都是在内网搭建的,而且内网是可以访问外网的,但外网是没法直接访问内网IP和端口服务的。也就是说外网无法直接访问到内网的网络地址,需要大家去搭建一个内外网互通的桥梁,把内网服务器指定端口映射到…

养生:塑造健康生活的良方

养生是一场贯穿生活的自我关爱行动,从饮食、运动、睡眠到心态调节,每一个环节都对健康有着深远影响。以下为你带来全面且实用的养生策略。 饮食养生:科学搭配,呵护肠胃 合理规划三餐,遵循 “早营养、午均衡、晚清淡”…

YOLOv12云端GPU谷歌免费版训练模型

1.效果 2.打开 https://colab.research.google.com/?utm_sourcescs-index 3.上传代码 4.解压 !unzip /content/yolov12-main.zip -d /content/yolov12-main 5.进入yolov12-main目录 %cd /content/yolov12-main/yolov12-main 6.安装依赖库 !pip install -r requirements.…

机器人手臂的坐标变换:一步步计算齐次矩阵过程 [特殊字符]

大家好!今天我们来学习如何计算机器人手臂的坐标变换。别担心,我会用最简单的方式解释这个过程,就像搭积木一样简单! 一、理解问题 我们有一个机器人手臂,由多个关节组成。每个关节都有自己的坐标系,我们需要计算从世界坐标系(W)到末端执行器(P₃)的完整变换。 二、已…

CSS中的@import指令

一、什么是import指令&#xff1f; import 是CSS提供的一种引入外部样式表的方式&#xff0c;允许开发者在CSS文件中引入其他CSS文件&#xff0c;或者在HTML的<style>标签中引入外部样式。与常见的<link>标签相比&#xff0c;import 提供了一种更“CSS原生”的样式…

[学成在线]23-面试题总结

1. 详细说说你的项目吧 从以下几个方面进行项目介绍: 项目的背景&#xff0c;包括: 是自研还是外包、什么业务、服务的客户群是谁、谁去运营等问题。项目的业务流程项目的功能模块项目的技术架构个人工作职责个人负责模块的详细说明&#xff0c;包括模块的设计&#xff0c;所…

C++编程语言:标准库:标准库概观(Bjarne Stroustrup)

第30章 标准库概观(Standard-Library Overview) 目录 30.1 引言 30.1.1 标准库设施 30.1.2 设计约束 30.1.3 描述风格 30.2 头文件 30.3 语言支持 30.3.1 对initializer_list的支持 30.3.2 对范围for的支持 30.4 异常处理 30.4.1 异常 30.4.1…

spring5.x讲解介绍

Spring 5.x 是 Spring Framework 的重要版本升级&#xff0c;全面拥抱现代 Java 技术栈&#xff0c;其核心改进涵盖响应式编程、Java 8支持、性能优化及开发模式创新。以下从特性、架构和应用场景三个维度详细解析&#xff1a; 一、核心特性与架构改进 Java 8 全面支持 Spring …

【C++进阶】第2课—多态

文章目录 1. 认识多态2. 多态的定义和实现2.1 构成多态的必要条件2.2 虚函数2.3 虚函数的重写或覆盖2.4 协变(了解)2.5 析构函数的重写2.6 override和final关键字2.7 重载、重写、隐藏对比 3. 纯虚函数和抽象类4. 多态原理4.1 虚函数表指针4.2 多态的实现4.3 静态绑定和动态绑定…

Dive into LVGL (1) —— How LVGL works from top to down

0.briefly speaking 由于工作原因&#xff0c;最近开始接触到一些图形图像处理相关的知识&#xff0c;在这个过程中逐渐接触到了LVGL。作为一个开源的图形库&#xff0c;LVGL可以高效地为MCU、MPU等嵌入式设备构建美观的UI界面。我的手头也正好有一块集成了Vivante 2.5D GPU的…

【HarmonyOS 5】鸿蒙中进度条的使用详解

【HarmonyOS 5】鸿蒙中进度条的使用详解 一、HarmonyOS中Progress进度条的类型 HarmonyOS的ArkUI框架为开发者提供了多种类型的进度条&#xff0c;每种类型都有其独特的样式&#xff0c;以满足不同的设计需求。以下是几种常见的进度条类型&#xff1a; 线性进度条&#xff08;…

OpenHarmony 开源鸿蒙南向开发——linux下使用make交叉编译第三方库——gmp

准备工作 请依照这篇文章搭建环境 OpenHarmony 开源鸿蒙南向开发——linux下使用make交叉编译第三方库——环境配置_openharmony交叉编译-CSDN博客 下载 wget https://gmplib.org/download/gmp/gmp-6.3.0.tar.xz 解压 tar -xf gmp-6.3.0.tar.xzcd gmp-6.3.0/ 环境变量 e…

量化交易策略的运行

✅ 什么是“策略的运行”&#xff1f; 在量化交易系统中&#xff0c;“策略的运行”并不一定意味着“每个策略对应一个线程”&#xff0c;但在大多数实际实现中&#xff0c;确实会使用线程、任务、协程或进程等形式来实现每个策略的独立调度与执行。 “运行”意味着策略开始生…

开平机:从原理到实践的全面技术剖析

一、开平机核心模块技术解析 1. 校平辊系的力学建模与辊型设计 校平机精度核心在于辊系设计&#xff0c;需通过弹塑性力学模型计算变形量。典型校平辊配置参数&#xff1a; 辊径比&#xff1a;校平辊直径&#xff08;D&#xff09;与板材厚度&#xff08;t&#xff09;需满足…

2、实验室测控系统 - /自动化与控制组件/lab-monitoring-system

76个工业组件库示例汇总 实验室测控系统开发组件 这是一个专为实验室设备数据采集与分析设计的可视化测控系统组件。采用工业风格界面设计&#xff0c;提供了丰富的动态数据展示与分析功能&#xff0c;可应用于各类实验室环境中的设备监控和数据处理。 功能特点 多设备管理…

在 Kotlin 中什么是委托属性,简要说说其使用场景和原理

在 Kotlin 中&#xff0c;属性委托和类委托是两种通过 by 关键字实现的强大特性&#xff0c;它们通过“委托”机制将行为或实现逻辑委托给其他对象&#xff0c;从而实现代码的复用和解耦。 1 属性委托 定义&#xff1a; 允许把属性的 get 和 set 方法的具体实现委托给另一个对…

AI星智协脑:智能驱动的高效协作管理平台全解读

前言 想象一下&#xff1a;早上刚开电脑&#xff0c;十几条未读消息如机关枪般扫射而来&#xff0c;各路任务像陨石雨一样砸向你&#xff0c;会议排得比热播剧还密集&#xff0c;文档版本堪比宫斗剧剧情反转&#xff0c;同事围着你转圈追KPI&#xff0c;活脱脱一场《职场大逃杀…