LVGL 控件之矩阵按钮(lv_buttonmatrix)

news2024/11/15 13:34:04

目录

  • 一、矩阵按键
    • 1、组成
    • 2、创建矩阵
    • 3、按钮宽度
    • 4、按键属性
    • 5、按钮互斥
    • 6、按钮文本重着色
    • 7、按钮矩阵部件的事件
    • 8、API 函数
    • 二、例程


一、矩阵按键

1、组成

按钮矩阵部件由两个部分组成:主体背景和按钮,示意图如下:

  • LV_PART_MAIN:对应按钮矩阵的背景
  • LV_PART_ITEMS:对应按钮矩阵的按钮
lv_obj_set_style_bg_color(btnM, lv_color_make(152, 244, 123), LV_PART_MAIN);

lv_obj_set_style_bg_color(btnM, lv_color_make(152, 244, 123), LV_PART_ITEMS);

2、创建矩阵

按钮矩阵部件中的每个按钮都可以设置文本,如果用户想设置这些按钮文本,则需要定义一个字符串数组(指针),并在该数组中传入所需的文本内容,最后通过 lv_btnmatrix_set_map 函数设置按钮文本,示例代码如下:

注意:该数组最后一个元素必须为空

lv_obj_t *btnM = lv_btnmatrix_create(lv_scr_act());
static const char* btnMap[] = {
    ",", "ABC", "DEF", "\n",
    "GHI", "JKL", "MNO", "\n",
    "PQRS", "TUV", "WXYX", ""
};
lv_btnmatrix_set_map(btnM, btnMap);
lv_obj_align(btnM, LV_ALIGN_CENTER, 0, 0);

此外,每个按钮还有个索引,索引对于按钮的属性设置非常重要。实际上索引的顺序就是我们添加按键的顺序:

3、按钮宽度

在默认情况下,按钮矩阵每一行按钮的宽度都是自动计算的,如果用户想改变按钮的宽度,可以调用 lv_btnmatrix_set_btn_width 函数来进行设置。值得注意的是,在按钮矩阵部件中,按钮只能设置相对宽度。

现在在上例的基础上添加:

lv_btnmatrix_set_btn_width(btnM, 1, 10);

4、按键属性

用户可以调用 lv_btnmatrix_set_btn_ctrl 函数,为按钮添加、清除指定的属性,这些属性的相关枚举如下:

  • LV_BTNMATRIX_CTRL_HIDDEN:将按钮隐藏;
  • LV_BTNMATRIX_CTRL_NO_REPEAT:禁用长按;
  • LV_BTNMATRIX_CTRL_DISABLED:禁用按钮;
  • LV_BTNMATRIX_CTRL_CHECKABLE:启用按钮状态切换;
  • LV_BTNMATRIX_CTRL_CHECKED:选中按钮;
  • LV_BTNMATRIX_CTRL_POPOVER:按下此按钮时在弹出窗口中显示按钮标签;
  • LV_BTNMATRIX_CTRL_RECOLOR:启用按钮文本的重新着色功能。

例:

lv_btnmatrix_set_btn_ctrl(btnM, 0, LV_BTNMATRIX_CTRL_HIDDEN);
lv_btnmatrix_set_btn_ctrl(btnM, 1, LV_BTNMATRIX_CTRL_DISABLED);
lv_btnmatrix_set_btn_ctrl(btnM, 2, LV_BTNMATRIX_CTRL_CHECKABLE);


如果用户想要清除按钮的指定属性,可以调用 lv_btnmatrix_clear_btn_ctrl 函数。

5、按钮互斥

按钮互斥是指:在某一时刻,只允许有一个按钮处于按下不弹起状态(被选中),当我们选中一个按钮之后,其他的按钮将会自动清除选中属性,示意图如下:

lv_btnmatrix_set_btn_ctrl(btnM, 0, LV_BTNMATRIX_CTRL_CHECKABLE);
lv_btnmatrix_set_btn_ctrl(btnM, 1, LV_BTNMATRIX_CTRL_CHECKABLE);
lv_btnmatrix_set_btn_ctrl(btnM, 2, LV_BTNMATRIX_CTRL_CHECKABLE);

lv_btnmatrix_set_one_checked(btnm1, true);

点击第一个键后,其处于被选中状态;


现在再点击第三个键,其处于被选中状态,不过第一个键的状态被清除了:

