lvgl_按钮矩阵

VGL(Light and Versatile Graphics Library)的按钮矩阵(lv_btnmatrix)是一个用于在行和列中显示多个按钮的轻量级控件。这个控件的特点是按钮不是实际创建的,而是实时绘制出来的,因此它非常节省内存。每个按钮仅使用大约8个字节的内存,相比之下,普通的按钮控件则需要大约100-150字节,再加上标签控件的内存占用1。

源码

//按键矩阵
void event_handler_1(lv_event_t * e) {
    lv_event_code_t code = lv_event_get_code(e);
    lv_obj_t * btnm = lv_event_get_target(e);
    if(code == LV_EVENT_VALUE_CHANGED) {
      /* 获取被选中的按钮的ID */
      uint32_t id = lv_btnmatrix_get_selected_btn(btnm);
      /* 获取对应按钮的文本 */
      const char * txt = lv_btnmatrix_get_btn_text(btnm, id);
      LV_LOG_USER("Selected button: %s\n", txt);
    }
}
/* 按钮矩阵的map */
const char * btn_map[] = {"1", "2", "3", "\n", "4", "5", "6", "7",""};//末尾必须有一个“”

void lv_ex_btnmatrix_1(void) {
    /* 创建一个按钮矩阵对象 */
    lv_obj_t * btnm = lv_btnmatrix_create(lv_scr_act());
    /* 设置按钮矩阵的文本映射 */
    lv_btnmatrix_set_map(btnm, btn_map);
    /* 将按钮矩阵居中于屏幕 */
    lv_obj_align(btnm, LV_ALIGN_CENTER, 0, 0);

    /* 添加事件处理 */
    lv_obj_add_event_cb(btnm, event_handler_1, LV_EVENT_ALL, NULL);

    /* 控制按钮属性 */
    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);
}

注释版

#include "lvgl/lvgl.h"

/* 事件处理函数,当按钮矩阵中的按钮被选中时调用 */
void event_handler(lv_event_t * e) {
    /* 获取事件代码 */
    lv_event_code_t code = lv_event_get_code(e);
    /* 获取事件的目标对象,即按钮矩阵 */
    lv_obj_t * btnm = lv_event_get_target(e);
    /* 如果事件是值改变事件 */
    if(code == LV_EVENT_VALUE_CHANGED) {
        /* 获取被选中的按钮的ID */
        uint32_t id = lv_btnmatrix_get_selected_btn(btnm);
        /* 获取对应按钮的文本 */
        const char * txt = lv_btnmatrix_get_btn_text(btnm, id);
        /* 打印被选中的按钮文本 */
        LV_LOG_USER("Selected button: %s\n", txt);
    }
}

/* 创建并配置一个按钮矩阵的函数 */
void lv_ex_btnmatrix_1(void) {
    /* 在当前活动屏幕上创建一个按钮矩阵对象 */
    lv_obj_t * btnm = lv_btnmatrix_create(lv_scr_act());
    /* 设置按钮矩阵的文本映射 */
    lv_btnmatrix_set_map(btnm, btn_map);
    /* 将按钮矩阵居中于屏幕 */
    lv_obj_align(btnm, LV_ALIGN_CENTER, 0, 0);

    /* 设置按钮矩阵的背景颜色和透明度 */
    lv_obj_set_style_bg_color(btnm, lv_color_hex(0xdef), 0);
    lv_obj_set_style_bg_opa(btnm, LV_OPA_COVER, 0);
    /* 设置按钮矩阵的边框颜色和透明度 */
    lv_obj_set_style_border_color(btnm, lv_color_hex(0x000), 0);
    lv_obj_set_style_border_opa(btnm, LV_OPA_70, 0);

    /* 设置按钮在按下状态下的文本颜色 */
    lv_obj_set_style_text_color(btnm, lv_color_hex(0x03a9f4), LV_PART_ITEMS | LV_STATE_PRESSED);
    /* 设置按钮在释放状态下的文本颜色 */
    lv_obj_set_style_text_color(btnm, lv_color_hex(0xffffff), LV_PART_ITEMS | LV_STATE_RELEASED);

    /* 为按钮矩阵添加事件处理回调函数 */
    lv_obj_add_event_cb(btnm, event_handler, LV_EVENT_ALL, NULL);

    /* 设置按钮的可选属性,例如第一个、第二个和第三个按钮可以被选中 */
    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);
}

/* 按钮矩阵的文本映射数组 */
const char * btn_map[] = {"1", "2", "3", "\n", "4", "5", "6", ""};

/* 主函数 */
int main(void) {
    /* 初始化LVGL库 */
    lv_init();

    /* 初始化显示驱动和输入设备(代码省略) */
    // ...(此处省略具体的显示和输入设备初始化代码)

    /* 创建并显示一个简单的按钮矩阵 */
    lv_ex_btnmatrix_1();

    /* 无限循环处理LVGL任务 */
    while(1) {
        /* 处理LVGL任务 */
        lv_timer_handler();
        /* 短暂休眠 */
        usleep(5000);
    }

    /* 返回0表示程序正常退出 */
    return 0;
}

1.常用方法

创建按钮矩阵:

lv_obj_t * lv_btnmatrix_create(lv_obj_t * parent)

设置字符串数组:

void lv_btnmatrix_set_map(lv_obj_t * obj, const char * map[])

参数1:btnmatrix对象

参数2:字符串数组,每个字符串代表一个按钮

设置按钮大小:

void lv_btnmatrix_set_btn_width(lv_obj_t * obj, uint16_t btn_id, uint8_t width)

参数2:btn的编号(从0开始)

参数3:宽度的倍数(同行相比)

设置按钮的控制状态:

void lv_btnmatrix_set_btn_ctrl(lv_obj_t * obj, uint16_t btn_id, lv_btnmatrix_ctrl_t ctrl)
void lv_btnmatrix_clear_btn_ctrl(lv_obj_t * obj, uint16_t btn_id, lv_btnmatrix_ctrl_t ctrl)

btnmatrix事件处理:

struct _lv_event_dsc_t * lv_obj_add_event_cb(lv_obj_t * obj, lv_event_cb_t event_cb, lv_event_code_t filter,
                                             void * user_data)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值