给你的GUI润润色吧!别再那么Low了!LVGL『风格Style』介绍

原创 专注于无线通信的蓬勃 2021-02-20 08:10

一. LVGL风格Style介绍

样式用于设置对象的外观。lvgl 中的样式受 CSS 启发很大。简而言之,概念如下:

  • 样式是一个 lv_style_t 可以保存属性的变量,例如边框宽度,文本颜色等。与 class CSS 类似。
  • 并非必须指定所有属性。未指定的属性将使用默认值。
  • 可以将样式分配给对象以更改其外观。
  • 样式可以被任意数量的对象使用。
  • 样式可以级联,这意味着可以将多个样式分配给一个对象,并且每种样式可以具有不同的属性。例如,style_btn 可能会导致默认的灰色按钮,并且 style_btn_red 只能添加一个 background-color=red 以覆盖背景色。
  • 以后添加的样式具有更高的优先级。这意味着,如果以两种样式指定属性,则将使用后面添加的样式。
  • 如果未在对象中指定,则某些属性(例如,文本颜色)可以从父级继承。
  • 对象可以具有比“普通”样式更高优先级的局部样式。
  • 与 CSS(伪类描述不同的状态,例如 :hover )不同,在 lvgl 中,将属性分配给给定的状态。 (即“类”与状态无关,但是每个属性都有一个状态)
  • 当对象更改状态时可以应用过渡。

二. LVGL风格(Style)详细介绍

1. 风格(Style)的状态(states)

对象可以处于以下状态:

  • LV_STATE_DEFAULT (0x00): Normal, released

  • LV_STATE_CHECKED (0x01): Toggled or checked

  • LV_STATE_FOCUSED (0x02): Focused via keypad or encoder or clicked via touchpad/mouse

  • LV_STATE_EDITED  (0x04): Edit by an encoder

  • LV_STATE_HOVERED (0x08): Hovered by mouse (not supported now)

  • LV_STATE_PRESSED (0x10): Pressed

  • LV_STATE_DISABLED (0x20): Disabled or inactive

状态的组合也是可能的。 LV_STATE_FOCUSED | LV_STATE_PRESSED
可以在每种状态和状态组合中定义样式属性。例如,为默认和按下状态设置不同的背景颜色。如果未在状态中定义属性,则将使用最佳匹配状态的属性。通常,它表示带有 LV_STATE_DEFAULT 状态的属性。˛如果即使对于默认状态也未设置该属性,则将使用默认值。 (请参阅稍后)
但是“最佳匹配状态的属性”到底意味着什么?国家的优先级由其值显示(请参见上面的列表) 。值越高,优先
级越高。为了确定要使用哪个州的属性,我们举一个例子。让我们来看看背景色是这样定义的:

  • LV_STATE_DEFAULT: white

  • LV_STATE_PRESSED: gray

  • LV_STATE_FOCUSED: red

1.  默认情况下,对象处于默认状态,因此很简单:该属性在对象的当前状态中完美定义为白色
2.  按下对象时,有 2 个相关属性:默认为白色(默认与每个状态有关)和按下为灰色。按下状态的优先级为 0x10,高于默认状态的 0x00 优先级,因此将使用灰色。
3.  当物体聚焦时,会发生与按下状态相同的事情,并且将使用红色。 (焦点状态的优先级高于默认状态)。
4.  聚焦并按下对象时,灰色和红色都可以使用,但是按下状态的优先级高于聚焦,因此将使用灰色。
5.  可以为设置例如玫瑰色。在这种情况下,此组合状态的优先级为 0x02 0x10 = 0x12,该优先级高于按下状态的优先级,因此将使用玫瑰色。LV_STATE_PRESSED | LV_STATE_FOCUSED
6.  选中对象后,没有属性可以设置此状态的背景色。因此,在缺少更好的选择的情况下,对象在默认状态的属性中仍为白色

一些实用说明:

  • 如果要为所有状态设置属性(例如红色背景色) ,只需将其设置为默认状态即可。如果对象找不到其当前状态的属性,它将回退到默认状态的属性。
  • 使用 ORed 状态来描述复杂情况的属性。 (例如,按 选中 集中)
  • 对不同的状态使用不同的样式元素可能是一个好主意。例如,很难找到释放,按下,选中 按下,聚焦,聚焦 按下,聚焦 按下 选中等状态的背景颜色。相反,例如,将背景色用于按下和选中状态,并使用不同的边框颜色指示聚焦状态。

2. 风格(Style)的部件(Part)

对象可以具有可以具有自己样式的小部件。例如,页面包含四个部分:

  • 背景
  • 可卷动
  • 滚动条
  • 边缘闪光灯

有三种类型的对象部分的主体,虚拟和现实。
主要部分通常是对象的背景和最大部分。某些对象只有一个主要部分。例如,一个按钮只有一个背景。
虚拟小部件是实时绘制到主体小部件的其他小部件。它们后面没有“真实”对象。例如,页面的滚动条不是真实的对象,仅在绘制页面背景时才绘制。虚拟小部件始终具有与主要小部件相同的状态。如果可以继承该属性,则在转到父级之前还将考虑主体部分。
真实小部件是由主对象创建和管理的真实对象。例如,页面的可滚动部分是真实对象。实际小部件的状态可能与主要小部件的状态不同

3. 风格(Style)的初始化/获取/设置

风格是存储在lv_style_t变量中(注意:这个变量不能为局部变量,必须是static/全局/动态申请的变量)

使用前必须用这个函数初始化lv_style_init(&my_style),然后用这个函数尽心赋值lv_style_set_<property_name>(&style, <state>, <value>);

比如以下例子:

static lv_style_t style1;
lv_style_set_bg_color(&style1, LV_STATE_DEFAULT, LV_COLOR_WHITE);
lv_style_set_bg_color(&style1, LV_STATE_PRESSED, LV_COLOR_GRAY);
lv_style_set_bg_color(&style1, LV_STATE_FOCUSED, LV_COLOR_RED);
lv_style_set_bg_color(&style1, LV_STATE_FOCUSED | LV_STATE_PRESSED, lv_color_hex(0xf88));