在这里插入图片描述

6、按钮文本重着色

在默认情况下,按钮矩阵中的按钮文本都是黑色的,如果用户需要设置文本为其他的颜色,则必须先调用 lv_btnmatrix_set_btn_ctrl 函数,为按钮添加文本重着色的属性。

设置如下:

void my_gui(void)
{
    lv_obj_t *btnM = lv_btnmatrix_create(lv_scr_act());
    static const char* btnMap[] = {
        ",", "#FF0000 ABC#", "DEF", "\n",
        "GHI", "JKL", "MNO", "\n",
        "PQRS", "TUV", "WXYX", ""
    };
    lv_btnmatrix_set_map(btnM, btnMap);
    lv_obj_align(btnM, LV_ALIGN_CENTER, 0, 0);

    lv_btnmatrix_set_btn_ctrl(btnM, 1, LV_BTNMATRIX_CTRL_RECOLOR);
}


注意看,颜色设置格式为:# + 16 进制颜色 + 按钮文本 + #,在设置完文本颜色之后,我们还需要为按钮添加文本重着色的属性,其相关的枚举为 LV_BTNMATRIX_CTRL_RECOLOR

7、按钮矩阵部件的事件

  1. LV_EVENT_VALUE_CHANGED:当一个按钮被按下、释放或长按时发送。
  2. LV_EVENT_DRAW_PART_BEGIN:开始绘制按钮。

8、API 函数

函数含义
lv_btnmatrix_create()创建按钮矩阵部件
lv_btnmatrix_set_map()设置按钮
lv_btnmatrix_set_ctrl_map()设置多个按钮属性
lv_btnmatrix_set_selected_btn()设置选中的按钮
lv_btnmatrix_set_btn_ctrl()设置一个按钮的属性
lv_btnmatrix_clear_btn_ctrl()清除某个按钮的属性
lv_btnmatrix_set_btn_ctrl_all()设置所有按钮的属性
lv_btnmatrix_clear_btn_ctrl_all()清除所有按钮的属性
lv_btnmatrix_set_btn_width()设置单个按钮的相对宽度
lv_btnmatrix_set_one_checked()设置按钮互斥
lv_btnmatrix_get_map()获取按钮相关映射
lv_btnmatrix_get_selected_btn()获取用户最后点击的按钮的索引
lv_btnmatrix_get_btn_text()获取按钮的文本
lv_btnmatrix_has_btn_ctrl()获取按钮的状态
lv_btnmatrix_get_one_checked()判断按钮互斥是否开启

二、例程

// 按键矩阵的事件回调函数
static void btnmatrix_event_callback(lv_event_t * event)
{
    if (event == NULL)
    {
        printf("[%s:%d] event is NULL\n", __FUNCTION__, __LINE__);
        return ;
    }

    lv_event_code_t code = lv_event_get_code(event); // 获取当前event的code
    lv_obj_t * obj = lv_event_get_target(event);     // 获取当前事件的触发对象

    if (code == LV_EVENT_DRAW_PART_BEGIN) // 开始绘制一个区域的事件,这个事件的参数是lv_obj_draw_part_dsc_t *
    {
        lv_obj_draw_part_dsc_t * dsc = (lv_obj_draw_part_dsc_t *)lv_event_get_param(event);
        if (dsc != NULL)
        {
            switch (dsc->id)
            {
                case 0:
                case 1:
                case 2:
                case 3:
                case 4:
                case 5:
                case 6:
                case 7:
                case 8:
                case 9:
                case 10:
                case 11:
                    {
                        if (lv_btnmatrix_get_selected_btn(obj) == dsc->id)
                        {
                            if (dsc->rect_dsc != NULL)
                            {
                                // 设置目标绘制区域的背景颜色
                                dsc->rect_dsc->bg_color = lv_color_hex(0xFF6008); // 橙色
                            }
                        }
                        else
                        {
                            if (dsc->rect_dsc != NULL)
                            {
                                dsc->rect_dsc->bg_color = lv_color_hex(0xF98E2D);
                            }
                        }

                        if (dsc->rect_dsc != NULL)
                        {
                            dsc->rect_dsc->radius = 5; // 设置目标绘制区域的圆角
                            dsc->rect_dsc->border_width = 0; // 设置目标绘制区域的边框宽度
                            dsc->rect_dsc->shadow_ofs_x = 0; // 在X方向的像素上设置阴影的偏移量
                            dsc->rect_dsc->shadow_ofs_y = 0; // 在Y方向的像素上设置阴影的偏移量
                         }

                         if (dsc->label_dsc != NULL)
                         {
                            dsc->label_dsc->color = lv_color_hex(0xFFFFFF);
                         }
                    }
                    break;

                default:
                    break;
            }
        }
    }
    else if(code == LV_EVENT_VALUE_CHANGED) // 当一个按钮被按下、释放或长按时
    {
        lv_obj_t * text_area = (lv_obj_t *)lv_event_get_user_data(event); // 获取事件的user_data
        uint16_t btn_id = lv_btnmatrix_get_selected_btn(obj);             // 获取当前选中的按键的id
        const char * txt = lv_btnmatrix_get_btn_text(obj, btn_id);        // 获取当前按键的文本

        if (txt != NULL)
        {
            if (strcmp(txt, LV_SYMBOL_BACKSPACE) == 0)
            {
                if (text_area != NULL)
                {
                    lv_textarea_del_char(text_area); // 删除文本框的字符
                }
            }
            else
            {
                if (text_area != NULL)
                {
                    lv_textarea_add_text(text_area, txt); // 文本框追加字符
                }
            }
        }
    }
}


