Button Matrix 控件可以在行和列中显示多个按钮。
希望使用按钮矩阵而不是容器和单个按钮对象的主要原因是:
Button 矩阵的主要部分称为 LV_BTNMATRIX_PART_BG 。它使用典型的背景样式属性绘制背景。
LV_BTNMATRIX_PART_BTN 是虚拟部分,它指的是按钮矩阵上的按钮。它还使用所有典型的背景属性。背景中的顶部/底部/左侧/右侧填充值用于在侧面保留一些空间。在按钮之间应用内部填充。
按键矩阵上每个按键有文本,用这个函数设置lv_btnmatrix_set_map(btnm, my_map),其中第二个参数就是字符串数组,可以定义为如下模样:
const char * map[] = {"btn1", "btn2", "\n", "btn3", ""}
需要注意三点:
搞一个程序来测试下:
void lvgl_button_matrix_text_test(void)
{
static const char* btnm_text[] = { "TEST1", "TEST2", "TEST3", "\n",
"TEST4", "TEST5","TEST6","" };
lv_obj_t* btnm1 = lv_btnmatrix_create(lv_scr_act(), NULL);
lv_btnmatrix_set_map(btnm1, btnm_text);
lv_obj_align(btnm1, NULL, LV_ALIGN_CENTER, 0, 0);
}
看下效果
按钮宽度可以相对于与同一行被设置为其他按钮 中的线例如具有两个按钮:btnA,宽度= 1 和,btnB 宽度= 2,btnA 将有 33%的宽度和 btnB 将有 66%的宽度。用这个函数设置:lv_btnmatrix_set_btn_width(btnm, btn_id, width)
另外,还可以通过函数lv_btnmatrix_set_btn_ctrl设置如下参数:
我们直接上一段代码:
/********************************************************************************************/
void lvgl_button_matrix_control_test(void)
{
static const char* btnm_text[] = { "ID0", "ID1", "ID2", "\n",
"ID3", "ID4","ID5","" };
lv_obj_t* btnm1 = lv_btnmatrix_create(lv_scr_act(), NULL);
lv_btnmatrix_set_map(btnm1, btnm_text);
lv_btnmatrix_set_btn_width(btnm1, 0, 2);
lv_btnmatrix_set_btn_ctrl(btnm1,3, LV_BTNMATRIX_CTRL_HIDDEN);
lv_btnmatrix_set_btn_ctrl(btnm1, 4, LV_BTNMATRIX_CTRL_DISABLED);
lv_btnmatrix_set_btn_ctrl(btnm1, 5, LV_BTNMATRIX_CTRL_CHECKABLE);
lv_obj_align(btnm1, NULL, LV_ALIGN_CENTER, 0, 0);
}
效果如下:其中看代码就能看出来宽度ID0是占比50%,ID3隐藏,ID4禁用,ID5是可以按下不弹起(Toggle)
只允许同一时间只有一个按键处于按下不弹起状态(Toggle),用这个函数来设置lv_btnmatrix_set_one_check(btnm, true)
我们来写代码看下效果,代码如下:
void lvgl_button_matrix_one_check_test(void)
{
static const char* btnm_text[] = { "ID0", "ID1", "ID2", "\n",
"ID3", "ID4","ID5","" };
lv_obj_t* btnm1 = lv_btnmatrix_create(lv_scr_act(), NULL);
lv_btnmatrix_set_map(btnm1, btnm_text);
lv_obj_align(btnm1, NULL, LV_ALIGN_CENTER, 0, 0);
lv_btnmatrix_set_btn_ctrl(btnm1, 0, LV_BTNMATRIX_CTRL_CHECKABLE);
lv_btnmatrix_set_btn_ctrl(btnm1, 1, LV_BTNMATRIX_CTRL_CHECKABLE);
lv_btnmatrix_set_btn_ctrl(btnm1, 2, LV_BTNMATRIX_CTRL_CHECKABLE);
lv_btnmatrix_set_btn_ctrl(btnm1, 3, LV_BTNMATRIX_CTRL_CHECKABLE);
lv_btnmatrix_set_btn_ctrl(btnm1, 4, LV_BTNMATRIX_CTRL_CHECKABLE);
lv_btnmatrix_set_btn_ctrl(btnm1, 5, LV_BTNMATRIX_CTRL_CHECKABLE);
lv_btnmatrix_set_one_check(btnm1, true);
}
效果如下:
在文本上的按钮可以重新着色类似的重新着色功能标签的对象。要启用它,用这个函数lv_btnmatrix_set_recolor(btnm, true)
要使按钮上的文本对齐,用这个函数lv_btnmatrix_set_align(roller, LV_LABEL_ALIGN_LEFT/CENTER/RIGHT)
除了通用事件外,按钮矩阵还发送以下特殊事件:
LV_EVENT_VALUE_CHANGED-在按下/释放按钮时或在长按之后重复时发送。事件数据设置为按下/释放按钮的 ID。
我们来写一个测试程序来看下效果:
static void buttonm_event_handler(lv_obj_t* obj, lv_event_t event)
{
if (event == LV_EVENT_VALUE_CHANGED) {
uint16_t id = lv_btnmatrix_get_active_btn(obj);
const char* txt = lv_btnmatrix_get_active_btn_text(obj);
printf("ID:%d press,text:%s\n", id,txt);
}
}
void lvgl_button_matrix_event_test(void)
{
static const char* btnm_text[] = { "ID0", "ID1", "ID2", "\n",
"ID3", "ID4","ID5","" };
lv_obj_t* btnm1 = lv_btnmatrix_create(lv_scr_act(), NULL);
lv_btnmatrix_set_map(btnm1, btnm_text);
lv_obj_align(btnm1, NULL, LV_ALIGN_CENTER, 0, 0);
lv_obj_set_event_cb(btnm1, buttonm_event_handler);
}
效果如下:
好了,完结了,更多精彩继续戳↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