1 按鈕矩陣控件
lv_btnmatrix 是 LVGL(Light and Versatile Graphics Library) v8 中提供的一個非常實用的控件,用于創建帶有多個按鈕的矩陣布局。它常用于實現虛擬鍵盤、數字鍵盤、操作面板、選擇菜單等場景,特別適用于嵌入式設備、觸摸屏等界面。
1.1 功能與特點
lv_btnmatrix 控件的主要功能是展示多個按鈕,并提供靈活的布局與交互方式。它的特點包括:
動態布局:按鈕布局可以根據需求進行調整,可以顯示任意大小和排列方式的按鈕。
支持事件回調:按鈕矩陣支持綁定事件回調,用戶可以在按鈕被點擊時執行特定的操作。
支持按鈕樣式設置:每個按鈕的樣式可以通過 LVGL 的樣式機制進行靈活定制,例如字體、顏色、邊框、背景等。
1.2 基本結構與工作原理
lv_btnmatrix 是由一組按鈕構成的矩陣,其中每個按鈕都可以被單獨配置和控制。按鈕矩陣在實際應用中表現為一組具有相同樣式和布局的按鈕,可以通過行和列來定義按鈕的位置。
1.3 應用場景
虛擬鍵盤:創建數字鍵盤、字符鍵盤等輸入設備。
控制面板:用于展示一組操作按鈕,如家電控制面板。
選擇菜單:實現多選項的選擇界面。
2 使用 lv_btnmatrix 的基本步驟:
-
創建按鈕矩陣對象: 使用 lv_btnmatrix_create 函數來創建按鈕矩陣控件。
-
設置按鈕文本:使用 lv_btnmatrix_set_map 函數來設置按鈕的文本布局,可以通過這個函數定義每個按鈕的標簽。
-
設置按鈕行為:你可以通過事件回調函數來處理按鈕的點擊事件。
2.1 創建按鈕矩陣
創建一個按鈕矩陣對象通常使用 lv_btnmatrix_create() 函數。該函數需要指定父對象,一般情況下,父對象是屏幕對象(lv_scr_act()),表示該控件將在當前顯示的屏幕上顯示。
lv_obj_t* btnm = lv_btnmatrix_create(lv_scr_act());
2.2 設置按鈕文本和布局
按鈕矩陣最核心的功能之一是設置按鈕的文本。按鈕的文本布局是通過 lv_btnmatrix_set_map() 函數進行設置的。這個函數使用一個字符串映射(類似于字符數組)來定義按鈕的文本,并且支持多行布局。
2.2.1 設置
void lv_btnmatrix_set_map(lv_obj_t * btnm, const char ** map);
btnm:按鈕矩陣對象,通常是通過 lv_btnmatrix_create() 創建的按鈕矩陣對象。
map:一個指向字符指針數組的指針,每個字符指針數組元素表示按鈕矩陣中的一行按鈕文本。每個數組元素中的文本可以通過空格分隔按鈕。
2.2.2 案例
static const char* map[] ={"1", "2", "3", "4", "5", "\n","6", "7", "8", "9", "0", "\n","ok", "cancel", ""};lv_btnmatrix_set_map(btnm, map);
2.3 設置顏色和位置
static lv_style_t style;
lv_style_init(&style);
lv_style_set_bg_color(&style, lv_color_hex(0x003366)); // 背景色:深藍色
lv_style_set_border_color(&style, lv_color_hex(0xffffff)); // 邊框顏色:白色
lv_style_set_text_color(&style, lv_color_hex(0xffffff)); // 文字顏色:白色lv_obj_add_style(btnm, &style, 0); // 將樣式應用到按鈕矩陣lv_obj_set_size(btnm, 300, 150); // 設置控件尺寸
lv_obj_align(btnm, LV_ALIGN_CENTER, 0, 0); // 將按鈕矩陣居中顯示
2.4 事件處理
按鈕矩陣支持事件處理,通常用于響應用戶點擊某個按鈕時的操作。可以為按鈕矩陣添加事件回調函數,例如,當按鈕狀態變化時觸發的 LV_EVENT_VALUE_CHANGED 事件。
static void btnm_event_handler(lv_event_t* e)
{lv_obj_t* btn = lv_event_get_target(e); // 獲取被點擊的按鈕對象uint32_t id = lv_btnmatrix_get_selected_btn(btn);const char* text = lv_btnmatrix_get_btn_text(btn, id); // 獲取按鈕的文本LV_LOG("按鈕 %s 被點擊\n", text);
}lv_obj_add_event_cb(btnm, btnm_event_handler, LV_EVENT_VALUE_CHANGED, NULL);
2.5 選中或者可選
void lv_btnmatrix_set_btn_ctrl(lv_obj_t *btnm, uint16_t btn_id, lv_btnmatrix_ctrl_t ctrl);
lv_btnmatrix_set_btn_ctrl(btnm, 10, LV_BTNMATRIX_CTRL_CHECKABLE); // ok 可以選中
lv_btnmatrix_set_btn_ctrl(btnm, 11, LV_BTNMATRIX_CTRL_CHECKED); // cancel 選中
檢查哪個按鍵是否被按下
if (lv_btnmatrix_has_btn_ctrl(btn, 10, LV_BTNMATRIX_CTRL_CHECKED)) {LV_LOG("按鈕 %s 被點擊\n", "OK");
}
2.6 修改內部按鍵的風格
static lv_style_t style_btn;
lv_style_init(&style_btn);
lv_style_set_radius(&style_btn,10);
lv_style_set_border_width(&style_btn, 1);
lv_style_set_border_opa(&style_btn, LV_OPA_COVER);
lv_style_set_border_color(&style_btn, lv_palette_main(LV_PALETTE_RED));
lv_style_set_border_side(&style_btn, LV_BORDER_SIDE_INTERNAL);
lv_style_set_bg_color(&style_btn, lv_palette_main(LV_PALETTE_RED));
lv_style_set_text_color(&style_btn, lv_palette_main(LV_PALETTE_YELLOW));
lv_obj_add_style(btnm, &style_btn, LV_PART_ITEMS);