void my_gui()
{
    static const char * btnm_map[] = {"1", "2", "3", "\n",
                                       "4", "5", "6", "\n",
                                       "7", "8", "9", "\n",
                                       ".", "0", LV_SYMBOL_BACKSPACE, ""};

    lv_obj_t * obj_text_area = lv_textarea_create(lv_scr_act()); // 创建文本框控件
    if (obj_text_area == NULL)
    {
        printf("[%s:%d] obj_text_area is NULL\n", __FUNCTION__, __LINE__);
        return ;
    }

    lv_textarea_set_one_line(obj_text_area, true);        // 将文本区域配置为一行
    lv_textarea_set_password_mode(obj_text_area, true);   // 将文本区域配置为密码模式
    lv_textarea_set_max_length(obj_text_area, 15);        // 设置文本区域可输入的字符长度最大值
    lv_obj_add_state(obj_text_area, LV_STATE_FOCUSED);    // 显示光标
    lv_obj_set_style_radius(obj_text_area, 5, 0);         // 设置样式的圆角弧度
    lv_obj_set_style_border_width(obj_text_area, 1, 0);   //设置边框宽度
    lv_obj_set_size(obj_text_area, 255, 40);              // 设置对象大小
    lv_obj_align(obj_text_area, LV_ALIGN_TOP_MID, 0, 50);

    lv_obj_t * obj_btnm = lv_btnmatrix_create(lv_scr_act()); // 创建一个按钮矩阵对象
    if (obj_btnm == NULL)
    {
        printf("[%s:%d] obj_btnm is NULL\n", __FUNCTION__, __LINE__);
        return ;
    }

    lv_btnmatrix_set_one_checked(obj_btnm, true);  // 启用“一次检查”功能,允许一次只检查一个按钮。
    lv_obj_set_size(obj_btnm, 260, 245);           // 设置控件大小
    lv_obj_align(obj_btnm, LV_ALIGN_CENTER, 0, 0);
    lv_obj_clear_flag(obj_btnm, LV_OBJ_FLAG_CLICK_FOCUSABLE); // 按钮按下的是时候焦点才聚集到该控件,确保按钮按下后焦点聚集到文本框
    lv_btnmatrix_set_map(obj_btnm, btnm_map);                 // 给按钮矩阵添加键盘映射

    int i = 0;
    for (i = 0; i < 12; i++)
    {
        lv_btnmatrix_set_btn_ctrl(obj_btnm, i, LV_BTNMATRIX_CTRL_NO_REPEAT); // 长按按钮时禁用重复
    }

    lv_obj_set_style_radius(obj_btnm, 0, 0);                                                       // 设置样式的圆角弧度
    lv_obj_set_style_border_width(obj_btnm, 0, 0);                                                 //设置边框宽度
    lv_obj_set_style_bg_color(obj_btnm, lv_color_hex(0xFFFFFF), 0);                                // 设置背景颜色
    lv_obj_set_style_bg_opa(obj_btnm, LV_OPA_0, 0);                                                // 设置样式背景的不透明度
    lv_obj_set_style_text_font(obj_btnm, &lv_font_montserrat_20, 0);                               //设置字体
    lv_obj_add_event_cb(obj_btnm, btnmatrix_event_callback, LV_EVENT_ALL, (void *)obj_text_area);  // 按钮矩阵添加事件回调函数
}

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

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

相关文章

DiskCache:Python开发者的磁盘缓存利器

什么是DiskCache&#xff1f; DiskCache是一个用纯Python编写的轻量级缓存库&#xff0c;它利用磁盘空间来存储缓存数据。与传统的内存缓存相比&#xff0c;DiskCache可以利用磁盘上未被充分利用的空间&#xff0c;为需要大量缓存数据的应用程序提供支持。它的核心是基于SQLite…

C++创建并初始化对象

文章目录 一、对象的创建1.1 定义类1.2 创建对象 二、对象的初始化2.1 默认构造函数2.2 带参数的构造函数2.3 初始化列表 三、拷贝构造函数四、对象的销毁五、总结 视频讲解笔记在栈上创建在堆上创建new 在C中&#xff0c;创建并初始化对象是面向对象编程&#xff08;OOP&#…

基于yolov8的驾驶员行为检测疲劳检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv8的驾驶员行为检测疲劳检测系统是一种创新的驾驶安全解决方案。该系统利用YOLOv8这一先进的目标检测算法&#xff0c;结合驾驶员疲劳驾驶数据集&#xff0c;能够实时、准确地监测并分析驾驶员的面部表情和行为模式&#xff0c;从而快速识别疲劳状态。 …

关于分布式数据库缓存设计的那点事和实践

目录 案例 【题目】 【问题 1】(9 分) 【问题 2】(8 分) 【问题 3】(8 分) 【答案】 【问题 1】答案 【问题 2】解析 【问题 3】解析 相关推荐 案例 阅读以下关于分布式数据库缓存设计的叙述&#xff0c;在答题纸上回答问题 1 至问题 3。 【题目】 某企业是为城市高…

【网络协议】精讲OSI七层模型、TCP/IP四层、五层模型区别!图解超赞超详细!!!

目录 1. OSI与TCP/IP模型的网络协议层次结构差异 1.1 OSI模型的七层结构 1.2 TCP/IP模型的四层结构 1.3 TCP/IP模型的五层结构 2. OSI七层模型和TCP/IP协议模型的区别 2.1 区别总结&#xff1a; 3. 网络协议分层的优点 1. OSI与TCP/IP模型的网络协议层次结构差异 协议分…

拥抱开源拥护国产|暴雨打造最强AI的服务器操作系统!

8月30日&#xff0c;主题为“进化重构赴未来”的2024龙蜥操作系统大会(OpenAnolis Conference)在北京举办。龙蜥社区作为国内领先的开源操作系统根社区&#xff0c;推出的Anolis OS及衍生版装机量已突破800万套&#xff0c;实现了从开源到商业化的良性循环发展。 2024 龙蜥操作…

【惊天BUG】select * from 表 where value = 0;查询结果让大师兄都傻眼了

前言 &#x1f34a;缘由 线上问题把我坑&#xff0c;一查数据让我蒙 &#x1f423;闪亮主角 大家好&#xff0c;我是JavaDog程序狗 今天跟大家分享一个本狗造成的线上事故&#xff0c; 一个简单的SQL查询语句导致的bug &#x1f608;你想听的故事 最近狗哥有点飘&#xf…

MCU1.51单片机介绍

1.单片机&#xff08;MCU 全称 Mirco Controller Unit 意为微小控制器的集合&#xff09; 相当于一台迷你电脑&#xff08;集成了很多硬件&#xff09; 2.作用 传感&#xff08;采集信息&#xff09;&#xff0c;处理&#xff08;CPU Central Processing Unit 中央处理器&am…

智能的瓶颈在于事物表征的弥散与聚合性(弥聚性)

动态“弥散与聚合性”&#xff08;弥聚性&#xff09;是智能系统面临的一个重要挑战。这个概念涉及如何在处理信息时平衡广度和深度&#xff0c;以及如何有效地表征和组织知识。 &#xff08;1&#xff09;弥散性 弥散性指的是信息或知识的分散性和多样性。智能系统需要处理来自…

非对称RAID破解SSD异构存储难题