删除属性:

lv_style_remove_prop(&style, LV_STYLE_BG_COLOR | (LV_STATE_PRESSED << LV_STYLE_STATE_POS));

获取属性:

_lv_style_get_color/int/opa/ptr(&style, <prop>, <result buf>);

重置属性:

lv_style_reset(&style);

4. 把风格(Style)加到对象控件上

用这个lv_obj_add_style(obj, <part>, &style)函数把属性加到对象控件上,比如:

lv_obj_add_style(btn, LV_BTN_PART_MAIN, &btn);      /*Default button style*/
lv_obj_add_style(btn, LV_BTN_PART_MAIN, &btn_red);  /*Overwrite only a some colors to red*/

5. 本地风格(Style)

在对象的样式列表中,也可以存储所谓的局部属性。与 CSS 的概念相同。局部样式与普通样式相同,但是它仅属于给定的对象,不能与其他对象共享。要设置本地属性,请使用    例如以下功能:

lv_obj_set_style_local_<property_name>(obj, <part>, <state>, <value>);
lv_obj_set_style_local_bg_color(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_RED);

6.  风格(Style)转换

默认情况下,当对象更改状态(例如,按下状态)时,会立即设置新状态下的新属性。但是,通过过渡,可以在状态改变时播放动画。例如,在按下按钮后,可以在 300 毫秒内将其背景色设置为所按下的颜色。过渡的参数存储在样式中。可以设置

  • 过渡时间
  • 开始过渡之前的延迟
  • 动画 path(也称为计时功能)
  • 要设置动画的属性

可以为每个状态定义过渡属性。例如,将 500 ms 过渡时间设置为默认状态将意味着当对象进入默认状态时,将应用 500 ms 过渡时间。在按下状态下设置 100 ms 过渡时间将意味着在进入按下状态时 100 ms 过渡时间。因此,此示例配置将导致快速进入印刷机状态而缓慢回到默认状态。

三. LVGL风格(Style)特定属性介绍

1. 混合属性(Mixed properties)

  • radius(lv_style_int_t):设置背景的半径。0:无半径,LV_RADIUS_CIRCLE:最大半径。默认值:0。
  • clip_corner(bool):true 可以将溢出的内容剪切到圆角(半径> 0)上。默认值:false。
  • size(lv_style_int_t):小部件内部元素的大小。是否使用此属性,请参见窗口小部件的文档。默认值:。LV_DPI / 20
  • transform_width  (lv_style_int_t):使用此值使对象在两侧更宽。默认值:0。
  • transform_height  (lv_style_int_t):使用此值使对象在两侧都较高。默认值:0。
  • transform_angle  (lv_style_int_t):旋转类似图像的对象。它的 uinit 为 0.1 度,对于 45 度使用450。默认值:0。
  • transform_zoom  (lv_style_int_t)缩放类似图像的对象。LV_IMG_ZOOM_NONE 正常大小为 256(或) ,一半为 128,一半为 512,等等。默认值:LV_IMG_ZOOM_NONE。
  • opa_scale(lv_style_int_t):继承。按此比例缩小对象的所有不透明度值。由于继承了子对象,因此也会受到影响。默认值:LV_OPA_COVER

2. 填充和边距属性(Padding and margin properties)

填充(Padding)可在边缘的内侧设置空间。意思是“我不要我的孩子们离我的身体太近,所以要保留这个空间”。填充内部
设置了孩子之间的“差距”。 边距(margin )在边缘的外侧设置空间。意思是“我想要我周围的空间”。
如果启用了布局或 自动调整,则这些属性通常由 Container 对象使用。但是,其他小部件也使用它们来设置
间距。有关详细信息,请参见小部件的文档。

  • pad_top(lv_style_int_t):在顶部设置填充。默认值:0。
  • pad_bottom(lv_style_int_t):在底部设置填充。默认值:0。
  • pad_left(lv_style_int_t):在左侧设置填充。默认值:0。
  • pad_right(lv_style_int_t):在右侧设置填充。默认值:0。
  • pad_inner(lv_style_int_t):设置子对象之间对象内部的填充。默认值:0。
  • margin_top(lv_style_int_t):在顶部设置边距。默认值:0。
  • margin_bottom(lv_style_int_t):在底部设置边距。默认值:0。
  • margin_left(lv_style_int_t):在左边设置边距。默认值:0。
  • margin_right(lv_style_int_t):在右边设置边距。默认值:0。

3. 背景属性(Background properties)

背景是一个可以具有渐变和 radius 舍入的简单矩形。

  • bg_color(lv_color_t)指定背景的颜色。默认值:LV_COLOR_WHITE。
  • bg_opa(lv_opa_t)指定背景的不透明度。默认值:LV_OPA_TRANSP。
  • bg_grad_color(lv_color_t)指定背景渐变的颜色。右侧或底部的颜色是bg_grad_dir != LV_GRAD_DIR_NONE。默认值:LV_COLOR_WHITE
  • bg_main_stop(uint8_t):指定渐变应从何处开始。0:最左/最上位置,255:最右/最下位置。默认值:0。
  • bg_grad_stop(uint8_t):指定渐变应在何处停止。0:最左/最上位置,255:最右/最下位置。预设值:255。
  • bg_grad_dir(lv_grad_dir_t)指定渐变的方向。可以 LV_GRAD_DIR_NONE/HOR/VER。默认值:LV_GRAD_DIR_NONE。
  • bg_blend_mode(lv_blend_mode_t):将混合模式设置为背景。可以LV_BLEND_MODE_NORMAL/ADDITIVE/SUBTRACTIVE) 。默认值:LV_BLEND_MODE_NORMAL。

我们上一个代码,对照效果说明下

