LVGL V8学习之键盘按键样式重绘(二)

2023-11-18

这一篇继续研究一下基于btnmatrix的键盘按键重绘,是对上一篇LVGL V8学习之键盘按键样式重绘(一)的代码的优化,还是通过codeblock来模拟代码的运行,代码如下:

// 按键矩阵的事件回调函数
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); // 橙色
                                //dsc->rect_dsc->bg_color = lv_color_hex(0x0041A0);
                            }
                        }
                        else
                        {
                            if (dsc->rect_dsc != NULL)
                            {
                                dsc->rect_dsc->bg_color = lv_color_hex(0xF98E2D);
                                //dsc->rect_dsc->bg_color = lv_color_hex(0x1985CE);
                            }
                        }

                        if (dsc->rect_dsc != NULL)
                        {
                            dsc->rect_dsc->radius = 5; // 设置目标绘制区域的圆角
                            dsc->rect_dsc->border_width = 0; // 设置目标绘制区域的边框宽度
                             //dsc->rect_dsc->shadow_width = 10; // 设置阴影的宽度像素值,value>=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 lv_gui_btnmatrix_with_textarea_test()
{
    // 按钮矩阵键盘映射的最后一个元素必须是 NULL 或空字符串 ""
    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); // 按钮矩阵添加事件回调函数
}

运行效果:

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LVGL V8学习之键盘按键样式重绘(二) 的相关文章

随机推荐

  • LaTeX中插入matlab代码(可添加中文注释)的几种方法

    最近在用LaTeX写文件时 需要插入matlab代码 但是matlab代码编写时没有注意到注释为中文所带来的不便 导致在编写LaTeX文件时总是报错 经查阅网上有关这方面的资料和自己不断地尝试之后 总结其中的方法如下 使用matlab的mc
  • 【满分】【华为OD机试真题2023 JS】字母组合

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 字母组合 知识点回溯 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 每个数字对应多个字母 对应关系如下 0 a b c 1 d e f 2 g h i 3 j
  • Android MVP 详解(上)

    作者 李旺成 时间 2016年4月3日 Android MVP 详解 下 已经发布 欢迎大家提建议 MVP 在 Android 上的使用其实已经有挺长一段时间了 长到似乎有点 过时 了 目前风头正劲的是MVVM 那为什么现在还要讲 MVP
  • tf.nn.atrous_conv2d如何实现空洞卷积?

    转载自 https blog csdn net mao xiao feng article details 78003730 介绍 关于空洞卷积的理论可以查看以下链接 这里我们不详细讲理论 1 Long J Shelhamer E Darr
  • 业务实战中如何利用MySQL函数来解决

    随着我们业务越来越复杂的情况下 完全基于java后台来解决首先是很麻烦 而且性能带来降低 代码的可读性下降 这个时候就需要一些MySQL的函数来解决了 这篇文章对于常见的MySQL函数不予介绍 concat函数 使用方法 CONCAT st
  • Flink设置Source数据源使用kafka获取数据

    流处理说明 有边界的流bounded stream 批数据 无边界的流unbounded stream 真正的流数据 Source 基于集合 package com pzb source import org apache flink ap
  • I Hate It

    很多学校流行一种比较的习惯 老师们很喜欢询问 从某某到某某当中 分数最高的是多少 这让很多学生很反感 不管你喜不喜欢 现在需要你做的是 就是按照老师的要求 写一个程序 模拟老师的询问 当然 老师有时候需要更新某位同学的成绩 Input 本题
  • volatile和synchronized的区别

    共性 volatile与synchronized都用于保证多线程中数据的安全 区别 1 volatile修饰的变量 jvm每次都从主存 主内存 中读取 而不会从寄存器 工作内存 中读取 而synchronized则是锁住当前变量 同一时刻只
  • 第一次 openwrt源码下载编译

    openwrt 学习记录 第一次 openwrt源码下载编译 MT7620开发板 安装虚拟机VMware 安装Ubnutu 先进入root账户 topeet ubuntu su 输入密码 1 搭建编译环境 参考 https blog csd
  • maven的使用

    目录 一 maven基本参数 二 maven基础结构 三 mvn的打包和运行 一 maven基本参数 groupId 是指项目里面的标识 一般写法是com mycom myapp 其中mycom是指你公司的域名 例如com google m
  • YOLOv5+PaddleOCR手写签名识别

    YOLOv5 PaddleOCR手写签名识别 介绍 参加了一个中国移动的比赛 比赛的数据集是一个工单 上面有多个人的签名还有手写的时间 因为主办方不允许数据公开 所以在这一系列博客中 我主要讲一下实现的思路 在YOLO演示的时候我会用其他的
  • 查看linux服务器内存信息

    查看服务器内存信息 dmidecode grep P A5 Memory s Device grep Size root localhost home dmidecode grep P A5 Memory s Device grep Siz
  • 【leetcode刷题】--- 21.合并两个有序链表(C++递归)

    21 合并两个有序链表 原题链接 https leetcode cn com problems merge two sorted lists 题目 将两个升序链表合并为一个新的 升序 链表并返回 新链表是通过拼接给定的两个链表的所有节点组成
  • 关于ApplicationContext的getBean()方法发现

    假定 Son类实现father接口 在Son类定义声明式事务后 通过ApplicationContext接口的getBean Class arg0 方法获取注入好的bean会报异常 方法参数Son class Son已声明bean org
  • 18. 线性代数 - 线性变换

    文章目录 线性空间 线性变换 线性变换的几何意义 特征值与特征向量 NumPy的矩阵操作 Hi 你好 我是茶桁 经历了几节线性代数课程之后 终于咱们到了最后一节课了 本节课的内容说多不多 说少也不少 我们先是要理解一下线性空间和线性变换 并
  • uml之Robustness Diagram

    Robustness Diagram 从需求分析到架构设计 转载自 http www dotblogs com tw jed archive 2010 11 21 robustness diagram aspx 什么是Robustness
  • Java IO流

    目录 一 认识Java的流 二 使用字节流读写文本文件 三 使用字符流读写文本文件 四 读写二进制文件 五 序列化和反序列化 六 总结 一 认识Java的流 1 读文件是指把文件中的数据读取到内存中 2 写文件是把内存中的数据写到文件中 3
  • 2023高教社杯 国赛数学建模E题思路 - 黄河水沙监测数据分析

    1 赛题 E 题 黄河水沙监测数据分析 黄河是中华民族的母亲河 研究黄河水沙通量的变化规律对沿黄流域的环境治理 气候变 化和人民生活的影响 以及对优化黄河流域水资源分配 协调人地关系 调水调沙 防洪减灾 等方面都具有重要的理论指导意义 附件
  • spring boot 之 kotlin语言开发,用一次就想放弃Java,爽歪歪~~~

    废话少说 上视频 spring boot 之 kotlin用一次就想放弃java 爽歪歪 1 启动入口 SpringBootApplication EnableDiscoveryClient class TawuziAuthServerDb
  • LVGL V8学习之键盘按键样式重绘(二)

    这一篇继续研究一下基于btnmatrix的键盘按键重绘 是对上一篇LVGL V8学习之键盘按键样式重绘 一 的代码的优化 还是通过codeblock来模拟代码的运行 代码如下 按键矩阵的事件回调函数 static void btnmatri