概述
在 LVGL 中,用戶界面的基本構(gòu)建塊是對(duì)象,也稱為小部件(widget)。本文主要是介紹LVGL的對(duì)象模塊。
LVGL基礎(chǔ)知識(shí)之對(duì)象
對(duì)象(Objects)
在 LVGL 中,用戶界面的基本構(gòu)建塊是對(duì)象,也稱為小部件(widget)。例如,按鈕,標(biāo)簽,圖像,列表,圖表或文本區(qū)域。
查看 LVGL所有的對(duì)象類型(widget) 。
對(duì)象的屬性(Attributes)
對(duì)象的基本屬性
所有對(duì)象類型都共享一些基本屬性:
Position (位置)
Size (尺寸)
Parent (父母)
Drag enable (拖動(dòng)啟用)
Click enable (單擊啟用)
position (位置)
等等
我們可以使用 lv_obj_set _.。。 和 lv_obj_get _.。。 等前綴的函數(shù)設(shè)置或者獲取這些屬性。例如:
/* 設(shè)置基礎(chǔ)對(duì)象的屬性 */
lv_obj_set_size(btn1, 100, 50); /* 設(shè)置按鍵的大小 */
lv_obj_set_pos(btn1, 20,30); /* 設(shè)置按鍵的位置 */
對(duì)象的特殊屬性
有些對(duì)象類型也具有特殊的屬性。例如,滑塊具有
Min. max. values (最小最大值)
Current value (當(dāng)前值)
Custom styles (自定義樣式)
對(duì)于這些屬性,每種對(duì)象類型都有唯一的 API 函數(shù)。例如一個(gè)滑塊的 API 調(diào)用過(guò)程:
/* 設(shè)置滑塊的特殊屬性 */
lv_slider_set_range(slider1, 0, 100); /* 設(shè)置滑塊的最小值和最大值 */
lv_slider_set_value(slider1, 40, LV_ANIM_ON); /* 設(shè)置當(dāng)前值(屏幕坐標(biāo)系位置) */
lv_slider_set_action(slider1, my_action); /* 設(shè)置回調(diào)函數(shù) */
要查看 API 的實(shí)現(xiàn)代碼,可以檢查相應(yīng)的頭文件(例如滑塊對(duì)象的頭文件 lv_objx/lv_slider.h)
對(duì)象的工作機(jī)制
親子結(jié)構(gòu)
父對(duì)象可以作為其子對(duì)象的容器。每個(gè)對(duì)象只能一個(gè)父對(duì)象(屏幕除外),但是一個(gè)父對(duì)象可以有無(wú)限多個(gè)子對(duì)象。父對(duì)象的類型沒(méi)有限制,但是有特殊的父對(duì)象(例如,按鈕)和特殊的子對(duì)象(例如,標(biāo)簽)。
追隨原則
如果更改了父對(duì)象的位置,則子對(duì)象將與父對(duì)象一起移動(dòng),并且子對(duì)象的位置都保持相對(duì)于父對(duì)象位置不變。例如,坐標(biāo) (0,0) 表示子對(duì)象將獨(dú)立于父對(duì)象的位置保留在父對(duì)象的左上角,代碼:
一個(gè)父子對(duì)象
lv_obj_t * par = lv_obj_create(lv_scr_act(), NULL); /* 在當(dāng)前屏幕中創(chuàng)建一個(gè)對(duì)象 */
lv_obj_set_size(par, 100, 80); /* 設(shè)置對(duì)象的大小 */
lv_obj_t * obj1 = lv_obj_create(par, NULL); /* 基于前面創(chuàng)建的對(duì)象(par)創(chuàng)建一個(gè)子對(duì)象(obj1),之前的對(duì)像成為父對(duì)象 */
lv_obj_set_pos(obj1, 10, 10); /* 設(shè)置子對(duì)象的位置 */
當(dāng)我們修改父對(duì)象的位置,子對(duì)象也會(huì)一起移動(dòng),以保持和父對(duì)象的相對(duì)位置不變:
子對(duì)象跟隨父對(duì)象
lv_obj_set_pos(par, 50, 50); /* 移動(dòng)父對(duì)象,子對(duì)象也會(huì)跟著移動(dòng),以保持相對(duì)位置不變 */
子對(duì)象僅在父對(duì)象的范圍內(nèi)可見(jiàn)
如果子對(duì)象的部分或全部不在其父級(jí)之內(nèi),則超出父對(duì)象的部分將不可見(jiàn)。
子對(duì)象超出父對(duì)象的部分不可見(jiàn)
lv_obj_set_x(obj1, -30); /* 將子對(duì)象移出一部分到從父對(duì)象的范圍內(nèi)之外 */
創(chuàng)建-刪除對(duì)象
在LVGL中,可以在運(yùn)行時(shí)動(dòng)態(tài)地創(chuàng)建和刪除對(duì)象。這意味著僅當(dāng)前創(chuàng)建的對(duì)象需要消耗RAM。例如,如果需要圖表,我們可以在需要時(shí)創(chuàng)建它,并在不可見(jiàn)或不需要時(shí)將其刪除。
每個(gè)對(duì)象類型都有各自的創(chuàng)建函數(shù)。它需要兩個(gè)參數(shù):
指向父對(duì)象的指針。創(chuàng)建屏幕時(shí)以 NULL 作為父級(jí)。
用于復(fù)制具有相同類型的對(duì)象的指針(可選)。如果不行進(jìn)行復(fù)制操作為 NULL。
使用 lv_obj_t 指針作為句柄在 C 代碼中引用所有對(duì)象。以后可以使用該指針設(shè)置或獲取對(duì)象的屬性。
創(chuàng)建函數(shù)如下所示:
lv_obj_t * lv_ 《type》_create(lv_obj_t * parent, lv_obj_t * copy);
所有對(duì)象類型都有一個(gè)通用的刪除功能。它刪除對(duì)象及其所有子對(duì)象。
void lv_obj_del(lv_obj_t * obj);
lv_obj_del 將立即刪除該對(duì)象。如果出于某種原因不能立即刪除該對(duì)象,則可以使用 lv_obj_del_async(obj) ,例如,如果要?jiǎng)h除子對(duì)象的 LV_EVENT_DELETE 信號(hào)中對(duì)象的父對(duì)象,這很有用。
我們可以使用 lv_obj_clean 刪除對(duì)象的所有子對(duì)象(但不會(huì)刪除對(duì)象本身):
void lv_obj_clean(lv_obj_t * obj);
屏幕對(duì)象
創(chuàng)建屏幕對(duì)象
屏幕是沒(méi)有父對(duì)象的特殊對(duì)象。應(yīng)該像這樣創(chuàng)建它們:
lv_obj_t * scr1 = lv_obj_create(NULL, NULL);
可以使用任何對(duì)象類型創(chuàng)建屏幕。例如:創(chuàng)建墻紙的基礎(chǔ)對(duì)象或圖像。
獲取活動(dòng)屏幕
這始終是每個(gè)顯示屏上的活動(dòng)屏幕。默認(rèn)情況下,該庫(kù)為每個(gè)顯示創(chuàng)建并加載 “基礎(chǔ)對(duì)象” 作為屏幕。
要獲取當(dāng)前活動(dòng)的屏幕使用函數(shù) lv_scr_act()
載入屏幕
調(diào)用函數(shù) lv_scr_load(scr1) 加載屏幕。
加載屏幕動(dòng)畫(huà)
我們可以調(diào)用函數(shù):lv_scr_load_anim(scr, transition_type, time, delay, auto_del) 加載屏幕動(dòng)畫(huà)。參數(shù) transition_type 是動(dòng)畫(huà)過(guò)渡類型,該參數(shù)可設(shè)為:
LV_SCR_LOAD_ANIM_NONE 延遲x毫秒后立即切換
LV_SCR_LOAD_ANIM_OVER_LEFT/RIGHT/TOP/BOTTOM 將新屏幕移到給定方向上
LV_SCR_LOAD_ANIM_MOVE_LEFT/RIGHT/TOP/BOTTOM 將舊屏幕和新屏幕都移至給定方向
LV_SCR_LOAD_ANIM_FADE_ON 使新屏幕淡出舊屏幕
將 auto_del 設(shè)置為 true 會(huì)在動(dòng)畫(huà)結(jié)束時(shí)自動(dòng)刪除舊屏幕。
在延遲時(shí)間之后開(kāi)始動(dòng)畫(huà)播放時(shí),新屏幕將變?yōu)榛顒?dòng)狀態(tài)(由 lv_scr_act() 返回)。
處理多個(gè)顯示
屏幕在當(dāng)前選擇的默認(rèn)屏幕上創(chuàng)建。默認(rèn)顯示設(shè)備使用 lv_disp_drv_register 注冊(cè)的最后一個(gè)屏幕作為顯示,或者可以使用 lv_disp_set_default(disp) 顯式選擇新的默認(rèn)顯示屏幕。
lv_scr_act() , lv_scr_load() 和 lv_scr_load_anim() 將會(huì)在默認(rèn)的屏幕上操作。
零件-Parts
widget 可以包含多個(gè) Parts 。例如,按鈕僅具有主要部分,而滑塊則由背景,指示器和旋鈕組成。
Parts 名稱的構(gòu)造類似于 LV_ + 《TYPE》 _PART_ 《NAME》 。比如 LV_BTN_PART_MAIN 、 LV_SLIDER_PART_KNOB 。通常在將樣式添加到對(duì)象時(shí)使用 Parts。使用 Parts 可以將不同的樣式分配給對(duì)象的不同 Parts 。
狀態(tài)-States
對(duì)象可以處于以下?tīng)顟B(tài)的組合:
LV_STATE_DEFAULT 默認(rèn)或正常狀態(tài)
LV_STATE_CHECKED 選中或點(diǎn)擊
LV_STATE_FOCUSED 通過(guò)鍵盤(pán)或編碼器聚焦或通過(guò)觸摸板/鼠標(biāo)單擊
LV_STATE_EDITED 由編碼器編輯
LV_STATE_HOVERED 鼠標(biāo)懸停(現(xiàn)在還不支持)
LV_STATE_PRESSED 按下
LV_STATE_DISABLED 禁用或無(wú)效
當(dāng)用戶按下,釋放,聚焦等對(duì)象時(shí),狀態(tài)通常由庫(kù)自動(dòng)檢測(cè)更改。當(dāng)然狀態(tài)也可以手動(dòng)檢測(cè)更改。要完全覆蓋當(dāng)前狀態(tài),調(diào)用 lv_obj_set_state(obj, part, LV_STATE.。。) 要設(shè)置或清除某個(gè)狀態(tài)(但不更改其他狀態(tài)),調(diào)用 lv_obj_add/clear_state(obj, part, LV_STATE_.。。) 可以組合使用狀態(tài)值。例如: lv_obj_set_state(obj, part, LV_STATE_PRESSED | LV_PRESSED_CHECKED) 。
以上就關(guān)于在 LVGL 中,用戶界面的基本構(gòu)建塊之對(duì)象的介紹。
責(zé)任編輯:lq6
-
對(duì)象模
+關(guān)注
關(guān)注
0文章
1瀏覽量
6102 -
LVGL
+關(guān)注
關(guān)注
1文章
107瀏覽量
3697
原文標(biāo)題:LVGL基礎(chǔ)知識(shí)(一)
文章出處:【微信號(hào):gh_ed4f95bde4df,微信公眾號(hào):華芯微特32位MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
簡(jiǎn)析Modbus與MQTT的區(qū)別
功率器件熱設(shè)計(jì)基礎(chǔ)知識(shí)
儲(chǔ)能科普之電池基礎(chǔ)知識(shí)

PCB繪制基礎(chǔ)知識(shí)

TWL6030氣體監(jiān)測(cè)基礎(chǔ)知識(shí)

EMI之傳導(dǎo)
Verilog HDL的基礎(chǔ)知識(shí)

負(fù)載開(kāi)關(guān)基礎(chǔ)知識(shí)

全新的半導(dǎo)體基礎(chǔ)知識(shí)

超聲波傳感基礎(chǔ)知識(shí)

了解藍(lán)牙模塊串口通訊基礎(chǔ)知識(shí)

評(píng)論