void lvgl_style_bg_properties_test(void)
{
    static lv_style_t style;
    lv_style_init(&style);
    lv_style_set_radius(&style, LV_STATE_DEFAULT, 5);

    /*Make a gradient*/
    lv_style_set_bg_opa(&style, LV_STATE_DEFAULT, LV_OPA_COVER);
    lv_style_set_bg_color(&style, LV_STATE_DEFAULT, LV_COLOR_RED);
    lv_style_set_bg_grad_color(&style, LV_STATE_DEFAULT, LV_COLOR_BLUE);
    lv_style_set_bg_grad_dir(&style, LV_STATE_DEFAULT, LV_GRAD_DIR_HOR);

    /*Shift the gradient to the bottom*/
    lv_style_set_bg_main_stop(&style, LV_STATE_DEFAULT, 0);
    lv_style_set_bg_grad_stop(&style, LV_STATE_DEFAULT, 255);


    /*Create an object with the new style*/
    lv_obj_t* obj = lv_obj_create(lv_scr_act(), NULL);
    lv_obj_add_style(obj, LV_OBJ_PART_MAIN, &style);
    lv_obj_align(obj, NULL, LV_ALIGN_CENTER, 0, 0);
}

我们来看看效果:

设置了背景色为红色,设置了渐变颜色为蓝牙,设置了方向是横向,设置了从最左边到最右边渐变,然后创建一个按键,把风格添加上去,就呈现了这个效果!

4. 边框属性(Border properties)

边框绘制在背景上方。它具有 radius 舍入。

  • border_color(lv_color_t)指定边框的颜色。默认值:LV_COLOR_BLACK。
  • border_opa(lv_opa_t)指定边框的不透明度。默认值:LV_OPA_COVER。
  • border_width(lv_style_int_t):设置边框的宽度。默认值:0。
  • border_side(lv_border_side_t)指定要绘制边框的哪一侧。可以LV_BORDER_SIDE_NONE/LEFT/RIGHT/TOP/BOTTOM/FULL。ORed 值也是可能的。默认值:LV_BORDER_SIDE_FULL。
  • border_post(bool):如果 true 在绘制完所有子级之后绘制边框。默认值:false。
  • border_blend_mode(lv_blend_mode_t):设置边框的混合模式。可以LV_BLEND_MODE_NORMAL/ADDITIVE/SUBTRACTIVE) 。默认值:LV_BLEND_MODE_NORMAL。

先来看下代码:

void lvgl_style_border_properties_test(void)
{
    static lv_style_t style;
    lv_style_init(&style);

    /*Set a background color and a radius*/
    lv_style_set_radius(&style, LV_STATE_DEFAULT, 20);
    lv_style_set_bg_opa(&style, LV_STATE_DEFAULT, LV_OPA_COVER);
    lv_style_set_bg_color(&style, LV_STATE_DEFAULT, LV_COLOR_SILVER);

    /*Add border to the bottom right*/
    lv_style_set_border_color(&style, LV_STATE_DEFAULT, LV_COLOR_RED);
    lv_style_set_border_width(&style, LV_STATE_DEFAULT, 5);
    lv_style_set_border_opa(&style, LV_STATE_DEFAULT, LV_OPA_50);
    lv_style_set_border_side(&style, LV_STATE_DEFAULT, LV_BORDER_SIDE_BOTTOM | LV_BORDER_SIDE_RIGHT);

    /*Create an object with the new style*/
    lv_obj_t* obj = lv_obj_create(lv_scr_act(), NULL);
    lv_obj_add_style(obj, LV_OBJ_PART_MAIN, &style);
    lv_obj_align(obj, NULL, LV_ALIGN_CENTER, 0, 0);
}

我们来看下效果图

5. 轮廓属性(Outline properties)

轮廓类似于边框,但绘制在对象外部。

  • outline_color(lv_color_t)指定轮廓的颜色。默认值:LV_COLOR_BLACK。
  • outline_opa(lv_opa_t)指定轮廓的不透明度。默认值:LV_OPA_COVER。
  • outline_width(lv_style_int_t):设置轮廓的宽度。默认值:0。
  • outline_pad(lv_style_int_t)设置对象和轮廓之间的空间。默认值:0。
  • outline_blend_mode(lv_blend_mode_t):设置轮廓的混合模式。可以LV_BLEND_MODE_NORMAL/ADDITIVE/SUBTRACTIVE) 。默认值:LV_BLEND_MODE_NORMAL。

我们看下代码

void lvgl_style_outline_properties_test(void)
{
    static lv_style_t style;
    lv_style_init(&style);

    /*Set a background color and a radius*/
    lv_style_set_radius(&style, LV_STATE_DEFAULT, 5);
    lv_style_set_bg_opa(&style, LV_STATE_DEFAULT, LV_OPA_COVER);
    lv_style_set_bg_color(&style, LV_STATE_DEFAULT, LV_COLOR_SILVER);

    /*Add outline*/
    lv_style_set_outline_width(&style, LV_STATE_DEFAULT, 2);
    lv_style_set_outline_color(&style, LV_STATE_DEFAULT, LV_COLOR_RED);
    lv_style_set_outline_pad(&style, LV_STATE_DEFAULT, 8);

    /*Create an object with the new style*/
    lv_obj_t* obj = lv_obj_create(lv_scr_act(), NULL);
    lv_obj_add_style(obj, LV_OBJ_PART_MAIN, &style);
    lv_obj_align(obj, NULL, LV_ALIGN_CENTER, 0, 0);
}

我们来看下效果图

6. 阴影属性(Shadow properties)

阴影是对象下方的模糊区域。

  • shadow_color(lv_color_t)指定阴影的颜色。默认值:LV_COLOR_BLACK。
  • shadow_opa(lv_opa_t)指定阴影的不透明度。默认值:LV_OPA_TRANSP。
  • shadow_width(lv_style_int_t):设置轮廓的宽度(模糊大小) 。默认值:0。
  • shadow_ofs_x(lv_style_int_t):设置阴影的 X 偏移量。默认值:0。
  • shadow_ofs_y(lv_style_int_t):设置阴影的 Y 偏移量。默认值:0。
  • shadow_spread(lv_style_int_t):在每个方向上使阴影大于背景的值达到此值。默认值:0。
  • shadow_blend_mode(lv_blend_mode_t):设置阴影的混合模式。可以LV_BLEND_MODE_NORMAL/ADDITIVE/SUBTRACTIVE) 。默认值:LV_BLEND_MODE_NORMAL。

我们来看下代码

