LVGL中的事件

文章目錄

    • 🧱 一、什么是 LVGL 事件?
    • 🎯 二、事件回調的注冊
      • 參數解釋:
      • 示例:
    • 📚 三、常見事件類型(`lv_event_code_t`)
      • ? 1. 輸入類事件(用戶交互)
      • ? 2. 組件狀態類事件
      • ? 3. 生命周期類事件
      • ? 4. 滾動與拖動類事件
    • ?? 四、事件回調函數結構
    • 🧪 五、完整示例:按鈕點擊顯示消息
    • 🧠 六、LVGL 事件的高級用法
      • ? 一次處理多個事件
      • ? 使用用戶數據傳參
    • 📌 總結


LVGL(Light and Versatile Graphics Library) 中,事件系統 是控件間交互的核心機制。它讓你能響應按鈕點擊、滑動、值變化、焦點獲取等各種行為。

我們來系統性地講解:


🧱 一、什么是 LVGL 事件?

事件(lv_event_t)是 LVGL 中 控件生命周期或用戶操作引發的動作通知

控件通過事件系統通知外部“某件事發生了”,我們通過注冊回調函數處理這些事件,完成邏輯響應。

比如:

  • 按鈕被點擊(點擊事件)
  • 滾動條滾動(值改變事件)
  • 對象被刪除(清理事件)

🎯 二、事件回調的注冊

事件處理函數的注冊使用 lv_obj_add_event_cb() 函數:

lv_obj_add_event_cb(obj, my_event_cb, LV_EVENT_CLICKED, user_data);

參數解釋:

  • obj:要監聽的對象
  • my_event_cb:事件回調函數(函數指針)
  • LV_EVENT_CLICKED:要監聽的事件類型
  • user_data:用戶自定義數據指針,會傳給回調(可為 NULL

示例:

void my_event_cb(lv_event_t * e)
{lv_event_code_t code = lv_event_get_code(e);lv_obj_t * target = lv_event_get_target(e);if (code == LV_EVENT_CLICKED) {printf("Button clicked!\n");}
}

📚 三、常見事件類型(lv_event_code_t

LVGL 的事件可以分為幾類:

? 1. 輸入類事件(用戶交互)

事件宏描述
LV_EVENT_PRESSED用戶按下對象(觸摸/點擊)
LV_EVENT_PRESSING按住過程中
LV_EVENT_PRESS_LOST按住但滑出控件范圍
LV_EVENT_RELEASED用戶釋放了對象
LV_EVENT_CLICKED完整的一次點擊(按下+釋放)
LV_EVENT_LONG_PRESSED長按觸發
LV_EVENT_LONG_PRESSED_REPEAT長按后重復觸發

? 2. 組件狀態類事件

事件宏描述
LV_EVENT_FOCUSED控件獲取焦點
LV_EVENT_DEFOCUSED控件失去焦點
LV_EVENT_VALUE_CHANGED控件的值發生變化(如 slider)

? 3. 生命周期類事件

事件宏描述
LV_EVENT_DRAW_MAIN_BEGIN/END繪制開始/結束(自定義繪制用)
LV_EVENT_DELETE控件即將被刪除
LV_EVENT_CHILD_CHANGED子對象添加/刪除

? 4. 滾動與拖動類事件

事件宏描述
LV_EVENT_SCROLL_BEGIN開始滾動
LV_EVENT_SCROLL_END滾動停止
LV_EVENT_SCROLL正在滾動
LV_EVENT_SCROLL_DRAW_BEGIN/END滾動繪制開始/結束

?? 四、事件回調函數結構

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);      // 獲取觸發對象void * user_data = lv_event_get_user_data(e); // 獲取用戶數據if(code == LV_EVENT_CLICKED) {printf("Clicked: %s\n", lv_obj_get_style_text(obj, LV_PART_MAIN));}
}

🧪 五、完整示例:按鈕點擊顯示消息

void btn_event_cb(lv_event_t * e)
{lv_event_code_t code = lv_event_get_code(e);lv_obj_t * btn = lv_event_get_target(e);if(code == LV_EVENT_CLICKED) {printf("按鈕被點擊了!\n");lv_obj_t * label = lv_obj_get_child(btn, 0);lv_label_set_text(label, "已點擊!");}
}void create_btn()
{lv_obj_t * btn = lv_btn_create(lv_scr_act());lv_obj_center(btn);lv_obj_t * label = lv_label_create(btn);lv_label_set_text(label, "點我");lv_obj_center(label);lv_obj_add_event_cb(btn, btn_event_cb, LV_EVENT_CLICKED, NULL);
}

