LVGL_基础控件btnmatrix

news2025/1/12 1:06:41

LVGL_基础控件btnmatrix

1、创建按钮矩阵

在这里插入图片描述

/* 分配按钮以及按钮上的文字 */
// 这里注意不要使用在函数退出时会被销毁的局部变量
// 可以用 "\n" 进行换行,最后一个按钮之后的元素必须是 NULL 或 ""
// 换行 "\n" 和 "NULL" 或 "" 不计入实际的按钮个数,不占据按钮展示空间
static const char * map[] = {"btn11", "btn22", "btn11", "\n", "btn11", "btn55", NULL};
// 同时设置按钮的颜色
//static const char * map[] = {"#ff3a90 btn11#", "btn22", "#ff3a90 btn33#", "\n", "#ff3a90 btn44#", "btn55", NULL};
/* 创建一个按钮矩阵组件 */
lv_obj_t * btnm = lv_btnmatrix_create(lv_scr_act());

/* 设置按钮矩阵上的按钮 */
// 如果不设置将使用默认的5个按钮
lv_btnmatrix_set_map(btnm, map);
2、设置按钮的宽度

在这里插入图片描述

/* 单独设置某个按钮的宽度 */
// 按钮的索引值从 0 开始
// 如果一行有3个按钮,默认是每个按钮都是1也就是平均分配宽度
// 如果2个按钮设置了 2 ,那么总比例变成 1+2+1=4 ,
// 这时候按钮宽度分配占比: 1/4、 2/4、 1/4
// 按钮的宽度比例的最大值不能大于 7 也就是只能分配 1-7
lv_btnmatrix_set_btn_width(btnm, 1, 2);
lv_btnmatrix_set_btn_width(btnm, 3, 2);
3、隐藏按钮

在这里插入图片描述

// 按钮的索引值从 0 开始
//隐藏第一个按钮
lv_btnmatrix_set_btn_ctrl(btnm, 0, LV_BTNMATRIX_CTRL_HIDDEN);
//隐藏全部按钮
//lv_btnmatrix_set_btn_ctrl_all(btnm, LV_BTNMATRIX_CTRL_HIDDEN);
4、禁用某个按钮

在这里插入图片描述

lv_btnmatrix_set_btn_ctrl(btnm, 0, LV_BTNMATRIX_CTRL_DISABLED);
// 禁用这个按钮,可见,但是在屏幕上不能对其进行操作
5、按钮状态切换

在这里插入图片描述

lv_btnmatrix_set_btn_ctrl(btnm, 0, LV_BTNMATRIX_CTRL_CHECKABLE);
// 按钮可以切换(状态)
6、长按按钮时禁用重复
lv_btnmatrix_set_btn_ctrl(btnm, 0, LV_BTNMATRIX_CTRL_NO_REPEAT);
// 不要重复按此按钮,这样就不能像长按删除按钮会一直执行删除字符的效果,智能按一次删除一个字符
7、按钮标记
lv_btnmatrix_set_btn_ctrl_all(btnm, LV_BTNMATRIX_CTRL_CHECKED);
// 按钮被点击时会被标记,这样我们就可以知道哪些按钮被点击过
8、设置按钮的颜色

在这里插入图片描述

static const char * map[] = {"#ff3a90 btn11#", "btn22", "btn11", "\n", "btn11", "btn55", NULL};

/* 创建一个按钮矩阵组件 */
lv_obj_t * btnm = lv_btnmatrix_create(lv_scr_act());

/* 设置按钮矩阵上的按钮 */
// 如果不设置将使用默认的5个按钮
lv_btnmatrix_set_map(btnm, map);

lv_btnmatrix_set_btn_ctrl(btnm, 0, LV_BTNMATRIX_CTRL_RECOLOR);	// 文本重新上色,这样可以给按钮设置颜色
9、清除按钮属性
/* 单独清除某个按钮的控制属性 */
//lv_btnmatrix_clear_btn_ctrl(btnm, 0, LV_BTNMATRIX_CTRL_RECOLOR);
// 清除宽度,之后会平均分配宽度
//lv_btnmatrix_clear_btn_ctrl(btnm, 1, _LV_BTNMATRIX_WIDTH);
//lv_btnmatrix_clear_btn_ctrl(btnm, 3, _LV_BTNMATRIX_WIDTH);