void lvgl_style_shadow_properties_test(void)
{
    static lv_style_t style;
    lv_style_init(&style);

    /*Set a background color and a radius*/
    lv_style_set_radius(&style, LV_STATE_DEFAULT, 5);
    lv_style_set_bg_opa(&style, LV_STATE_DEFAULT, LV_OPA_COVER);
    lv_style_set_bg_color(&style, LV_STATE_DEFAULT, LV_COLOR_SILVER);

    /*Add a shadow*/
    lv_style_set_shadow_width(&style, LV_STATE_DEFAULT, 8);
    lv_style_set_shadow_color(&style, LV_STATE_DEFAULT, LV_COLOR_RED);
    lv_style_set_shadow_ofs_x(&style, LV_STATE_DEFAULT, 10);
    lv_style_set_shadow_ofs_y(&style, LV_STATE_DEFAULT, 20);

    /*Create an object with the new style*/
    lv_obj_t* obj = lv_obj_create(lv_scr_act(), NULL);
    lv_obj_add_style(obj, LV_OBJ_PART_MAIN, &style);
    lv_obj_align(obj, NULL, LV_ALIGN_CENTER, 0, 0);
}

我们来看下效果图

7. 图案属性(Pattern properties)

图案是在背景中间绘制或重复以填充整个背景的图像(或符号) 。

  • pattern_image(const void *):指向变量的指针,图像文件或符号的 path。默认值:NULL
  • pattern_opa(lv_opa_t):指定图案的不透明度。默认值:LV_OPA_COVER。
  • pattern_recolor(lv_color_t):将此颜色混合到图案图像中。如果是符号(文本) ,它将是文本颜色。默认值:LV_COLOR_BLACK。
  • pattern_recolor_opa(lv_opa_t):重着色的强度。默认值:(LV_OPA_TRANSP 不重新着色) 。
  • pattern_repeat(bool):true 图案将作为马赛克重复。false:将图案放置在背景中间。默认值:false。
  • pattern_blend_mode(lv_blend_mode_t):设置图案的混合模式。可以LV_BLEND_MODE_NORMAL/ADDITIVE/SUBTRACTIVE) 。默认值:LV_BLEND_MODE_NORMAL

我们来看下代码

void lvgl_style_patten_properties_test(void)
{
    static lv_style_t style;
    lv_style_init(&style);

    /*Set a background color and a radius*/
    lv_style_set_radius(&style, LV_STATE_DEFAULT, 5);
    lv_style_set_bg_opa(&style, LV_STATE_DEFAULT, LV_OPA_COVER);
    lv_style_set_bg_color(&style, LV_STATE_DEFAULT, LV_COLOR_SILVER);

    /*Add a repeating pattern*/
    lv_style_set_pattern_image(&style, LV_STATE_DEFAULT, LV_SYMBOL_BLUETOOTH);
    lv_style_set_pattern_recolor(&style, LV_STATE_DEFAULT, LV_COLOR_BLUE);
    lv_style_set_pattern_opa(&style, LV_STATE_DEFAULT, LV_OPA_50);
    lv_style_set_pattern_repeat(&style, LV_STATE_DEFAULT, true);

    /*Create an object with the new style*/
    lv_obj_t* obj = lv_obj_create(lv_scr_act(), NULL);
    lv_obj_set_size(obj, 200, 200);
    lv_obj_add_style(obj, LV_OBJ_PART_MAIN, &style);
    lv_obj_align(obj, NULL, LV_ALIGN_CENTER, 0, 0);
}

我们来看下效果图(搞蓝牙的对蓝牙特别情有独钟)

8. 数值属性(Value properties)

值是绘制到背景的任意文本。它可以是创建标签对象的轻量级替代。

  • value_str(const char *):指向要显示的文本的指针。仅保存指针!(不要将局部变量与 lv_style_set_value_str一起使用,而应使用静态,全局或动态分配的数据) 。默认值:NULL
  • value_color(lv_color_t):文本的颜色。默认值:LV_COLOR_BLACK。
  • value_opa(lv_opa_t):文本的不透明度。默认值:LV_OPA_COVER。
  • value_font():指向文本字体的指针。默认值:。const lv_font_t *NULL
  • value_letter_space(lv_style_int_t):文本的字母空间。默认值:0。
  • value_line_space(lv_style_int_t):文本的行距。默认值:0。
  • value_align(lv_align_t):文本的对齐方式。可以 LV_ALIGN_...。默认值:LV_ALIGN_CENTER。
  • value_ofs_x(lv_style_int_t):与路线原始位置的 X 偏移量。默认值:0。
  • value_ofs_y(lv_style_int_t):从路线的原始位置偏移 Y。默认值:0。
  • value_blend_mode(lv_blend_mode_t):设置文本的混合模式。可以LV_BLEND_MODE_NORMAL/ADDITIVE/SUBTRACTIVE) 。默认值:LV_BLEND_MODE_NORMAL。

我们来看下代码

void lvgl_style_value_properties_test(void)
{
    static lv_style_t style;
    lv_style_init(&style);

    /*Set a background color and a radius*/
    lv_style_set_radius(&style, LV_STATE_DEFAULT, 5);
    lv_style_set_bg_opa(&style, LV_STATE_DEFAULT, LV_OPA_COVER);
    lv_style_set_bg_color(&style, LV_STATE_DEFAULT, LV_COLOR_SILVER);

    /*Add a value text properties*/
    lv_style_set_value_color(&style, LV_STATE_DEFAULT, LV_COLOR_RED);
    lv_style_set_value_align(&style, LV_STATE_DEFAULT, LV_ALIGN_IN_BOTTOM_RIGHT);
    lv_style_set_value_ofs_x(&style, LV_STATE_DEFAULT, 10);
    lv_style_set_value_ofs_y(&style, LV_STATE_DEFAULT, 30);

    /*Create an object with the new style*/
    lv_obj_t* obj = lv_obj_create(lv_scr_act(), NULL);
    lv_obj_add_style(obj, LV_OBJ_PART_MAIN, &style);
    lv_obj_align(obj, NULL, LV_ALIGN_CENTER, 0, 0);

    /*Add a value text to the local style. This way every object can have different text*/
    lv_obj_set_style_local_value_str(obj, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, "wireless link");
}

我们来看下效果图

9. 文本属性(Text properties)

文本对象的属性。

  • text_color(lv_color_t):文本的颜色。默认值:LV_COLOR_BLACK。
  • text_opa(lv_opa_t):文本的不透明度。默认值:LV_OPA_COVER。
  • text_font(const lv_font_t *):指向文本字体的指针。默认值:。NULL
  • text_letter_space(lv_style_int_t):文本的字母空间。默认值:0。
  • text_line_space(lv_style_int_t):文本的行距。默认值:0。
  • text_decor(lv_text_decor_t):添加文字修饰。可以LV_TEXT_DECOR_NONE/UNDERLINE/STRIKETHROUGH。默认值:LV_TEXT_DECOR_NONE。
  • text_sel_color(lv_color_t):设置文本选择的背景色。默认值:LV_COLOR_BLACK
  • text_blend_mode(lv_blend_mode_t):设置文本的混合模式。可以LV_BLEND_MODE_NORMAL/ADDITIVE/SUBTRACTIVE) 。默认值:LV_BLEND_MODE_NORMAL

我们来看下代码

void lvgl_style_text_properties_test(void)
{
    static lv_style_t style;
    lv_style_init(&style);

    lv_style_set_radius(&style, LV_STATE_DEFAULT, 5);
    lv_style_set_bg_opa(&style, LV_STATE_DEFAULT, LV_OPA_COVER);
    lv_style_set_bg_color(&style, LV_STATE_DEFAULT, LV_COLOR_SILVER);
    lv_style_set_border_width(&style, LV_STATE_DEFAULT, 2);
    lv_style_set_border_color(&style, LV_STATE_DEFAULT, LV_COLOR_BLUE);

    lv_style_set_pad_top(&style, LV_STATE_DEFAULT, 10);
    lv_style_set_pad_bottom(&style, LV_STATE_DEFAULT, 10);
    lv_style_set_pad_left(&style, LV_STATE_DEFAULT, 10);
    lv_style_set_pad_right(&style, LV_STATE_DEFAULT, 10);

    lv_style_set_text_color(&style, LV_STATE_DEFAULT, LV_COLOR_RED);
    lv_style_set_text_letter_space(&style, LV_STATE_DEFAULT, 5);
    lv_style_set_text_line_space(&style, LV_STATE_DEFAULT, 20);
    lv_style_set_text_decor(&style, LV_STATE_DEFAULT, LV_TEXT_DECOR_UNDERLINE);

    /*Create an object with the new style*/
    lv_obj_t* obj = lv_label_create(lv_scr_act(), NULL);
    lv_obj_add_style(obj, LV_LABEL_PART_MAIN, &style);
    lv_label_set_text(obj, "wireless link");
    lv_obj_align(obj, NULL, LV_ALIGN_CENTER, 0, 0);
}

我们来看下效果图

10. 线属性(Line properties)

线的属性。

  • line_color(lv_color_t):线条的颜色。默认值:LV_COLOR_BLACK
  • line_opa(lv_opa_t):直线的不透明度。默认值:LV_OPA_COVER
  • line_width(lv_style_int_t):线的宽度。默认值:0。
  • line_dash_width(lv_style_int_t):破折号的宽度。仅对水平或垂直线绘制虚线。0:禁用破折号。默认值:0。
  • line_dash_gap(lv_style_int_t):两条虚线之间的间隙。仅对水平或垂直线绘制虚线。0:禁用破折号。默认值:0。
  • line_rounded(bool)::true 绘制圆角的线尾。默认值:false。
  • line_blend_mode(lv_blend_mode_t):设置线条的混合模式。可以LV_BLEND_MODE_NORMAL/ADDITIVE/SUBTRACTIVE) 。默认值:LV_BLEND_MODE_NORMAL。

我们来看下代码

void lvgl_style_line_properties_test(void)
{
    static lv_style_t style;
    lv_style_init(&style);

    lv_style_set_line_color(&style, LV_STATE_DEFAULT, LV_COLOR_RED);
    lv_style_set_line_width(&style, LV_STATE_DEFAULT, 10);
    lv_style_set_line_rounded(&style, LV_STATE_DEFAULT, true);
#if LV_USE_LINE
    /*Create an object with the new style*/
    lv_obj_t* obj = lv_line_create(lv_scr_act(), NULL);
    lv_obj_add_style(obj, LV_LINE_PART_MAIN, &style);

    static lv_point_t p[] = { {0, 0}, {30, 30}, {60, 0} };
    lv_line_set_points(obj, p, 3);

    lv_obj_align(obj, NULL, LV_ALIGN_CENTER, 0, 0);
#endif
}

我们来看下效果图

11. 图片属性(Image properties)

图像的属性。

  • image_recolor(lv_color_t):将此颜色混合到图案图像中。如果是符号(文本) ,它将是文本颜色。默认值:LV_COLOR_BLACK
  • image_recolor_opa(lv_opa_t):重新着色的强度。默认值:(LV_OPA_TRANSP 不重新着色) 。默认值:LV_OPA_TRANSP
  • image_opa(lv_opa_t):图像的不透明度。默认值:LV_OPA_COVER
  • image_blend_mode(lv_blend_mode_t):设置图像的混合模式。可以LV_BLEND_MODE_NORMAL/ADDITIVE/SUBTRACTIVE) 。默认值:LV_BLEND_MODE_NORMAL。

我们来看下代码