🧠 六、LVGL 事件的高級用法

? 一次處理多個事件

lv_obj_add_event_cb(obj, my_cb, LV_EVENT_ALL, NULL);

然后在 my_cb 里判斷 code 即可。


? 使用用戶數據傳參

struct {int count;const char * msg;
} my_data = {0, "點擊次數"};lv_obj_add_event_cb(obj, my_cb, LV_EVENT_CLICKED, &my_data);

在回調中獲取:

void * data = lv_event_get_user_data(e);

📌 總結

LVGL 的事件系統 = 控件行為通知機制:

  • lv_obj_add_event_cb() 注冊回調;
  • lv_event_t 是事件容器;
  • lv_event_get_code() 獲取事件類型;
  • 支持交互、生命周期、繪圖等多個事件維度;
  • 能通過用戶數據傳遞自定義信息。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/905040.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/905040.shtml
英文地址,請注明出處:http://en.pswp.cn/news/905040.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

警惕C#版本差異多線程中的foreach陷阱

警惕C#版本差異多線程中的foreach陷阱? 同樣的代碼,不同的結果閉包捕獲的“時間差”問題繞過閉包陷阱的三種方法Lambda立即捕獲(代碼簡潔)顯式傳遞參數(兼容性最佳)使用Parallel.ForEach(官方推薦)注意事項:版本兼容性指南警惕多線程中的foreach陷阱:C#版本差異引發的…

mac u盤重裝mac10.15Catalina系統

我的電腦提mac2017的air 重裝過程 (文件夾中間有空格時為 Install\ macOS\ Catalina 才行) (有需要的,最好做一下備份,有些東西可以及時找到配置和文件之類的, u盤制作是在mac電腦上操作的) 一、先下載系統鏡像文件或自行到官方…

說說es配置項的動態靜態之分和集群配置更新API

這天因為某件工作來到了es官網某個參數配置相關的頁面,注意到了下圖圓圈里的“Dynamic”: 鏈接:https://www.elastic.co/guide/en/elasticsearch/reference/8.1/modules-cluster.html#misc-cluster-settings 顯然這是對配置項的一個描述&am…

2025軟考【系統架構設計師】:兩周極限沖刺攻略(附知識點解析+答題技巧)

距離2025上半年“系統架構設計師”考試已經只剩最后兩周了,還沒有準備好的小伙伴趕緊行動起來。為了幫助大家更好的沖刺學習,特此提供一份考前沖刺攻略。本指南包括考情分析、答題技巧、注意事項三個部分,可以參考此指南進行最后的復習要領&a…

web animation API 鋒利的css動畫控制器 (更新中)

什么是web animation api 以及為什么要使用web animation api? web animation API 是web頁面中控制DOM元素動畫效果的javascript原生API。 它能夠逐個關鍵幀控制動畫效果,具有Timeline 機制?能通過javascript來實現動畫的暫停,播放&#x…

Linux基礎io知識

理解 "文件" 狹義理解 文件在磁盤里 磁盤是永久性存儲介質,因此文件在磁盤上的存儲是永久性的 磁盤是外設(即是輸出設備也是輸入設備) 磁盤上的文件 本質是對文件的所有操作,都是對外設的輸入和輸出 簡稱 IO 廣義理解…

視頻編解碼學習三之顯示器續

一、現在主流的顯示器是LCD顯示器嗎? 是的,現在主流的顯示器仍然是 LCD(液晶顯示器,Liquid Crystal Display),但它已經細分為多種技術類型,并和其他顯示技術(如OLED)形成…

[測試]并發模擬工具Apache Bench 進行AB壓力測試

下載(windows) https://www.apachelounge.com/download/ 下載后解壓,解壓后進入bin目錄,打開CMD,即可使用 命令 ab.exe -n 請求總數 -c 并發數 http://網站/ 比如ab.exe -n 1000 -c 100 http://127.0.0.1:5555/ 看不懂的話直接把結果讓AI分析…

LeetCode 熱題 100 138. 隨機鏈表的復制

LeetCode 熱題 100 | 138. 隨機鏈表的復制 大家好,今天我們來解決一道經典的鏈表問題——隨機鏈表的復制。這道題在 LeetCode 上被標記為中等難度,要求深拷貝一個帶有隨機指針的鏈表。 問題描述 給你一個長度為 n 的鏈表,每個節點包含一個額…

開源分享:TTS-Web-Vue系列:Vue3實現固定頂部與吸頂模式組件