/* 一次清除所有按钮的控制属性 */
//lv_btnmatrix_clear_btn_ctrl_all(btnm, LV_BTNMATRIX_CTRL_RECOLOR);
// 清除宽度,之后会平均分配宽度
//lv_btnmatrix_clear_btn_ctrl_all(btnm, _LV_BTNMATRIX_WIDTH);
10、设置控制按钮映射表
/* 设置控制按钮的映射表 */
// 不需要考虑上面的换行和最后的 NULL 或 ""
// 索引 0 对应第一个按钮,以此类推。
static lv_btnmatrix_ctrl_t ctrl_map[] = {LV_BTNMATRIX_CTRL_RECOLOR, LV_BTNMATRIX_CTRL_CHECKABLE, LV_BTNMATRIX_CTRL_CHECKED,\
										 1 | LV_BTNMATRIX_CTRL_RECOLOR | LV_BTNMATRIX_CTRL_CHECKABLE, LV_BTNMATRIX_CTRL_CHECKABLE};
/* 设置控制按钮的映射表 */
// 除了上面的单独设置某个按钮,以及一次设置所有的按钮
// 这是一种更折中方便的方式
lv_btnmatrix_set_ctrl_map(btnm, ctrl_map);
11、创建事件,获取点击按钮的ID值

注意:最好选用LV_EVENT_VALUE_CHANGED事件,因为LV_EVENT_CLICKED会在点击屏幕其他地方也会触发

static void btnm_event_handler(lv_event_t * e);

void lv_100ask_demo_course_3_14_1(void)
{

	static const char * map[] = {"#ff3a90 btn11#", "btn22", "btn11", "\n", "btn11", "btn55", NULL};

	lv_obj_t * btnm = lv_btnmatrix_create(lv_scr_act());

	lv_btnmatrix_set_map(btnm, map);

	/* 分配事件处理回调函数 */
	// 当按钮被按下或长按时会触发 LV_EVENT_VALUE_CHANGED 事件,我们只处理 LV_EVENT_VALUE_CHANGED 事件类型即可
	// 如果前面设置了 LV_BTNMATRIX_CTRL_DISABLED ,那么点击按钮将不会触发 LV_EVENT_VALUE_CHANGED 事件
	// 如果前面设置了 LV_BTNMATRIX_CTRL_NO_REPEAT , 那么长按按钮时不会一直触发 LV_EVENT_VALUE_CHANGED 事件
	//lv_obj_add_event_cb(btnm, btnm_event_handler, LV_EVENT_VALUE_CHANGED, NULL);

	// 当然我们也可以处理其他的事件类型比如被点击或者长按时
	// 如果前面设置了 LV_BTNMATRIX_CTRL_DISABLED ,只会触发 LV_EVENT_CLICKED 事件
	lv_obj_add_event_cb(btnm, btnm_event_handler, LV_EVENT_ALL, NULL);

}

static void btnm_event_handler(lv_event_t * e)
{
	lv_event_code_t code = lv_event_get_code(e);
	lv_obj_t * obj = lv_event_get_target(e);
	if(code == LV_EVENT_VALUE_CHANGED) {
		// 获取当前被点击的按钮的ID
		uint32_t id = lv_btnmatrix_get_selected_btn(obj);
		// 根据按钮ID获取对应按钮上的文本
		const char * txt = lv_btnmatrix_get_btn_text(obj, id);

		LV_LOG_USER("%s was pressed\n", txt);
	}
	else if(code == LV_EVENT_CLICKED) {
		uint32_t id = lv_btnmatrix_get_selected_btn(obj);
		const char * txt = lv_btnmatrix_get_btn_text(obj, id);

		LV_LOG_USER("LV_EVENT_CLICKED: %s was pressed\n", txt);
	}
}
12、设置行和列之间的间隙

在这里插入图片描述

// 设置 LV_PART_MAIN 的样式
// 设置 行间距,这里设置行间距为 0
lv_obj_set_style_pad_row(btnm, 0, LV_PART_MAIN);

