contiki ng與LVGL圖形庫之style風格功能


當前使用的是LVGL v8.0.0.首先我們對style進翻譯,style解釋有三種:風格,樣式,作風。

哪么style在LVGL里面,它到底是什么?通過了解和測試,我個人初步

style進行定義:它就是外觀,對只是外觀而已!

外觀就是些表面上  我們人眼看到的東東,比如形狀,長方形,正方形,長方形角邊是圓角,

還是有這形狀的顏色,是紅色 還是綠色等等?還有就是透明度,陰影等等,五花8門的,

決不是三言倆語能講明白的,(其他教程  網站都是講得比較淺,看多了就知道了)

 

為什么呢?讓我們看看lv_obj_style.h,這個lv_obj_style.c略過

 1 void _lv_obj_style_init(void);
 2 void lv_obj_add_style(struct _lv_obj_t * obj, lv_style_t * style, lv_style_selector_t selector);
 3 void lv_obj_remove_style(struct _lv_obj_t * obj, lv_style_t * style, lv_style_selector_t selector);
 4 
 5 static inline void lv_obj_remove_style_all(struct _lv_obj_t * obj)
 6 {
 7     lv_obj_remove_style(obj, NULL, LV_PART_ANY | LV_STATE_ANY);
 8 }
 9 
10 void lv_obj_report_style_change(lv_style_t * style);
11 void lv_obj_refresh_style(struct _lv_obj_t * obj, lv_part_t part, lv_style_prop_t prop);
12 void lv_obj_enable_style_refresh(bool en);
13 
14 lv_style_value_t  lv_obj_get_style_prop(const struct _lv_obj_t * obj, lv_part_t part, lv_style_prop_t prop);
15 void lv_obj_set_local_style_prop(struct _lv_obj_t * obj, lv_style_prop_t prop, lv_style_value_t value, lv_style_selector_t selector);
16 
17 lv_res_t  lv_obj_get_local_style_prop(struct _lv_obj_t * obj, lv_style_prop_t prop, lv_style_value_t * value, lv_style_selector_t selector);
18 bool lv_obj_remove_local_style_prop(struct _lv_obj_t * obj, lv_style_prop_t prop, lv_style_selector_t selector);
19 void _lv_obj_style_create_transition(struct _lv_obj_t * obj, lv_part_t part, lv_state_t prev_state, lv_state_t new_state, const _lv_obj_style_transition_dsc_t * tr);
20 _lv_style_state_cmp_t _lv_obj_style_state_compare(struct _lv_obj_t * obj, lv_state_t state1, lv_state_t state2);
21 void lv_obj_fade_in(struct _lv_obj_t * obj, uint32_t time, uint32_t delay);
22 void lv_obj_fade_out(struct _lv_obj_t * obj, uint32_t time, uint32_t delay);
23 lv_state_t  lv_obj_style_get_selector_state(lv_style_selector_t selector);
24 lv_part_t  lv_obj_style_get_selector_part(lv_style_selector_t selector);
25 
26 #include "lv_obj_style_gen.h"
27 
28 static inline void lv_obj_set_style_pad_all(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector) {
29     lv_obj_set_style_pad_left(obj, value, selector);
30     lv_obj_set_style_pad_right(obj, value, selector);
31     lv_obj_set_style_pad_top(obj, value, selector);
32     lv_obj_set_style_pad_bottom(obj, value, selector);
33 }
34 
35 static inline void lv_obj_set_style_pad_hor(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector) {
36     lv_obj_set_style_pad_left(obj, value, selector);
37     lv_obj_set_style_pad_right(obj, value, selector);
38 }
39 
40 static inline void lv_obj_set_style_pad_ver(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector) {
41     lv_obj_set_style_pad_top(obj, value, selector);
42     lv_obj_set_style_pad_bottom(obj, value, selector);
43 }
44 
45 static inline void lv_obj_set_style_pad_gap(struct _lv_obj_t * obj,  lv_coord_t value, lv_style_selector_t selector) {
46     lv_obj_set_style_pad_row(obj, value, selector);
47     lv_obj_set_style_pad_column(obj, value, selector);
48 }
49 
50 static inline void lv_obj_set_style_size(struct _lv_obj_t * obj,  lv_coord_t value, lv_style_selector_t selector) {
51     lv_obj_set_style_width(obj, value, selector);
52     lv_obj_set_style_height(obj, value, selector);
53 }

上面line:26加載了#include "lv_obj_style_gen.h",里面關聯了更多內容,看看吧,希望不要嚇到你們。。。

 

 當我們了解到style有這么多內容,怎么可能像他人一樣,簡簡單單幾句話

就能把style講明白呢?這不是應付了事嗎?我們至少要把lv_obj_style.h全部

得明明白白,才能直正意義上理解了  認識了style。。。加油!!!

 

時間:2021-06-19

