LVGL-主題Themes 介紹

關鍵字 :LVGL
►前言

LVGL是一個開源的嵌入式圖形庫,它可以在不同的平台和硬件上運行,提供了豐富的圖形元素和交互功能。LVGL的一個重要特性是主題Themes,它可以讓開發者快速地改變界面的風格和外觀。本文將介紹LVGL的主題系統,包括主題的概念、使用方法和自定義方式。

什麼是主題?

主題是一組預定義的樣式,它們可以應用到不同的圖形元素上,例如按鈕、滑塊、列表等。通過使用主題,開發者可以統一界面的色彩、字體、間距等屬性,使得界面看起來更加協調和美觀。LVGL提供了多種內置的主題,例如材料設計Material、蒙奈Monet、夜間Night等,它們都有自己的特點和風格。開發者也可以根據自己的需求,修改現有的主題或者創建新的主題。

主題概念

主題是一組風格(styles),可以應用於不同的物件(objects),以統一界面的視覺效果。每個主題都有一個回調函數(callback function),用於根據物件的類型和狀態,為其添加合適的風格。例如,一個按鈕(button)在默認狀態下可能有一種背景顏色,而在按下狀態下可能有另一種背景顏色。主題回調函數就可以根據按鈕的狀態,為其設置不同的背景風格。

LVGL提供了幾種內置的主題,例如基本主題(basic theme)、單色主題(mono theme)、默認主題(default theme)等2。這些主題都是基於LVGL的預設風格系統(style system)實現的,並且支持暗色模式(dark mode)和亮色模式(light mode)的切換。開發者可以直接使用這些內置的主題,也可以根據自己的需求,修改或創建新的主題。

如何使用主題?

使用LVGL的主題非常簡單,只需要幾個步驟:

  1. 在項目中引入LVGL和所需的主題文件,例如lvgl.h和lv_theme_material.h。
  2. 在初始化LVGL之後,創建一個主題對象,並傳入一些參數,例如色彩模式、字體大小等。例如:

// 創建材料設計主題

lv_theme_t * theme = lv_theme_material_init(LV_COLOR_PRIMARY, LV_COLOR_SECONDARY, LV_THEME_MATERIAL_FLAG_LIGHT, LV_FONT_DEFAULT, LV_FONT_DEFAULT, LV_FONT_DEFAULT, LV_FONT_DEFAULT);

  1. 將創建的主題對象設置為當前活動的主題。例如:

// 設置當前活動的主題

lv_theme_set_act(theme);

  1. 創建圖形元素並添加到屏幕上,它們會自動應用當前活動的主題。例如:

// 創建一個按鈕

lv_obj_t * btn = lv_btn_create(lv_scr_act(), NULL);

// 設置按鈕的文本

lv_obj_set_style_local_value_str(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, "Button");

// 調整按鈕的位置和大小

lv_obj_align(btn, NULL, LV_ALIGN_CENTER, 0, 0);

lv_obj_set_size(btn, 100, 50);

這樣就完成了使用主題的基本操作,如果想要切換到其他主題,只需要重複第2和第3步驟即可。

如何自定義主題?

如果內置的主題不能滿足開發者的需求,可以自定義一個新的主題。自定義主題需要完成以下幾個步驟:

  1. 定義一個全局或靜態的主題實例變量。
  2. 初始化該主題實例,並設置其父主題和回調函數。
  3. 定義一個或多個全局或靜態的風格實例變量,並初始化它們。
  4. 在回調函數中,根據物件的類型和狀態,為其添加相應的風格。
  5. 設置當前顯示器的主題為自定義的主題。

例如,以下代碼片段展示了如何自定義一個新的主題,該主題會為所有的矩形物件(rect object)添加一個紅色的背景和一個白色的陰影:

/*定義一個全局的主題實例變量*/

static lv_theme_t th_new;

 

/*定義一個全局的風格實例變量*/

static lv_style_t style_rect;

/*初始化風格實例*/

void style_init(void)

{

    /*設置背景顏色和不透明度*/

    lv_style_init(&style_rect);

    lv_style_set_bg_color(&style_rect, lv_color_red());

    lv_style_set_bg_opa(&style_rect, LV_OPA_COVER);

 

    /*設置陰影寬度和顏色*/

    lv_style_set_shadow_width(&style_rect, 10);

    lv_style_set_shadow_color(&style_rect, lv_color_white());

}

 

/*定義回調函數*/

void theme_apply_cb(lv_theme_t * th, lv_obj_t * obj)

{

    /*如果物件是矩形物件,則添加風格*/

    if(lv_obj_check_type(obj, &lv_obj_class))

    {

        lv_obj_add_style(obj, &style_rect, LV_STATE_DEFAULT);

    }

}

 

/*初始化主題實例*/

void theme_init(void)

{

    /*獲取當前活動的主題*/

    lv_theme_t * th_active = lv_theme_get_from_obj(NULL);

 

    /*通過當前活動的主題初始化新主題*/

    th_new = *th_active;

 

    /*設置父主題和回調函數*/

    lv_theme_set_parent(&th_new, th_active);

    lv_theme_set_apply_cb(&th_new, theme_apply_cb);

}

 

/*設置當前顯示器的主題為新主題*/

void theme_set(void)

{

    lv_disp_set_theme(NULL, &th_new);

}

這個新主題是基於當前活動的主題創建的,因此它會保留其他物件的風格。如果想要完全自定義所有物件的風格,可以在回調函數中添加更多的判斷和風格設置。



結語

本文介紹了LVGL的主題系統,包括主題的概念、使用方法和自定義方式。通過使用主題,開發者可以方便地改變界面的風格和外觀,提高用戶體驗。LVGL的主題也支持暗色模式和亮色模式的切換,以適應不同的環境和用戶。LVGL還提供了其他強大的功能,例如動畫、事件、風格等,有興趣的讀者可以參考LVGL的官方文檔和示例來進一步學習。

Q&A

  1. Q:什麼是主題?

           A:主題是一種視覺樣式,用於定義UI元素的外觀和感覺。

  1. Q:如何設置主題?

            A:使用lv_theme_set_current()函數設置主題。

  1. Q:如何自定義主題?

           A:可以使用lv_theme_set_act()函數自定義主題。

  1. Q:主題支持哪些屬性?

           A:主題支持屬性包括:背景,邊框,文字,圖像等。

  1. Q:如何在主題中使用圖像?

           A:可以使用lv_theme_set_image()函數在主題中使用圖像。

★博文內容均由個人提供,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★文明上網,請理性發言。內容一周內被舉報5次,發文人進小黑屋喔~

評論