-
目的
學習LittlevGL的“按鍵”模型使用方法。
-
功能描述
對於button,在littlevGL中有兩大類型。一個是作爲按鍵,一個是作爲開關。
按鍵,即像普通的鍵盤或者遙控器之類的按鈕一樣,按下了,手鬆開後,此按鍵會恢復出釋放的狀態,表示一次單擊。
開關,相當於一些撥碼開關,或者一些電源的一些按鈕,按下後,保持按下的狀態,再按一次時,恢復釋放的狀態。
默認情況下,button就是key功能,只有使能了開關功能,才能做開關作用。
開關可以綁定一些事件。即當開關按下後,會立刻產生一些信號,然後喚醒對應的事件函數,在此函數中,根據具體事件來響應對應的處理。如同實際gpu的io中斷一樣。
按鍵的5種狀態:按下和釋放,按下釋放動態,未使能。
- LV_BTN_STATE_REL Released state
- LV_BTN_STATE_PR Pressed state
- LV_BTN_STATE_TGL_REL Toggled released state
- LV_BTN_STATE_TGL_PR Toggled pressed state
- LV_BTN_STATE_INA Inactive state
用戶可以採用
lv_btn_set_state(btn, LV_BTN_STATE_TGL_REL)設置按鈕的狀態
用戶可以通過設計style的方式控制按鍵的風格,也可以不用設計,採用默認值即可。具體見案例和後續相關函數介紹。
主要功能函數描述
-
按鍵創建
lv_obj_t *lv_btn_create(lv_obj_t *par, constlv_obj_t *copy)
同其他部件對象一樣:
par:爲當前要創建按鈕的父類,即父窗口,按鍵將顯示的地方;
copy:模擬的對象,即要創建出的btn可以複製已用的按鍵特性,如果爲NULL,則是默認繼承父類部分屬性;
-
按鍵的功能屬性設置和獲取以及開關狀態配置
void lv_btn_set_toggle(lv_obj_t *btn, bool tgl)//設置
前文已述,按鍵有兩中功能,一個就是按鍵,一個是開關。具體見前文。默認情況下,按鍵就是按鍵功能。
btn:要配置的按鍵;
tgl:如果爲true,則是開關功能,如果是false,則是按鍵功能。
bool lv_btn_get_toggle(constlv_obj_t *btn)//獲取配置
void lv_btn_toggle(lv_obj_t *btn)//反轉一次,即當使能toggle時,每調用一次此函數,按鍵狀態會發生翻轉一次
-
按鍵的風格設置和獲取
void lv_btn_set_style(lv_obj_t *btn, lv_btn_style_ttype, const lv_style_t *style)
這裏不再累述,前面章節已經有所描述。
中間的變量爲配置那種state下的風格,即是按下時的按鈕風格還是釋放時,還是動態時。
const lv_style_t *lv_btn_get_style(constlv_obj_t *btn, lv_btn_style_ttype)//獲取
-
按鍵的內部框架和對子元素設置和獲取
static void lv_btn_set_layout(lv_obj_t *btn, lv_layout_tlayout)//設置其內部框架
按鍵內部元素的顯示框架
staticlv_layout_tlv_btn_get_layout(constlv_obj_t *btn)
static void lv_btn_set_fit4(lv_obj_t *btn, lv_fit_tleft, lv_fit_tright, lv_fit_ttop, lv_fit_tbottom)
爲按鍵4個方向的改變規則,這種改變是根據內部元素來自動完成
static void lv_btn_set_fit2(lv_obj_t *btn, lv_fit_thor, lv_fit_tver)
爲水平和垂直兩個
static void lv_btn_set_fit(lv_obj_t *btn, lv_fit_tfit)
爲4個方向一個規則
staticlv_fit_tlv_btn_get_fit_left(constlv_obj_t *btn)
staticlv_fit_tlv_btn_get_fit_right(constlv_obj_t *btn)
staticlv_fit_tlv_btn_get_fit_top(constlv_obj_t *btn)
staticlv_fit_tlv_btn_get_fit_bottom(constlv_obj_t *btn)
案例以及設計源碼
設計兩個按鍵,一個實現按鍵操作,一個實現開關反轉操作。
-
設計的流程
創建一個按鍵----->是否使能開關屬性功能-------->配置其顯示標籤-------->配置其風格------->設置按鍵顯示位置大小-------->設置其回調函數。
-
設計代碼
創建了ljy_button.h和ljy_button.c兩個文件,並在main函數調用DrawButton。具體怎麼使用見前面章節。
#include "ljy_button.h"
#include "lvgl/lvgl.h"
#include <stdio.h>
static lv_obj_t * label2;
static void BttonEventCb(lv_obj_t * obj, lv_event_t event)
{
if(event == LV_EVENT_CLICKED) {//點擊事件
printf("Clicked\n");
}
else if(event == LV_EVENT_VALUE_CHANGED) {//開關切換事件
printf("Toggled\n");
if(lv_btn_get_state(obj) == LV_BTN_STATE_REL){
lv_label_set_text(label2, "OFF");
}else{
lv_label_set_text(label2, "ON");
}
}
}
void DrawButton()
{
//1. 按鍵1
lv_obj_t * btn1 = lv_btn_create(lv_scr_act(), NULL);//在當前screen對象上創建btn1
lv_obj_set_event_cb(btn1, BttonEventCb);//設置當前按鍵的 事件回調函數
lv_obj_align(btn1, NULL, LV_ALIGN_CENTER, 0, -40);//配置btn1在其父類(screen)中顯示位置
lv_obj_t * label1;//創建按鍵1上面顯示的label1
label1 = lv_label_create(btn1, NULL);//在父類btn1中創建label1實體
lv_label_set_text(label1, "Button");//配置label的text
//2. 按鍵2
lv_obj_t * btn2 = lv_btn_create(lv_scr_act(), NULL);
lv_obj_set_event_cb(btn2, BttonEventCb);
lv_obj_align(btn2, NULL, LV_ALIGN_CENTER, 0, 40);
lv_btn_set_toggle(btn2, true); //使能其爲開關按鈕,非按鍵按鈕,默認爲釋放狀態
lv_btn_toggle(btn2); //變爲按下狀態,每調用一次此函數,狀態state會發生反轉
lv_btn_set_fit2(btn2, LV_FIT_NONE, LV_FIT_TIGHT);//配置btn的自適應大小,其子對象都適應其高度
label2 = lv_label_create(btn2, NULL);
lv_label_set_text(label2, "Toggled");
}
結論
按下button
按下開關