LittlevGL----按鍵鍵盤(矩陣)---6

目錄

目的

功能描述

原理和功能函數描述

創建按鈕矩陣

裝飾和屬性配置

按鍵的text配置

按鍵的寬度配置

按鍵的開關屬性配置

按鍵的屬性配置

按鍵的風格

其他

事件

案列代碼

結果



目的

 實現一個如虛擬鍵盤似的按鍵陣列矩陣。以方便應用在計算器,鍵盤輸入等場合。

功能描述

矩陣按鍵陣列實際和普通的button一樣。只不過將多個button放在一起顯示。稍微差異的是,此陣列是一個大對象,用戶在創建和使用時,可以看作一個對象,組狀的操作和配置。同時用戶可以將此陣列看作一個數組,用戶可以通過索引號獲取陣列中的各個按鍵,查詢各個按鍵的狀態和屬性、風格。

原理和功能函數描述

對於一個鍵盤而言,用戶實現的過程是需要創建此鍵盤陣列,然後修改鍵盤的各個按鈕的風格,如具體某個按鍵寬度,是否爲開關功能(詳細見button一章),是否單次按下事件中只有一個按鈕有效等。然後配置其事件回調函數,實現事件響應的各個對應功能。

創建按鈕矩陣

 一個按鈕矩陣創建很簡單,和其他的模塊對象一樣,僅僅一個函數既能實現。 

lv_obj_t *lv_btnm_create(lv_obj_t *par, constlv_obj_t *copy)
par:其父類(父窗口);
copy:參考的對象,用於初始化拷貝複製,一般NULL表示默認;

裝飾和屬性配置

按鈕陣列被創建後,需要對陣列做些修飾。陣列的每個button需要配置對應的text,同時各個button的大小寬度可以做適當的調整。

  • 按鍵的text配置

void lv_btnm_set_map(constlv_obj_t *btnm, const char *map[])
btnm:按鍵陣列
map:要配置陣列的text數組的首地址

const char **lv_btnm_get_map_array(constlv_obj_t *btnm)//獲取map

用戶可以採用const char * map[] = {"btn1", "btn2", "btn3", ""}的方式給要創建的隊列一一配置text,如果需要多行的陣列,則可以採用"\n"來換行,如{"btn1", "btn2", "\n", "btn3", ""},則會產生兩行,首行爲btn1和btn2,第二行爲btn3.

  • 按鍵的寬度配置

void lv_btnm_set_btn_width(constlv_obj_t *btnm, uint16_t btn_id, uint8_t width)
btnm:按鍵陣列
id:陣列中要被操作按鈕的索引號;
width:配置其寬度
  • 按鍵的開關屬性配置

void lv_btnm_set_one_toggle(lv_obj_t *btnm, bool one_toggle)
btnm:被操作的陣列;
one_toggle:true,開啓,false關閉
  • 按鍵的屬性配置

按鍵的寬度、開關屬性、是否隱藏、是否有多擊功能、是否有效、是否取相反的操作(即按鈕高亮時爲釋放,按鈕norml時爲正常)。其屬性如下:

LV_BTNM_CTRL_HIDDEN make a button hidden

LV_BTNM_CTRL_NO_REPEAT disable repeating when the button is long pressed

LV_BTNM_CTRL_INACTIVE make a button inactive

LV_BTNM_CTRL_TGL_ENABLE enable toggling of a button

LV_BTNM_CTRL_TGL_STATE set the toggle state

LV_BTNM_CTRL_CLICK_TRIG if 0 the button will react on press, if 1 will react on release
  • 用戶可以採用和text一樣的方式,採用一個數組,每個數組配置一組屬性,配置對應index的按鈕屬性。如ctrl_map[0] = width | LV_BTNM_CTRL_NO_REPEAT |  LV_BTNM_CTRL_TGL_ENABLE配置的是按鈕0的寬度、不可重擊,開關屬性。

具體函數如下:

void lv_btnm_set_ctrl_map(constlv_obj_t *btnm, constlv_btnm_ctrl_t ctrl_map[])//設置各個按鍵的屬性

void lv_btnm_set_btn_ctrl(constlv_obj_t *btnm, uint16_t btn_id, lv_btnm_ctrl_t ctrl)//設置對應ID索引按鈕的屬性
void lv_btnm_clear_btn_ctrl(constlv_obj_t *btnm, uint16_t btn_id, lv_btnm_ctrl_t ctrl)

void lv_btnm_set_btn_ctrl_all(lv_obj_t *btnm, lv_btnm_ctrl_t ctrl)//所有按鈕屬性一樣
void lv_btnm_clear_btn_ctrl_all(lv_obj_t *btnm, lv_btnm_ctrl_t ctrl)


bool lv_btnm_get_btn_ctrl(lv_obj_t *btnm, uint16_t btn_id, lv_btnm_ctrl_t ctrl)//獲取id的屬性是否使能,true,disabled,false:enable
  • 按鍵的風格

      void lv_btnm_set_style(lv_obj_t *btnmlv_btnm_style_t typeconst lv_style_t *style)

       const lv_style_t *lv_btnm_get_style(constlv_obj_t *btnmlv_btnm_style_ttype)

 

  • 其他

void lv_btnm_set_pressed(constlv_obj_t *btnm, uint16_t id)//id按鍵爲按下狀態
uint16_t lv_btnm_get_pressed_btn(constlv_obj_t *btnm)//獲取按下的按鍵id

const char *lv_btnm_get_btn_text(constlv_obj_t *btnm, uint16_t btn_id)//獲取id的text
const char *lv_btnm_get_active_btn_text(constlv_obj_t *btnm)//最後一次操作的id的text

uint16_t lv_btnm_get_active_btn(constlv_obj_t *btnm)//最新一次被操作的按鍵id;


事件

當按下時,會產生一個LV_EVENT_VALUE_CHANGED的事件信號,具體操作通button按鈕。

案列代碼

#include "ljy_buttonm.h"

#include "lvgl/lvgl.h"
#include <stdio.h>


static void ButtonMCb(lv_obj_t * obj, lv_event_t event)
{
    if(event == LV_EVENT_VALUE_CHANGED) {//按鍵發生動作
        const char * txt = lv_btnm_get_active_btn_text(obj);//獲取最後一次動作的按鍵文本

        printf("%s was pressed\n", txt);
    }
}


static const char * btnm_map[] = {"1", "2", "3", "4", "5", "\n",
                                  "6", "7", "8", "9", "0", "\n",
                                  "Action1", "Action2", ""};

void DrawButtonM(void)
{
    lv_obj_t * btnm1 = lv_btnm_create(lv_scr_act(), NULL);//創建按鍵陣列
    lv_btnm_set_map(btnm1, btnm_map);//配置text
    lv_btnm_set_btn_width(btnm1, 10, 2);        //配置按鈕第bitnm_[10]對應的action1的寬度爲2倍的action2
    lv_obj_align(btnm1, NULL, LV_ALIGN_CENTER, 0, 0);//配置爲中心對稱
    lv_obj_set_event_cb(btnm1, ButtonMCb);//配置事件

 

結果

當按下時,打印對應按鍵text。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章