其實要把style講明白還是比較難的,首先LVGL都有默認主題(外觀),在V8版本中可選

在lv_conf.h中進行配置:

/* -----------
 * Themes
 *----------*/
/* 一個簡單,令人印象深刻且非常完整的主題 */
#define LV_USE_THEME_DEFAULT        1
#if LV_USE_THEME_DEFAULT

/* 0: 燈光模式 ; 1: 暗夜模式 */
# define LV_THEME_DEFAULT_DARK      0

        

 

 

在測試 style外觀之前,必須對主題和對像有所了解,要不然就講不明白style外觀這個知識點,

我們簡單的創建一個對像,讓我們從最簡單的開始吧:

void lv_example(void)
{
     /* 創建新的對象 */
     lv_obj_t * obj = lv_obj_create(lv_scr_act()); //創建OBJ對像,父對像是當前活動屏幕
     lv_obj_set_size(obj,100,50);                  //OBJ對像的大小,指像素點      
     lv_obj_align(obj, LV_ALIGN_TOP_RIGHT, 0, 0);  //對像的對齊方式,頂部右上
}

  這個測試就像HELLO WORLD一樣簡單吧?

這就是LVGL主題給我們外觀,但是,朋友們不喜歡這個外觀,要自己設計外觀時,這時 style就有用武之地了.

 

我們講過style就是外觀,我們用它改改形狀和位置吧:

void lv_example(void)
{
     static lv_style_t style;                 //style變量,lv_style_t結構體
     lv_style_init(&style);                   //init初始化,其實只是分配內存空間

     lv_style_set_radius(&style, 60);         //清一色style_set操作,范指style屬性
     lv_style_set_width(&style, 150);         //寬度
     lv_style_set_height(&style, 150);        //高度
     lv_style_set_pad_ver(&style, 20);
     lv_style_set_pad_left(&style, 5);
     lv_style_set_x(&style, 0);    // 默認X位置
     lv_style_set_y(&style, 0);    // 默認Y位置

     /* 創建具有新樣式的對象 */
     lv_obj_t * obj = lv_obj_create(lv_scr_act()); //創建OBJ對像,父對像是當前活動屏幕
     lv_obj_add_style(obj, &style, 0);             //把新外觀加到OBJ對像上去,執行完后不刪除style
}

   因為OBJ對像沒有SET過多的屬性,可以看到 

直接使用了新style外觀的默認屬性。

 

我們之前contiki ng與LVGL圖形庫之label標簽功能,就已經學過label文本了,就加上文本看看效果: 

void lv_example(void)
{
     static lv_style_t style;                 //style變量,lv_style_t結構體
     lv_style_init(&style);                   //init初始化,其實只是分配內存空間

     lv_style_set_radius(&style, 60);         //清一色style_set操作,范指style屬性
     lv_style_set_width(&style, 150);         //寬度
     lv_style_set_height(&style, 150);        //高度
     lv_style_set_pad_ver(&style, 20);
     lv_style_set_pad_left(&style, 5);
     lv_style_set_x(&style, 0);    // 默認X位置
     lv_style_set_y(&style, 0);    // 默認Y位置

     /* 創建具有新樣式的對象 */
     lv_obj_t * obj = lv_obj_create(lv_scr_act()); //創建OBJ對像,父對像是當前活動屏幕
     lv_obj_add_style(obj, &style, 0);             //把新外觀加到OBJ對像上去,執行完后不刪除style

     lv_obj_t * label = lv_label_create(obj);      //創建一個文本對像,父對像是OBJ
     lv_label_set_recolor(label, true);            //打開重新着色功能
     lv_label_set_text(label,"#ff0000 hello world# ");    //設置文件對像屬性->字符串信息和顏色
     lv_obj_align(label, LV_ALIGN_CENTER, 0, 0);   //以OBJ父對像進行居中對齊
}

 這個測試就到這里吧,最后留一個問題吧。如何把 

這個新建的style,把這的背景改成綠色?試試吧,V7 V6哪一套方法肯定行不通的,好好想想吧。哈哈!!

 

 

 其實很簡單的,在SET屬性時加入下面就行了,

lv_style_set_bg_color(&style,lv_palette_main(LV_PALETTE_GREEN));

  確實很有意思,從頭到尾,從錢入深,學這個LVGL v8很有意思吧?

 

 

在LVGL中,很多函數功能都沒有注示信息,我們只能通過官方的例程,反復測試觀察能得出直觀的結論,還好例程

還算全面:

void lv_example_style_2(void)
{
    static lv_style_t style;
    lv_style_init(&style);
    lv_style_set_radius(&style, 5);
    lv_style_set_width(&style, 200);         //寬度
    lv_style_set_height(&style, 480);        //高度

    /* 做一個漸變 */
    lv_style_set_bg_opa(&style, LV_OPA_100);   // 透明度設置100%
    lv_style_set_bg_color(&style, lv_palette_lighten(LV_PALETTE_GREY, 1));// 背景灰色
    lv_style_set_bg_grad_color(&style, lv_palette_main(LV_PALETTE_BLUE));
    lv_style_set_bg_grad_dir(&style, LV_GRAD_DIR_VER);

    /* 將漸變移到底部 */
    lv_style_set_bg_main_stop(&style, 50);   // 這是在控制漸變范圍
    lv_style_set_bg_grad_stop(&style, 150); // 默認是0-255

    /*Create an object with the new style*/
    lv_obj_t * obj = lv_obj_create(lv_scr_act());
    lv_obj_add_style(obj, &style, 0);
    lv_obj_center(obj);   //將對象與父項的中心對齊。
}

 

這是官方給出外觀色漸變的方法,也是它的套路,背景為灰色,以藍色進行漸變。 

 

    /* 將漸變移到底部 */
    lv_style_set_bg_main_stop(&style, 50);   // 這是在控制漸變范圍
    lv_style_set_bg_grad_stop(&style, 150); // 默認是0-255

上面這個控制漸變范圍,是可以去掉的,去掉之后的意思是,這個style外觀的頂到底是

以藍色漸變灰色,全程細分色0-255。加了上面控制后,就是:0-50是背景原色-灰色,

50-150之間是漸變過程,150之后就直接是原色-藍色。

這玩意有點難理解,不過在后期用多了,就慢慢明白的。

 

 

時間:2021-06-20

style外觀的應用,還有外框,陰影等等,我覺得太簡單了,我們就以圖像樣式屬性進行收尾吧。

同樣我們在創建一個圖形對像時,圖形的源文件怎么來?圖形的源文件怎么用?是首先要面對

的問題,先進行解決它們。

第1步,去網址  https://gitee.com/icesu/Lvgl_image_convert_tool  下載lvgl_image_convert轉換工具。

如果你在華芯微特QQ的492524359技術群里,可以直接下載使用,已經上傳到Q群里面了。

第2步,為了做個簡單的演示用,隨便找個320*240圖片,找一個PNG格式圖片。

  點擊“轉換”后,會自動生成一個C文件,我們把這個C文件放在\LVGL\examples\assets里面就要可以了,最后

在IAR中加入剛生成C文件,如下圖所示:

 

 最后,簡單的進行測試: 

void lv_example_style(void)
{
    lv_obj_t * obj4 = lv_img_create(lv_scr_act());
    LV_IMG_DECLARE(img_cogwhee_qq_hello);
    lv_img_set_src(obj4, &img_cogwhee_qq_hello);
    lv_obj_align(obj4, LV_ALIGN_CENTER, 0, 0);
}

img_cogwhee_qq_hello就是我們生成C文件的源碼,燒進芯片去看一下效果吧。

  到此為止,已經把圖形的源文件怎么來?圖形的源文件怎么用?,講得一清二楚了,

 

 但是要知道,上面操作只把圖片丟到LCD屏上進行顯示在而已,原圖片的大小,形狀,顏色什么等.

目前是無法改變的。嘿嘿,這個時候style外觀的圖像樣式,就有用武之地了,搞這么多事情是為

它鋪路的。

 

接着測試:

void lv_example_style(void)
{
static lv_style_t style; lv_style_init(&style); //Set a background color and a radius lv_style_set_radius(&style, 60); lv_style_set_transform_angle(&style, 700); lv_style_set_bg_opa(&style, LV_OPA_COVER); lv_style_set_bg_color(&style, lv_palette_lighten(LV_PALETTE_BLUE, 3)); lv_style_set_border_width(&style, 10); lv_style_set_border_color(&style, lv_palette_main(LV_PALETTE_RED)); lv_obj_t * obj3 = lv_img_create(lv_scr_act()); lv_obj_add_style(obj3, &style, 0); LV_IMG_DECLARE(img_cogwhee_qq_hello); lv_img_set_src(obj3, &img_cogwhee_qq_hello); lv_obj_align(obj3, LV_ALIGN_CENTER, 0, 0); lv_obj_t * obj4 = lv_img_create(lv_scr_act()); LV_IMG_DECLARE(img_cogwhee_qq_hello); lv_img_set_src(obj4, &img_cogwhee_qq_hello); lv_obj_align(obj4, LV_ALIGN_TOP_LEFT, 0, 0); lv_obj_t * obj = lv_img_create(lv_scr_act()); LV_IMG_DECLARE(img_cogwhee_qq_map); lv_img_set_src(obj, &img_cogwhee_qq_map); lv_obj_align(obj, LV_ALIGN_BOTTOM_RIGHT,-100, 0); }

 

我們看到了,style進行了圖片后期處理,方向,外框和背景。右下角這個圖象是LVGL

的demo圖片,杯子是透明的,我們搞的圖片卻是實心的,看來還是有許許多多套路在里面。

OK, LVGL的style到此結束了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM