LVGL對象(Objects)
在 LVGL(Light and Versatile Graphics Library)中,對象(Object)是 UI 的基本構(gòu)建單元,幾乎所有控件(按鈕、標簽、滑塊等)都是從基礎(chǔ)對象派生出來的。理解 LVGL 中對象的結(jié)構(gòu)、創(chuàng)建與操作,是掌握 LVGL 的核心之一。
?? 一、LVGL 中的對象(lv_obj)
LVGL 中的對象是從 lv_obj_t
類型派生的,所有控件本質(zhì)上都是 lv_obj_t
的一個子類型。
?? lv_obj_t 的作用
lv_obj_t
就像一個“GUI 元素基類”,提供了:
- 樣式(Style)
- 坐標(位置與大?。?/li>
- 子對象容器(父子層級結(jié)構(gòu))
- 信號與事件處理機制(如回調(diào)函數(shù))
- 渲染與重繪管理
?? 二、對象的分類結(jié)構(gòu)(類比繼承)
lv_obj_t ├── lv_btn_t 按鈕 ├── lv_label_t 標簽 ├── lv_slider_t 滑塊 ├── lv_img_t 圖片 ├── lv_canvas_t 畫布 ├── lv_list_t 列表 └── lv_chart_t 圖表
每個控件最終都繼承自 lv_obj_t
,但通過“類型封裝 + 宏 + 函數(shù)接口”實現(xiàn)“偽面向?qū)ο蟆憋L格。
?? 三、對象的創(chuàng)建與銷毀
? 創(chuàng)建對象
lv_obj_t * obj = lv_obj_create(parent); // 創(chuàng)建一個基礎(chǔ)對象
所有對象必須掛載在父對象上,最上層的是屏幕(
lv_scr_act()
)
示例:創(chuàng)建一個按鈕
lv_obj_t * btn = lv_btn_create(lv_scr_act()); // 在當前活動屏幕創(chuàng)建按鈕 lv_obj_set_size(btn, 100, 50); lv_obj_align(btn, LV_ALIGN_CENTER, 0, 0);
? 刪除對象
lv_obj_del(obj); // 刪除對象及其所有子對象
?? 四、對象的屬性設(shè)置(常用函數(shù))
設(shè)置大小 |
|
設(shè)置位置 |
|
居中對齊 |
|
設(shè)置背景顏色 |
|
設(shè)置圓角 |
|
設(shè)置邊框?qū)挾?/p> |
|
?? 五、對象的層級與父子關(guān)系
LVGL 中每個對象都有一個 父對象(Parent),可以嵌套形成 樹狀結(jié)構(gòu)。
lv_scr_act() └── 容器 container ├── 按鈕 button1 └── 標簽 label1
通過父子關(guān)系自動:
- 控制顯示區(qū)域裁剪
- 執(zhí)行坐標變換
- 執(zhí)行事件冒泡(例如點擊穿透)
?? 六、事件機制(事件回調(diào))
LVGL 對象支持事件機制,例如點擊、拖動、滾動等,可以注冊回調(diào)函數(shù)處理:
static void my_event_cb(lv_event_t * e) { lv_event_code_t code = lv_event_get_code(e); lv_obj_t * obj = lv_event_get_target(e); if(code == LV_EVENT_CLICKED) { printf("Button clicked!\n"); } } lv_obj_add_event_cb(btn, my_event_cb, LV_EVENT_ALL, NULL);
事件枚舉值示例:
LV_EVENT_CLICKED
:點擊LV_EVENT_PRESSED
:按下LV_EVENT_RELEASED
:松開LV_EVENT_DRAW_MAIN
:繪制時觸發(fā)
?? 七、樣式系統(tǒng)(Style)
對象通過樣式系統(tǒng)控制外觀,包括顏色、字體、邊框、圓角等:
static lv_style_t style; lv_style_init(&style); lv_style_set_bg_color(&style, lv_color_hex(0xff0000)); lv_obj_add_style(obj, &style, LV_PART_MAIN);
支持多個部件(Part)和狀態(tài)(State):
LV_PART_MAIN
:主區(qū)域LV_STATE_PRESSED
:按下狀態(tài)LV_STATE_DISABLED
:禁用狀態(tài)
?? 八、容器對象(布局)
lv_obj_create()
可以作為通用容器- 可設(shè)置布局和子對象自動排布
示例:垂直布局容器
lv_obj_t * cont = lv_obj_create(lv_scr_act()); lv_obj_set_layout(cont, LV_LAYOUT_COLUMN_MID); // 子對象垂直居中排列
?? 總結(jié)(關(guān)鍵詞串講)
基類 |
|
創(chuàng)建 |
等 |
屬性設(shè)置 |
|
父子關(guān)系 |
、
|
樣式系統(tǒng) |
、
|
事件回調(diào) |
|
層級結(jié)構(gòu) | 樹狀結(jié)構(gòu)管理 UI |
自動布局 |
|
本專欄專為嵌入式開發(fā)者打造,帶你從零開始系統(tǒng)掌握 LVGL 圖形庫。內(nèi)容涵蓋源碼獲取、目錄結(jié)構(gòu)解析、控件使用、事件系統(tǒng)、主題樣式、屏幕適配到平臺移植。每一節(jié)圖文并茂,配套實戰(zhàn)項目與源碼講解,真正做到手把手教學,適合STM32/ESP32 等平臺用戶入門與進階。跟著學,一步到位玩轉(zhuǎn) LVGL!