void lvgl_style_image_properties_test(void)
{
    static lv_style_t style;
    lv_style_init(&style);

    /*Set a background color and a radius*/
    lv_style_set_radius(&style, LV_STATE_DEFAULT, 5);
    lv_style_set_bg_opa(&style, LV_STATE_DEFAULT, LV_OPA_COVER);
    lv_style_set_bg_color(&style, LV_STATE_DEFAULT, LV_COLOR_SILVER);
    lv_style_set_border_width(&style, LV_STATE_DEFAULT, 2);
    lv_style_set_border_color(&style, LV_STATE_DEFAULT, LV_COLOR_BLUE);

    lv_style_set_pad_top(&style, LV_STATE_DEFAULT, 10);
    lv_style_set_pad_bottom(&style, LV_STATE_DEFAULT, 10);
    lv_style_set_pad_left(&style, LV_STATE_DEFAULT, 10);
    lv_style_set_pad_right(&style, LV_STATE_DEFAULT, 10);

    lv_style_set_image_recolor(&style, LV_STATE_DEFAULT, LV_COLOR_RED);
    lv_style_set_image_recolor_opa(&style, LV_STATE_DEFAULT, LV_OPA_50);

#if LV_USE_IMG
    /*Create an object with the new style*/
    lv_obj_t* obj = lv_img_create(lv_scr_act(), NULL);
    lv_obj_add_style(obj, LV_IMG_PART_MAIN, &style);
    LV_IMG_DECLARE(img_cogwheel_argb);
    lv_img_set_src(obj, &img_cogwheel_argb);
    lv_obj_align(obj, NULL, LV_ALIGN_CENTER, 0, 0);
#endif
}

我们来看下效果图

12. 转换属性(Transition properties)

用于描述状态更改动画的属性。

  • transition_time(lv_style_int_t):过渡时间。默认值:0。
  • transition_delay(lv_style_int_t):转换前的延迟。默认值:0。
  • transition_prop_1(property name):应在其上应用过渡的属性。将属性名称与大写字母一起使用,例如。默认值:0(无)
  • transition_prop_2(property name):与 transition_1 相同,只是另一个属性。默认值:0(无)
  • transition_prop_3(property name):与 transition_1 相同,只是另一个属性。默认值:0(无)
  • transition_prop_4(property name):与 transition_1 相同,只是另一个属性。默认值:0(无)
  • transition_prop_5(property name):与 transition_1 相同,只是另一个属性。默认值:0(无)
  • transition_prop_6(property name):与 transition_1 相同,只是另一个属性。默认值:0(无)
  • transition_path(lv_anim_path_t):过渡的动画 path。 (需要为静态或全局变量,因为仅保存了其指针) 。默认值:(lv_anim_path_def 线性 path) 。

我们来看下代码

void lvgl_style_transition_properties_test(void)
{
    static lv_style_t style;
    lv_style_init(&style);

    /*Set a background color and a radius*/
    lv_style_set_radius(&style, LV_STATE_DEFAULT, 5);
    lv_style_set_bg_opa(&style, LV_STATE_DEFAULT, LV_OPA_COVER);
    lv_style_set_bg_color(&style, LV_STATE_DEFAULT, LV_COLOR_SILVER);

    /*Set different background color in pressed state*/
    lv_style_set_bg_color(&style, LV_STATE_PRESSED, LV_COLOR_RED);

    /*Set different transition time in default and pressed state
     *fast press, slower revert to default*/
    lv_style_set_transition_time(&style, LV_STATE_DEFAULT, 500);
    lv_style_set_transition_time(&style, LV_STATE_PRESSED, 200);

    /*Small delay to make transition more visible*/
    lv_style_set_transition_delay(&style, LV_STATE_DEFAULT, 100);

    /*Add `bg_color` to transitioned properties*/
    lv_style_set_transition_prop_1(&style, LV_STATE_DEFAULT, LV_STYLE_BG_COLOR);

    /*Create an object with the new style*/
    lv_obj_t* obj = lv_obj_create(lv_scr_act(), NULL);
    lv_obj_add_style(obj, LV_OBJ_PART_MAIN, &style);
    lv_obj_align(obj, NULL, LV_ALIGN_CENTER, 0, 0);
}

我们来看下效果图

13. 比例刻度属性(Scale properties)

比例刻度有一个正常区域和结束区域。顾名思义,结束区域是范围的末端,其中可以是临界值或非活动值。正常区域在结束区域之前。这两个区域可能有不同的性质。

  • scale_grad_color(lv_color_t):在正常区域中,在比例尺线上对该颜色进行渐变。默认值:LV_COLOR_BLACK。
  • scale_end_color(lv_color_t):结束区域中刻度线的颜色。默认值:LV_COLOR_BLACK。
  • scale_width(lv_style_int_t):比例尺的宽度。默认值:。默认值:。LV_DPI / 8LV_DPI / 8
  • scale_border_width(lv_style_int_t):在标准区域的比例尺外侧绘制的边框的宽度。默认值:0。
  • scale_end_border_width(lv_style_int_t):在结束区域的刻度外侧上绘制边框的宽度。默认值:0。
  • scale_end_line_width(lv_style_int_t):结束区域中比例线的宽度。默认值:0。

我们来看下代码

void lvgl_style_scale_properties_test(void)
{
    static lv_style_t style;
    lv_style_init(&style);

    /*Set a background color and a radius*/
    lv_style_set_radius(&style, LV_STATE_DEFAULT, 5);
    lv_style_set_bg_opa(&style, LV_STATE_DEFAULT, LV_OPA_COVER);
    lv_style_set_bg_color(&style, LV_STATE_DEFAULT, LV_COLOR_SILVER);

    /*Set some paddings*/
    lv_style_set_pad_inner(&style, LV_STATE_DEFAULT, 20);
    lv_style_set_pad_top(&style, LV_STATE_DEFAULT, 20);
    lv_style_set_pad_left(&style, LV_STATE_DEFAULT, 5);
    lv_style_set_pad_right(&style, LV_STATE_DEFAULT, 5);

    lv_style_set_scale_end_color(&style, LV_STATE_DEFAULT, LV_COLOR_RED);
    lv_style_set_line_color(&style, LV_STATE_DEFAULT, LV_COLOR_WHITE);
    lv_style_set_scale_grad_color(&style, LV_STATE_DEFAULT, LV_COLOR_BLUE);
    lv_style_set_line_width(&style, LV_STATE_DEFAULT, 2);
    lv_style_set_scale_end_line_width(&style, LV_STATE_DEFAULT, 4);
    lv_style_set_scale_end_border_width(&style, LV_STATE_DEFAULT, 4);

    /*Gauge has a needle but for simplicity its style is not initialized here*/
#if LV_USE_GAUGE
    /*Create an object with the new style*/
    lv_obj_t* obj = lv_gauge_create(lv_scr_act(), NULL);
    lv_obj_add_style(obj, LV_GAUGE_PART_MAIN, &style);
    lv_obj_align(obj, NULL, LV_ALIGN_CENTER, 0, 0);
#endif
}

我们来看下效果图

14. 主题(Themes)

主题是样式的集合。始终有一个活动主题,在创建对象时会自动应用其样式。它为 UI 提供了默认外观,可以通过添加其他样式来对其进行修改。默认的主题被设定在 lv_conf.h 与 LV_THEME_... 定义。每个主题都具有以下属性:

  • 原色
  • 副色
  • 小字体
  • 普通字体
  • 字幕字体
  • 标题字体
  • 标志(特定于给定主题)

如何使用这些属性取决于主题。
有3个内置主题:

  • empty 空:未添加默认样式
  • material 材质:令人印象深刻的现代主题-单声道:用于黑白显示的简单黑白主题
  • template 模板:一个非常简单的主题,可以将其复制以创建自定义主题

15. 扩展主题(Extending themes)

内置主题可以通过自定义主题进行扩展。如果创建了自定义主题,则可以选择“基本主题”。基本主题的样式将添加到自定义主题之前。可以链接任何数量的主题。例如,材料主题->自定义主题->黑暗主题。这是有关如何基于当前活动的内置主题创建自定义主题的示例。

 /*Get the current theme (e.g. material). It will be the base of the custom theme.*/   
lv_theme_t * base_theme = lv_theme_get_act();

/*Initialize a custom theme*/
static lv_theme_t custom_theme;                         /*Declare a theme*/
lv_theme_copy(&custom_theme, base_theme);               /*Initialize the custom theme from the base theme*/                           
lv_theme_set_apply_cb(&custom_theme, custom_apply_cb);  /*Set a custom theme apply callback*/
lv_theme_set_base(custom_theme, base_theme);            /*Set the base theme of the csutom theme*/

/*Initialize styles for the new theme*/
static lv_style_t style1;
lv_style_init(&style1);
lv_style_set_bg_color(&style1, LV_STATE_DEFAULT, custom_theme.color_primary);

...

