衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

怎樣使用LVGL中的timer對象顯示動畫呢?

冬至子 ? 來源:安德魯的設計筆記本 ? 作者:安德魯 ? 2023-08-22 11:24 ? 次閱讀

引言

設計GUI的顯示元素動起來,實際上是多張圖按照一定的節奏和變化依次刷屏實現的。LVGL在內核設計了timer對象,用于實現周期回調的功能,開發者可以在周期調用的回調函數中,修改GUI顯示內容的屬性,觸發LVGL顯示內容的刷新,然后由LVGL的例行執行程序重新刷屏,從而實現動畫效果。

LVGL中的timer對象

LVGL的后臺是通過時間片輪詢對LVGL的交互任務進行調度的。

在具體的MCU平臺上適配LVGL時,通常會使用SysTick定時器中斷服務程序調用lv_tick_inc()函數驅動LVGL內部的計數器遞增,然后在主線程中調用lv_timer_handler()函數以時間片為節點執行LVGL的日常任務(輸入事件、刷屏等操作)。從源碼上看,整個LVGL的程序框架,就是建立在定時器刻度的輪詢調度之上的,可見包含LVGL的MCU工程的頂級業務邏輯代碼如下:

lv_ui guider_ui;  
  
int main(void)  
{  
    BOARD_Init();  
    SysTick_Config(CLOCK_SYS_FREQ / 100); /* 10ms. */  
  
    lv_init();  
    lv_port_disp_init();  
    setup_ui(&guider_ui);  
    events_init(&guider_ui);  
    custom_init(&guider_ui);  
  
    while (1)  
    {  
        lv_timer_handler(); /* 執行LVGL時間片輪詢. */  
    }  
}  
  
void SysTick_Handler(void)  
{  
    lv_tick_inc(10); /* 驅動LVGL的定時器. */  
}

在LVGL中,當需要實現一些基于時間變化顯示內容的效果(動畫),可以借用LVGL內部的定時器對象來實現周期執行程序的效果。關于LVGL應用程序中使用定時器的API主要有兩個:

  • lv_timer_create()
  • lv_timer_del()

其中,使用lv_timer_create()函數創建一個定時器實例,并會向其中傳送初始化參數,指定本定時器的觸發周期觸發時執行的回調函數。而lv_timer_del()函數會回收這個定時器的資源(包括變量,以及掛在定時器任務列表中的指針),以減輕LVGL后臺調度器的負擔。

基于timer對象實現儀表走針

這里以設計一個速度表盤指針轉動的樣例,展示timer定時器對象的用法。實現原理,在定時器組件的回調函數中,會周期性地改變meter組件中speed_scale_1_ndline_0屬性的值。當改變LVGL顯示組件的任何可視化組件的屬性后,LVGL會自動刷新顯示內容,從而形成動畫效果。

在GUI Guider的編輯頁面中新建一個meter組件的對象,如圖x所示。

image.png

圖x 在GUI Guider中新建meter對象

將新建meter對象改名為meter_speed,這個名字將會在后面自定義編寫代碼時,用于引用這個meter對象實例。手工調整一下表盤的尺寸。

然后,選中主編輯區的頁面區域(對應選中當前的screen對象),再在編輯區域的右側,在事件(Events)頁面中,單擊加號,創建一個事件,編輯事件。

編輯事件的觸發方式,即在什么時機產生當前編輯的事件,常見的事件觸發方式有:Load Start(開始載入當前對象時)、Loaded(完成載入當前對象時)、Unload Start(開始從本對象切換到別處時)、Unloaded(完成從本對象切換到別處時)等,如圖x所示。每種顯示元素的對象都有各自的觸發方式,甚至還有一些顯示元素的對象沒有觸發事件可創建。

image.png

圖x 在GUI Guider中為事件編輯觸發方式

選定Trigger觸發方式后,還需要選定Target目標對象。此時,目標對象的下拉列表中會自動整理出當前整個GUI Guider工程中已經創建的有所顯示元素對象。如圖x所示。

image.png

圖x 在GUI Guider中為事件編輯目標對象

這里需要重點說明的是,觸發方式描述的當前在編輯區域中選中的對象的動作,當選定觸發方式后,本事件的標簽名稱也就自動改成了<當前對象名>_<觸發方式>。目標對象反映的是即將改變屬性的對象,對應部分可選的屬性也在事件頁面下方展示出來,可在圖形頁面中配置。當然,并不是所有的可編輯屬性都被做成了在對話框中可配置的,本例就在最后一行,選擇了執行自定義程序,在彈出的代碼編輯對話框中添加了創建定時器對象timer_meter_speed的語句。如圖x所示。

image.png

圖x 在GUI Guider中為事件編輯自定義執行的程序代碼

圖x中所示,自定義編寫C源碼,當觸發Screen的Loaded事件時,將執行圖中代碼,創建timer_meter_speed定時器對象實例。保存工程后生成代碼,對應地,可在GUI Guider工程中的./generated/event_init.c文件中看到對應生成的代碼。

