木子剑
生命不熄,学习不止!

当前使用的是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到此结束了。

posted on 2021-06-06 19:16  木子剑  阅读(2656)  评论(0编辑  收藏  举报