// 设置 LV_PART_MAIN 的样式
// 设置 列间距,这里设置 列间距 为 0
lv_obj_set_style_pad_column(btnm, 0, LV_PART_MAIN);

13、设置按下时候按钮的颜色

// 设置按钮被按下时按钮的颜色
lv_obj_set_style_bg_color(btnm, lv_color_hex(0x78c146) , LV_STATE_PRESSED | LV_PART_ITEMS);

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

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

相关文章

Z-Fighting问题解决(二) - Reverse-z

Z值相关技术概论理清 开始之前先简单理清科普一下涉及的跟三维图形学相关的深度Z相关的概念: Z-Buffer:上个世纪八十年代的图形学飞跃节点算法之一; Z缓冲是一种解决深度排序问题的方法,主要用于确定哪些物体在其他物体的前面。…

【Oracle】分析函数partition by,解决了使用group by后select语句中只能是分组的字段或者是一个聚合函数的问题

首先我们看一下group by的用法,比如根据省份分组。 select province, sum(persons) from t_person group by province;使用了group by后,select语句中只能是分组的字段(比如上面的province)或者是一个聚合函数(比如co…

【特纳斯电子】基于单片机的火灾监测报警系统-仿真设计

视频及资料链接:基于单片机的火灾监测报警系统-仿真设计 - 电子校园网 (mcude.com) 编号: T0152203M-FZ 设计简介: 本设计是基于单片机的火灾监测报警系统,主要实现以下功能: 1.通过OLED显示温度、烟雾、是否有火…

jenkins pipeline使用

1、jenkins全局配置 1.1、maven配置 1.2、jdk配置 1.3、git配置 2、构建环境配置 2.1、安装时间插件 Date Parameter 2.2、Git Parameter 插件安装 3、pipeline如下 pipeline {agent anyenvironment {image_name "192.168.122.150/ken-test/price-service:${date}&…

jmeter监控服务器的资源使用

一. 下载安装包SeverAgent-x.x.x.zip并安装到被监控服务器 下载地址:https://github.com/undera/perfmon-agent 下载完解压后执行运行,windows运行startAgent.bat, linux运行startAgent.sh 二. 在jmeter上添加插件jpgc-PerfMon Metrics Collector监听器…

电商API接口的发展,电商API接口主要应用场景:

随着互联网技术的不断进步和电商行业的迅猛发展,电商API接口在商品交易、物流配送、客户服务等方面发挥着越来越重要的作用。本文将深入探讨电商API接口的技术原理、应用场景、开发方法以及优缺点。 一、技术原理 电商API接口是基于HTTP、TCP、IP等网络协议实现的…

代码随想录二刷 Day41

509. 斐波那契数 这个题简单入门&#xff0c;注意下N小于等于1的情况就可以 class Solution { public:int fib(int n) {if (n < 1) return n; //这句不写的话test能过但是另外的过不了vector<int> result(n 1); //定义存放dp结果的数组&#xff0c;还要定义大小r…

基于复合优化加速算法研究实际问题

import optimtool as oo from optimtool.base import np, sp, pltpip install optimtool>2.5.0加载hybird.nesterov.accer方法 import optimtool.hybrid as oh nes_acc oh.nesterov.accer初始化输入数据 f ( x ) ∑ i 1 n ( ( n − ∑ j 1 n cos ⁡ x j ) i ( 1 − co…

jenkins出错与恢复

如果你的jenkins出现了如下图所示问题&#xff08;比如不能下载插件&#xff0c;无法保存任务等&#xff09;&#xff0c;这个时候就需要重新安装了。 一、卸载干净jenknis 要彻底卸载 Jenkins&#xff0c;您可以按照以下步骤进行操作&#xff1a; 1、停止 Jenkins 服务&…

学信息系统项目管理师第4版系列29_信息系统治理

1. IT治理 1.1. 描述组织采用有效的机制对信息技术和数据资源开发利用&#xff0c;平衡信息化发展和数字化转型过程中的风险&#xff0c;确保实现组织的战略目标的过程 1.2. 驱动因素 1.2.1. 信息孤岛 1.2.2. 信息资源整合目标空泛 1.3. 高质量IT治理因素 1.3.1. 良好的I…

flask基础开发知识学习

之前做了一些LLM的demo&#xff0c;接口用flask写的&#xff0c;但是涉及到后端的一些业务就感觉逻辑写的很乱&#xff0c;代码变成屎山&#xff0c;于是借助官方文档和GPT迅速补了一些知识&#xff0c;总结一下一个很小的模板 于是决定边学边重构之前的代码… 文章目录 代码结…

吃鸡达人必备神器,提升战斗力享受顶级游戏干货!

大家好&#xff01;今天我为大家介绍一款专为吃鸡玩家打造的神器——吃鸡盒子。无论您是新手还是老玩家&#xff0c;吃鸡盒子都能帮助您提升游戏的战斗力&#xff0c;分享顶级游戏作战干货&#xff0c;并且还能方便吃鸡作图、查询库存和保护账号安全。 让我们先来说说提升战斗力…

使用Premiere、PhotoShop和Audition做视频特效

今天接到一个做视频的任务&#xff0c;给一个精忠报国的视频&#xff0c;要求&#xff1a;   ①去掉人声&#xff0c;就是将唱歌的人声去掉&#xff0c;只留下伴奏&#xff1b;   ②截图视频中的横幅&#xff0c;做一个展开的效果&#xff0c;类似卷纸慢慢展开&#xff1b;…

Golang学习:基础知识篇(二)—— 数组及切片

Golang学习&#xff1a;基础知识篇&#xff08;二&#xff09;—— 数组及切片 前言什么是Golang&#xff1f;Go语言的基础语法数组声明数组初始化数组访问数组知识点补充 切片定义切片切片初始化len() 和 cap() 函数空(nil)切片切片截取append() 和 copy() 函数知识点补充 前言…

【版本控制】Git(学习笔记)

一、Git工作流程图 clone&#xff08;克隆&#xff09;: 从远程仓库中克隆代码到本地仓库checkout &#xff08;检出&#xff09;&#xff1a;从本地仓库中检出一个仓库分支然后进行修订add&#xff08;添加&#xff09;: 在提交前先将代码提交到暂存区commit&#xff08;提交&…

Python--逻辑运算符(与或非) and or not

逻辑运算符&#xff08;与或非&#xff09; not就是取反&#xff0c;只有一个表达式not 表达式&#xff0c;如果表达式为True&#xff0c;则not以后就返回False。反之&#xff0c;则返回True。 案例&#xff1a;讲个非诚勿扰的小故事&#xff1a; ① 女孩子要求比较高&#…

【SpringBoot篇】基于SpringBoot进行Web开发

&#x1f38a;专栏【SpringBoot】 &#xfeff;> &#x1f354;喜欢的诗句&#xff1a;天行健&#xff0c;君子以自强不息。 &#xfeff;> &#x1f386;音乐分享【如愿】 &#xfeff;> &#x1f384;欢迎并且感谢大家指出小吉的问题&#x1f970; 文章目录 &#x…

【Java学习之道】TCPIP套接字编程实例

引言 网络编程是Java学习中不可或缺的一部分&#xff0c;而TCP/IP套接字编程又是网络编程的基础。那么&#xff0c;初学者如何才能快速掌握TCP/IP套接字编程呢&#xff1f;今天我们就来通过一个简单的实例&#xff0c;为你揭示TCP/IP套接字编程的奥秘&#xff01; 一、什么是…

互联网Java工程师面试题·Java 总结篇·第三弹

20、重载&#xff08;Overload&#xff09;和重写&#xff08;Override&#xff09;的区别。重载的方法能否根据返回类型进行区分&#xff1f; 方法的重载和重写都是实现多态的方式&#xff0c;区别在于前者实现的是编译时的多态性&#xff0c;而后者实现的是运行时的多态性。重…

【UBOOT】1-使用与烧写

​一、uboot简介 1&#xff09;uboot是一个裸机程序&#xff0c;比较复杂 2&#xff09;最主要的作用是引导Linux内核启动&#xff1b; 初始化DDR&#xff1b; 因为Linux是运行在DDR里面的&#xff1b;而Linux镜像&#xff08;zImage或uImagedtb&#xff09;一般存放在SD EMM…