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)