/*Add a custom apply callback*/
static void custom_apply_cb(lv_theme_t * th, lv_obj_t * obj, lv_theme_style_t name)
{
    lv_style_list_t * list;

    switch(name) {
        case LV_THEME_BTN:
            list = lv_obj_get_style_list(obj, LV_BTN_PART_MAIN);
            _lv_style_list_add_style(list, &my_style);
            break;
    }
}
专注于无线通信的蓬勃 朝气蓬勃——不积跬步 无以至千里, 不积小流 无以成江海
评论
  • 在智能家居领域中,Wi-Fi、蓝牙、Zigbee、Thread与Z-Wave等无线通信协议是构建短距物联局域网的关键手段,它们常在实际应用中交叉运用,以满足智能家居生态系统多样化的功能需求。然而,这些协议之间并未遵循统一的互通标准,缺乏直接的互操作性,在进行组网时需要引入额外的网关作为“翻译桥梁”,极大地增加了系统的复杂性。 同时,Apple HomeKit、SamSung SmartThings、Amazon Alexa、Google Home等主流智能家居平台为了提升市占率与消费者
    华普微HOPERF 2025-01-06 17:23 97浏览
  • 根据Global Info Research项目团队最新调研,预计2030年全球封闭式电机产值达到1425百万美元,2024-2030年期间年复合增长率CAGR为3.4%。 封闭式电机是一种电动机,其外壳设计为密闭结构,通常用于要求较高的防护等级的应用场合。封闭式电机可以有效防止外部灰尘、水分和其他污染物进入内部,从而保护电机的内部组件,延长其使用寿命。 环洋市场咨询机构出版的调研分析报告【全球封闭式电机行业总体规模、主要厂商及IPO上市调研报告,2025-2031】研究全球封闭式电机总体规
    GIRtina 2025-01-06 11:10 87浏览
  • 自动化已成为现代制造业的基石,而驱动隔离器作为关键组件,在提升效率、精度和可靠性方面起到了不可或缺的作用。随着工业技术不断革新,驱动隔离器正助力自动化生产设备适应新兴趋势,并推动行业未来的发展。本文将探讨自动化的核心趋势及驱动隔离器在其中的重要角色。自动化领域的新兴趋势智能工厂的崛起智能工厂已成为自动化生产的新标杆。通过结合物联网(IoT)、人工智能(AI)和机器学习(ML),智能工厂实现了实时监控和动态决策。驱动隔离器在其中至关重要,它确保了传感器、执行器和控制单元之间的信号完整性,同时提供高
    腾恩科技-彭工 2025-01-03 16:28 166浏览
  • 物联网(IoT)的快速发展彻底改变了从智能家居到工业自动化等各个行业。由于物联网系统需要高效、可靠且紧凑的组件来处理众多传感器、执行器和通信设备,国产固态继电器(SSR)已成为满足中国这些需求的关键解决方案。本文探讨了国产SSR如何满足物联网应用的需求,重点介绍了它们的优势、技术能力以及在现实场景中的应用。了解物联网中的固态继电器固态继电器是一种电子开关设备,它使用半导体而不是机械触点来控制负载。与传统的机械继电器不同,固态继电器具有以下优势:快速切换:确保精确快速的响应,这对于实时物联网系统至
    克里雅半导体科技 2025-01-03 16:11 176浏览
  • PLC组态方式主要有三种,每种都有其独特的特点和适用场景。下面来简单说说: 1. 硬件组态   定义:硬件组态指的是选择适合的PLC型号、I/O模块、通信模块等硬件组件,并按照实际需求进行连接和配置。    灵活性:这种方式允许用户根据项目需求自由搭配硬件组件,具有较高的灵活性。    成本:可能需要额外的硬件购买成本,适用于对系统性能和扩展性有较高要求的场合。 2. 软件组态   定义:软件组态主要是通过PLC
    丙丁先生 2025-01-06 09:23 71浏览
  • 车身域是指负责管理和控制汽车车身相关功能的一个功能域,在汽车域控系统中起着至关重要的作用。它涵盖了车门、车窗、车灯、雨刮器等各种与车身相关的功能模块。与汽车电子电气架构升级相一致,车身域发展亦可以划分为三个阶段,功能集成愈加丰富:第一阶段为分布式架构:对应BCM车身控制模块,包含灯光、雨刮、门窗等传统车身控制功能。第二阶段为域集中架构:对应BDC/CEM域控制器,在BCM基础上集成网关、PEPS等。第三阶段为SOA理念下的中央集中架构:VIU/ZCU区域控制器,在BDC/CEM基础上集成VCU、
    北汇信息 2025-01-03 16:01 193浏览
  • 这篇内容主要讨论三个基本问题,硅电容是什么,为什么要使用硅电容,如何正确使用硅电容?1.  硅电容是什么首先我们需要了解电容是什么?物理学上电容的概念指的是给定电位差下自由电荷的储藏量,记为C,单位是F,指的是容纳电荷的能力,C=εS/d=ε0εrS/4πkd(真空)=Q/U。百度百科上电容器的概念指的是两个相互靠近的导体,中间夹一层不导电的绝缘介质。通过观察电容本身的定义公式中可以看到,在各个变量中比较能够改变的就是εr,S和d,也就是介质的介电常数,金属板有效相对面积以及距离。当前
    知白 2025-01-06 12:04 110浏览
  • 本文介绍Linux系统更换开机logo方法教程,通用RK3566、RK3568、RK3588、RK3576等开发板,触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。制作图片开机logo图片制作注意事项(1)图片必须为bmp格式;(2)图片大小不能大于4MB;(3)BMP位深最大是32,建议设置为8;(4)图片名称为logo.bmp和logo_kernel.bmp;开机
    Industio_触觉智能 2025-01-06 10:43 72浏览
  • 光耦合器,也称为光隔离器,是一种利用光在两个隔离电路之间传输电信号的组件。在医疗领域,确保患者安全和设备可靠性至关重要。在众多有助于医疗设备安全性和效率的组件中,光耦合器起着至关重要的作用。这些紧凑型设备经常被忽视,但对于隔离高压和防止敏感医疗设备中的电气危害却是必不可少的。本文深入探讨了光耦合器的功能、其在医疗应用中的重要性以及其实际使用示例。什么是光耦合器?它通常由以下部分组成:LED(发光二极管):将电信号转换为光。光电探测器(例如光电晶体管):检测光并将其转换回电信号。这种布置确保输入和
    腾恩科技-彭工 2025-01-03 16:27 171浏览
  • 随着市场需求不断的变化,各行各业对CPU的要求越来越高,特别是近几年流行的 AIOT,为了有更好的用户体验,CPU的算力就要求更高了。今天为大家推荐由米尔基于瑞芯微RK3576处理器推出的MYC-LR3576核心板及开发板。关于RK3576处理器国产CPU,是这些年的骄傲,华为手机全国产化,国人一片呼声,再也不用卡脖子了。RK3576处理器,就是一款由国产是厂商瑞芯微,今年第二季推出的全新通用型的高性能SOC芯片,这款CPU到底有多么的高性能,下面看看它的几个特性:8核心6 TOPS超强算力双千
    米尔电子嵌入式 2025-01-03 17:04 48浏览
  •     为控制片内设备并且查询其工作状态,MCU内部总是有一组特殊功能寄存器(SFR,Special Function Register)。    使用Eclipse环境调试MCU程序时,可以利用 Peripheral Registers Viewer来查看SFR。这个小工具是怎样知道某个型号的MCU有怎样的寄存器定义呢?它使用一种描述性的文本文件——SVD文件。这个文件存储在下面红色字体的路径下。    例:南京沁恒  &n
    电子知识打边炉 2025-01-04 20:04 79浏览
  • 在快速发展的能源领域,发电厂是发电的支柱,效率和安全性至关重要。在这种背景下,国产数字隔离器已成为现代化和优化发电厂运营的重要组成部分。本文探讨了这些设备在提高性能方面的重要性,同时展示了中国在生产可靠且具有成本效益的数字隔离器方面的进步。什么是数字隔离器?数字隔离器充当屏障,在电气上将系统的不同部分隔离开来,同时允许无缝数据传输。在发电厂中,它们保护敏感的控制电路免受高压尖峰的影响,确保准确的信号处理,并在恶劣条件下保持系统完整性。中国国产数字隔离器经历了重大创新,在许多方面达到甚至超过了全球
    克里雅半导体科技 2025-01-03 16:10 122浏览
  • 每日可见的315MHz和433MHz遥控模块,你能分清楚吗?众所周知,一套遥控设备主要由发射部分和接收部分组成,发射器可以将控制者的控制按键经过编码,调制到射频信号上面,然后经天线发射出无线信号。而接收器是将天线接收到的无线信号进行解码,从而得到与控制按键相对应的信号,然后再去控制相应的设备工作。当前,常见的遥控设备主要分为红外遥控与无线电遥控两大类,其主要区别为所采用的载波频率及其应用场景不一致。红外遥控设备所采用的射频信号频率一般为38kHz,通常应用在电视、投影仪等设备中;而无线电遥控设备
    华普微HOPERF 2025-01-06 15:29 92浏览
  • 彼得·德鲁克被誉为“现代管理学之父”,他的管理思想影响了无数企业和管理者。然而,关于他的书籍分类,一种流行的说法令人感到困惑:德鲁克一生写了39本书,其中15本是关于管理的,而其中“专门写工商企业或为企业管理者写的”只有两本——《为成果而管理》和《创新与企业家精神》。这样的表述广为流传,但深入探讨后却发现并不完全准确。让我们一起重新审视这一说法,解析其中的矛盾与根源,进而重新认识德鲁克的管理思想及其著作的真正价值。从《创新与企业家精神》看德鲁克的视角《创新与企业家精神》通常被认为是一本专为企业管
    优思学院 2025-01-06 12:03 76浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