🎯 本文是TTS-Web-Vue系列的第十三篇文章,重點介紹項目中固定頂部導航和內容區域吸頂模式的實現方案。通過這些優化,我們大幅提升了用戶在滾動頁面時的交互體驗,使關鍵操作區域始終可見,同時實現了更現代化的界面視覺效…

Docker、Docker-compose、K8s、Docker swarm之間的區別

1.Docker docker是一個運行于主流linux/windows系統上的應用容器引擎,通過docker中的鏡像(image)可以在docker中構建一個獨立的容器(container)來運行鏡像對應的服務; 例如可以通過mysql鏡像構建一個運行mysql的容器,既可以直接進入該容器命…

用瀏覽器打開pdf,如何使用劃詞翻譯?

1. 瀏覽器 | 擴展 | 獲取 Microsoft Edge 擴展 2. 搜索 “沙拉查詞” 點擊“獲取” 3. 擴展這里選擇 管理擴展 勾選 “允許訪問文件url” 注:這里一定要勾選,否則沙拉查詞無法訪問.pdf 文件!!!會出現下圖錯誤 4. 右擊…

深入解析STM32中斷機制:從原理到外部中斷實戰

知識點1【中斷的介紹】 單片機的中斷——硬件中斷 Linux操作系統的中斷——軟件中斷 中斷是指計算機運行過程中,出現某種意外情況需要主機干預,機器能自動停止正在運行的程序并轉入處理新情況的程序,處理完畢后有返回原本暫停的程序繼續運…

【入門】打印字母塔

描述 輸入行數N,打印圖形. 輸入描述 輸入只有一行&#xff0c;包括1個整數。(N<15) 輸出描述 輸出有N行. #include <bits/stdc.h> using namespace std; int main() { char t;int n,f;cin>>n;for(int i1;i<n;i){tchar(65i);for(int j1;j<n-i;j){cout…

CentOS 7.9 安裝詳解:手動分區完全指南

CentOS 7.9 安裝詳解&#xff1a;手動分區完全指南 為什么需要手動分區&#xff1f;CentOS 7.9 基本分區說明1. /boot/efi 分區2. /boot 分區3. swap 交換分區4. / (根) 分區 可選分區&#xff08;進階設置&#xff09;5. /home 分區6. /var 分區7. /tmp 分區 分區方案建議標準…

油冷式電動滾筒設計:關鍵技術解析與應用前景

引言 電動滾筒作為一種集動力傳輸、減速和驅動功能于一體的機電一體化設備&#xff0c;在輸送機械、礦山設備、食品加工等領域廣泛應用。隨著工業設備向高效化、緊湊化和智能化發展&#xff0c;傳統風冷式電動滾筒的散熱效率與負載能力已逐漸難以滿足需求。油冷式電動滾筒憑借…

Android開發-Activity附加信息

在Android應用開發中&#xff0c;除了基本的界面跳轉和數據傳遞之外&#xff0c;我們還經常需要為Activity添加一些附加信息&#xff08;Metadata&#xff09;&#xff0c;以支持更復雜的配置需求或與系統進行交互。這些附加信息可以通過<meta-data>標簽在AndroidManifes…

2025第九屆御網杯網絡安全大賽線上賽 區域賽WP (MISC和Crypto)(詳解-思路-腳本)

蕪湖~ 御網杯線上分是越來越精細 區域賽都有了 然后不過多評價 整體不算難 以下是我自己的一些思路和解析 有什么問題或者建議隨時都可以聯系我 目錄 蕪湖~ MISC #被折疊的顯影圖紙 #光隙中的寄生密鑰 #ez_xor #套娃 #easy_misc #ez_pictre Crypto #easy簽到題 …

?中繼器:網絡中的“血包”與“加時器”?

在探討網絡技術時&#xff0c;我們往往會遇到各種專業術語和設備&#xff0c;中繼器便是其中之一。然而&#xff0c;對于非技術人員或初學者來說&#xff0c;這些概念可能顯得抽象且難以理解。今天&#xff0c;我將通過一個生動的比喻——將中繼器比作網絡中的“血包”與“加時…

MySQL----高級查詢

目錄標題 ?**多表查詢的格式**?**查詢前說明**一.**使用內連接**inner join**進行多表查詢****1.介紹****2.事例** 二.**使用外連接**outer join**進行多表查詢**1.**介紹** ?多表查詢的格式 其一 select *&#xff5c;字段列表 from 表1[查詢類型] join 表名2 on 連接條件…