上一篇文章&#xff08;Kioxia的NVMe RAID卸载有何亮点&#xff1f;&#xff09;介绍了NVMe RAID卸载方案内容。本文我们结合一篇学术论文&#xff0c;学习一下新的非对称RAID架构&#xff5e; 随着大数据时代的到来&#xff0c;全闪存阵列&#xff08;All-Flash Arrays, AFAs&…

校园一卡通|基于SprinBoot+vue的校园一卡通系统(源码+数据库+文档)

校园一卡通系统 基于SprinBootvue的校园一卡通系统 一、前言 二、系统设计 三、系统功能设计 系统功能实现 后台模块实现 管理员功能实现 学生功能实现 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍…

linux驱动 -- PWM配置和SysFs操作方法

1&#xff1a;PWM介绍 PWM的定义为:可调节脉冲调节器&#xff0c;换句话来说就是一个总周期不变&#xff0c;占空比可调节的方波。 2&#xff1a;PWM的总周期和占空比、有效点平 方波&#xff1a;在信号领域一般分为数字信号和模拟信号&#xff0c;数字信号就两种状态&#…

UML类图中的依赖,继承,和实现关系

依赖关系 依赖关系是一种使用关系&#xff0c;它是对象之间耦合度最弱的一种关系。在代码中&#xff0c;某个类通过局部变量&#xff0c;方法的参数或者对静态方法的调用来访问另外一个类的方法。 依赖关系通过带箭头的虚线表示&#xff0c;箭头从使用类指向被依赖的类 继承关…

中仕公考怎么样?函授大专可以考公吗?

函授大专学历&#xff0c;作为成人高等教育的一种形式&#xff0c;是被认证的&#xff0c;所以在绝大多数情况下&#xff0c;持有函授大专学历的个人符合公务员及事业单位岗位的报考资格。只有招聘公告中明确要求考生必须持有全日制或统招学历时&#xff0c;才不符合条件。 在…

【STM32开发指南】STM32最小系统板详解

【前言】 在单片机项目开发中&#xff0c;STM32系列微控制器因其高性能、低功耗和丰富的外设资源而备受青睐。其中&#xff0c;STM32最小系统板作为STMicroelectronics STM32系列微控制器的基础硬件平台&#xff0c;不仅简化了硬件设计&#xff0c;还极大地促进了软件开发的便…

用ChatGPT提升论文质量:改进语法、用词和行文的有效方法

学境思源&#xff0c;一键生成论文初稿&#xff1a; AcademicIdeas - 学境思源AI论文写作 在学术写作中&#xff0c;语法、用词和行文的质量直接影响论文的可读性和学术价值。今天我们将介绍如何利用ChatGPT优化论文的语法结构、改进用词精准度以及提升行文流畅性。帮助写作者…

多线程篇(锁相关类- StampedLock(改进的读写锁)(JDK8新增))(持续更新迭代)

目录 一、前言 二、StampedLock提供的三种读写模式的锁分别如下 写锁writeLock 悲观读锁 readLock 乐观读锁 tryOptimisticRead 三、StampedLock支持这三种锁在一定条件下进行相互转换 四、案例介绍 五、知识小结 一、前言 StampedLock 是并发包里面 JDK8 版本新增的一…

线性代数 第二讲 矩阵_逆矩阵_伴随矩阵_分块矩阵_初等矩阵_矩阵的秩

矩阵 文章目录 矩阵1.矩阵的定义2.矩阵的运算法则3.特殊矩阵3.1 伴随矩阵3.2 可逆矩阵3.2.1 定义3.2.2 可逆矩阵的一些定理3.2.3 可逆矩阵公式与转置矩阵公式3.2.4 求逆矩阵 3.3 分块矩阵3.3.1 分块矩阵的运算3.3.2 分块矩阵的初等行变换&#xff08;超纲内容但要了解&#xff…

YOLOv9输出模型每一层的耗时和GFLOPs

在做一些比较实验中&#xff0c;如何更精确的查看和对比我们的改进模块时候有效&#xff0c;是否有提升&#xff0c;特别是在模型轻量化时&#xff0c;这时候我们就可以打印改进模型每一层的耗时和GFLOPS来比较不同模块的占用量。在YOLOv9中&#xff0c;打印模型每一层的耗时和…

食堂线上预约点餐系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;学生管理&#xff0c;菜品分类管理&#xff0c;菜品管理&#xff0c;关于我们管理&#xff0c;意见反馈&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;菜品&#xff0c;购…