#include "events_init.h"  
#include < stdio.h >  
#include "lvgl.h"  
#include "custom.h"  
  
static lv_timer_t * timer_meter_speed;  
  
void events_init(lv_ui *ui)  
{  
}  
  
static void screen_event_handler(lv_event_t *e)  
{  
 lv_event_code_t code = lv_event_get_code(e);  
 switch (code)  
 {  
 case LV_EVENT_SCREEN_LOADED:  
 {  
  timer_meter_speed = lv_timer_create(timer_meter_speed_cb, 100, &guider_ui);  
 }  
  break;  
 case LV_EVENT_SCREEN_UNLOADED:  
 {  
  lv_timer_del(timer_meter_speed);  
 }  
  break;  
 default:  
  break;  
 }  
}  
  
void events_init_screen(lv_ui *ui)  
{  
 lv_obj_add_event_cb(ui- >screen, screen_event_handler, LV_EVENT_ALL, ui);  
}

但是回調函數timer_meter_speed_cb()仍需要開發者自行在custom.c文件中自行創建,GUI Guider不會自動更新。代碼如下:

static int32_t speed = 50;  
static bool is_increase = true;  
  
  
/**  
 * Create a demo application  
 */  
  
void custom_init(lv_ui *ui)  
{  
    /* Add your codes here */  
}  
  
void timer_meter_speed_cb(lv_timer_t *t)  
{  
    lv_ui * gui = t- >user_data;  
    lv_meter_set_indicator_value(gui- >screen_meter_speed, gui- >screen_meter_speed_scale_1_ndline_0, speed);  
  
    if (speed >= 90)  
    {  
        is_increase = false;  
    }  
    if (speed <= 20)  
    {  
        is_increase = true;  
    }  
    if (is_increase)  
    {  
        speed++;  
    }  
    else  
    {  
        speed--;  
    }  
}

這里實現的內容是,在MCU上運行LVGL時,一旦顯示完成當前的屏幕頁面后,立即創建定時器對象timer_meter_speed,這個定時器將會每隔100ms調用一次回調函數timer_meter_speed_cb(),在timer_meter_speed_cb()函數中,更新變量speed的值,然后通過lv_meter_set_indicator_value()函數,改變screen_meter_speed對象中screen_meter_speed_scale_1_ndline_0屬性的值。每隔100ms改變一次screen_meter_speed對象的屬性值,將會觸發顯示內容的刷新,從而在顯示屏上顯現出動畫效果。

將GUI Guider生成的程序下載到MCU之前,可以先在GUI Guider的工程中模擬運行一次,一方面可以幫忙排除編譯錯誤(GUI Guider使用armgcc將LVGL和生成的源碼一起編譯),另一方面也方便預覽運行效果。使用LVGL組件的過程不涉及到對具體MCU硬件的依賴,因此完全可以在模擬環境中預覽實際執行的效果。如圖x所示。

640.gif

圖x 預覽在GUI Guider中創建的表盤對象

最后,編譯Keil工程,下載到MCU開發板。可以看到在MCU開發板上運行動圖的效果,如圖x所示。

640 (1).gif

圖x 在MCU開發板上運行轉動指針的表盤

小結

timer對象本身只是一個實現周期調度的機制,開發者可以在周期回調的函數內部,修改和重置顯示各種對象的屬性,觸發LVGL刷屏,從而實現動畫的效果。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 計數器
    +關注

    關注

    32

    文章

    2261

    瀏覽量

    94985
  • 定時器
    +關注

    關注

    23

    文章

    3255

    瀏覽量

    115375
  • GUI
    GUI
    +關注

    關注

    3

    文章

    662

    瀏覽量

    39891
  • 調度器
    +關注

    關注

    0

    文章

    98

    瀏覽量

    5298
  • LVGL
    +關注

    關注

    1

    文章

    91

    瀏覽量

    3083
收藏 人收藏

    評論

    相關推薦

    如何正確的將lv_port_esp32的LVGL部分合并到ESP_IDF

    我使用lv_port_esp32測試LVGL顯示正常,但是在將其合并到我自己基于ESP_IDF(v4.2.1)工程的時候遇見了問題。我將lv_examples、lvgl
    發表于 06-21 12:43

    rt-threadlvgl怎樣才使用外部RAM?

    我想問一下rt-threadlvgl怎樣才使用外部RAM,我想把lvgl的繪圖緩沖區搬到外部RAM上,我是這么做的,直接在lv_port_disp.c
    發表于 07-15 07:29

    關于winCE 開發OSD顯示動畫問題

    winCE OSD顯示開機動畫,每張圖都需要存3個BYTE的內存,我們顯示的時候讀取地址就開始顯示一張圖,直到讀完一幅圖的最后一個BYTE
    發表于 09-10 09:25

    LVGL工具使用

    文章所有資料以及代碼下載途徑LVGL工具使用:主要介紹下模擬器的使用/電腦組態軟件(我通常把電腦拖控件軟件叫做組態軟件)LVGL概念概述:主要對LVGL對象/事件/風格/輸入設備/
    發表于 12-15 07:17

    請問一下ESP8266播放動畫的設計該怎樣去實現

    請問一下ESP8266播放動畫的設計該怎樣去實現
    發表于 01-21 06:25

    怎樣去使用NY8B072A單片機的TIMER定時器

    怎樣去使用NY8B072A單片機的TIMER定時器?其代碼程序該怎樣去編寫
    發表于 01-21 06:50

    RK3288顯示LOGO過后沒有動畫會是什么原因造成的

    RK3288顯示LOGO過后沒有動畫會是什么原因造成的怎樣去解決
    發表于 03-03 11:29

    RK3288系統的開機動畫時間該怎樣去延長

    RK3288系統的開機動畫時間該怎樣去延長?有何解決方法?
    發表于 03-10 08:37

    開源輕量級顯示框架LVGL簡介

    啟動嵌入式GUI設計,同時LVGL作為一個圖形庫,它自帶著接近三十多種小工具可以供開發者使用。這些強大的構建塊按鈕搭配上帶有非常絲滑的動畫以及可以做到平滑滾動的高級圖形,同時兼具著不高的配置要求以及
    發表于 03-14 09:28

    開源輕量級顯示框架LVGL簡介

    啟動嵌入式GUI設計,同時LVGL作為一個圖形庫,它自帶著接近三十多種小工具可以供開發者使用。這些強大的構建塊按鈕搭配上帶有非常絲滑的動畫以及可以做到平滑滾動的高級圖形,同時兼具著不高的配置要求以及
    發表于 03-31 18:49

    如何使用lvgl定時器實現動畫效果

    LVGL,如何使用lvgl定時器實現動畫效果
    發表于 12-15 15:23

    DLP顯示器件的色輪視頻動畫

    DLP顯示器件的色輪視頻動畫
    發表于 07-31 11:30 ?940次閱讀

    全面解讀目前LVGL的應用小知識

    并處理特定任務的應用程序。 LVGL本身是一個圖形庫。我們的應用程序通過調用LVGL庫來創建GUI。它包含一個HAL(硬件抽象層)接口,用于注冊顯示和輸入設備驅動程序。 驅動程序除特定的驅動程序外,它還有其他的功能,可驅動
    的頭像 發表于 06-04 12:01 ?3w次閱讀
    全面解讀目前<b class='flag-5'>LVGL</b>的應用小知識

    簡析LVGL基礎知識之對象模塊

    LVGL ,用戶界面的基本構建塊是對象,也稱為小部件(widget)。本文主要是介紹LVGL對象模塊。
    的頭像 發表于 06-11 10:47 ?7562次閱讀
    簡析<b class='flag-5'>LVGL</b>基礎知識之<b class='flag-5'>對象</b>模塊

    【RISC-V &amp;amp; LVGL】現象級爆紅的開源顯示框架——LVGL究竟蘊藏怎樣的魔力

    #01LVGL簡介實用自行車碼表具有科技感的獎杯實現這些DIY作品的背后,都有同樣一個功能強大的GUI——LVGLLVGL的作者是來自匈牙利的GaborKiss-Vamosikisvegabor
    的頭像 發表于 03-15 09:50 ?3501次閱讀
    【RISC-V &amp;amp; <b class='flag-5'>LVGL</b>】現象級爆紅的開源<b class='flag-5'>顯示</b>框架——<b class='flag-5'>LVGL</b>究竟蘊藏<b class='flag-5'>怎樣</b>的魔力
    博彩网58娱乐城| 百家乐官网注册就送| 网上百家乐赌场| 澳门百家乐官网大家乐眼| 波克棋牌官网| 免佣百家乐的玩法| 立即博百家乐官网娱乐城| 大发888娱乐场 b8| 百家乐博娱乐平台| 风水97年农历6月24八字| 百家乐官网视频游戏金币| 足球即时比分网| 网上百家乐公司| 百家乐正网开户| 百家乐官网是怎样算牌| 乳源| 大发888优惠| 免费百家乐平预测软件| 百家乐技论坛| 百家乐在线怎么玩| 百家乐官网是怎么赌法| 至尊百家乐官网2012| 2013现金棋牌游戏| 网上棋牌是真的吗| 威尼斯人娱乐城真人百家乐| 百家乐太阳城娱乐城| 多台百家乐官网的玩法技巧和规则| 百家乐官网澳门百家乐官网| 金钻国际娱乐城| 赌场风云剧情介绍| 博彩评测网| 百家乐官网流水打法| 香港百家乐赌场娱乐网规则| 星港城百家乐娱乐城| 百家乐打法内容介绍| 做生意风水门面要求| 新锦江百家乐官网的玩法技巧和规则 | 二八杠怎么玩| 威尼斯人娱乐场66| 大发888博彩娱乐城| 大发888代理|