【LVGL 学习】样式(style)属性学习

属性

尺寸和位置

要理解尺寸和位置是如何起作用的,首先要理解 LVGL 的盒子模型。官方文档给出了一张图,可以很好地描述一个控件的框架结构:

在这里插入图片描述

在设置尺寸的时候,长和宽指的是包括边框(border)厚度的长宽,也就是不包括轮廓(outline)的总长宽。

在设置位置的时候,设置的坐标指的是 border 左上角相对父容器的 Content area 的坐标,也就是说如果设置坐标为 0 的话,轮廓(outline)可能会被父容器的边框(border)遮盖。

下表总结了尺寸与位置有关的可用属性有:

|  |  |
|--|--|
|  |  |

注意这里有一个最小或最大的宽度和高度,在上一节介绍 flex 和 grid 布局时就展示过控件宽度随布局自动调整的情况,因此可以给它们提供一个阈值防止过大或过小。

不过上一节还有一个地方没有提到:在设置宽度和高度时,除了使用确定的数值外,还可以使用百分比值 lv_pct(x) 来设置控件相对父容器的 Content area 的大小或位置。例如,样式

lv_style_set_width(&style, lv_pct(25));
lv_style_set_x(&style, lv_pct(50));

可以让一个控件的水平尺寸占据父容器的 1/2~3/4 的位置:

在这里插入图片描述
对于父容器而言,还可以使用 LV_SIZE_CONTENT 特殊单位调整其尺寸至可以容纳所有包含控件的合适值。例如,按钮就是一个这样的容器,它的默认样式就通过该值使得其宽度和高度可以自动适应包含的标签尺寸。

边框和边距

上图展示的文本框就有一个深灰色的边框。边框就无需额外描述了,与边框有关的样式属性有:

在这里插入图片描述

边框和主体部分之间被边距(padding)隔开。和边距有关的样式属性有:

在这里插入图片描述
不过在设置布局时,还提供了几个简写属性:可以使用 …pad_all() 一并设置上下左右的边距;或使用 …pad_hor() 和 …pad_ver() 设置水平和垂直的边距;还可以使用 …pad_gap() 设置行和列的间距。

轮廓

轮廓(outline)类似边框,但轮廓并不算在一个控件的主体内,因此设置坐标、尺寸等属性时都不包含轮廓的尺寸。
轮廓可设置的属性远比边框少。下表列出了轮廓的一些属性:

在这里插入图片描述
轮廓和边框最根本的差异是两者不是同一个东西,因此可以在同一个元素同时使用不同样式的轮廓的边框来实现一些有趣的效果,例如:

lv_style_set_radius(&style, 0);
lv_style_set_border_color(&style, lv_palette_main(LV_PALETTE_GREY));
lv_style_set_border_width(&style, 5);
lv_style_set_border_opa(&style, LV_OPA_COVER);
lv_style_set_border_side(&style, LV_BORDER_SIDE_BOTTOM | LV_BORDER_SIDE_RIGHT);
lv_style_set_outline_width(&style, 4);
lv_style_set_outline_pad(&style, 1);
lv_style_set_outline_color(&style, lv_palette_lighten(LV_PALETTE_GREY, 1));

在这里插入图片描述

阴影

阴影可以使控件看起来有立体感。下表列出了设置阴影的一些属性:

在这里插入图片描述
例如,以下设置模糊半径为 50 的蓝色阴影:

lv_style_set_shadow_width(&style, 50);
lv_style_set_shadow_color(&style, lv_palette_main(LV_PALETTE_BLUE));

在这里插入图片描述
以下设置放大有偏移的红色阴影:

lv_style_shadow_color(&style, lv_palette_main(LV_PALETTE_RED))
lv_style_set_shadow_width(&style, 15)
lv_style_set_shadow_ofs_x(&style, 10)
lv_style_set_shadow_ofs_y(&style, 20)
lv_style_set_shadow_spread(&style, 10)

在这里插入图片描述
文本样式

在创建控件时经常要使用文字,下表列出了能影响文字效果的一些属性:

在这里插入图片描述
需要注意的是,文本的样式是可继承的,意思是如果子控件没有特别指定的话,它会使用父容器设置的文本样式。
在一段文本内可能存在许多种样式,对此,可以使用类似 CSS 的 span 来拆分样式在文本内的作用域。为了创建 span ,首先需要创建一个 span-group :

lv_obj_t* spangroup = lv_spangroup_create(lv_scr_act());
lv_obj_set_size(spangroup, 160, LV_SIZE_CONTENT);

创建的 span-group 和一般的控件没什么区别,可以给它添加一些样式:

lv_obj_set_style_border_color(spangroup, lv_palette_main(LV_PALETTE_BLUE), 0);
lv_obj_set_style_border_width(spangroup, 1, 0);
lv_obj_set_style_pad_all(spangroup, 5, 0);

span-group 提供的以下函数使得它相比标签更适合用来处理大段的文本:

在这里插入图片描述
有了 span-group 以后,可以使用以下代码从中创建一个 span 并设置文本:

lv_span_t* span = lv_spangroup_new_span(spangroup);
lv_span_set_text(span, "LVGL is an open-source graphics library");

每一个 span 都提供了一个独立的样式接口,可以单独设置范围内文本的样式:

lv_style_set_text_color(&span->style, lv_palette_main(LV_PALETTE_BLUE));

一个 span-group 可以创建多个 span ,并且它们的样式效果互不影响:

span = lv_spangroup_new_span(spangroup);
lv_span_set_text(span, "providing everything");
lv_style_set_text_decor(&span->style, LV_TEXT_DECOR_UNDERLINE);
lv_style_set_text_font(&span->style, &lv_font_montserrat_20);
/* ... */
span = lv_spangroup_new_span(spangroup);
lv_span_set_text(span, "to create embedded GUI");

在这里插入图片描述
可以注意到默认的 span-group 是没什么样式的。span-group 还有很多的 API ,具体可以参照官方文档的相关介绍。

  • 0
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LVGL是一个开源的GUI库,提供了丰富的控件和样式,可以用于嵌入式系统的图形化界面设计。其中,styleLVGL中非常重要的一个概念,用于定义控件的外观和行为。下面是关于LVGL style的介绍和示例: 1. style的定义和使用 style是一个结构体,包含了控件的各种属性,例如背景颜色、边框、字体等。可以通过lv_style_init()函数初始化一个style,然后通过lv_obj_add_style()函数将style应用到控件上。例如: ```c static lv_style_t style1; lv_style_init(&style1); lv_style_set_bg_color(&style1, LV_STATE_DEFAULT, LV_COLOR_WHITE); lv_style_set_border_color(&style1, LV_STATE_DEFAULT, LV_COLOR_BLACK); lv_obj_add_style(btn1, LV_BTN_PART_MAIN, &style1); ``` 上面的代码定义了一个名为style1的style,将其背景颜色设置为白色,边框颜色设置为黑色,并将其应用到了名为btn1的按钮控件上。 2. state的概念 style中的state用于定义控件的状态,例如默认状态、按下状态、选中状态等。可以通过LV_STATE_XXX宏定义来指定state。例如: ```c 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); ``` 上面的代码分别定义了style1在默认状态、按下状态和选中状态下的背景颜色。 3. style的继承 style可以通过继承来实现样式的复用。可以通过lv_style_set_parent()函数将一个style设置为另一个style的父样式。例如: ```c static lv_style_t style1, style2; lv_style_init(&style1); lv_style_set_bg_color(&style1, LV_STATE_DEFAULT, LV_COLOR_WHITE); lv_style_set_border_color(&style1, LV_STATE_DEFAULT, LV_COLOR_BLACK); lv_style_init(&style2); lv_style_set_parent(&style2, &style1); lv_style_set_bg_color(&style2, LV_STATE_PRESSED, LV_COLOR_GRAY); lv_obj_add_style(btn1, LV_BTN_PART_MAIN, &style1); lv_obj_add_style(btn2, LV_BTN_PART_MAIN, &style2); ``` 上面的代码定义了两个style,其中style2继承了style1,并将其在按下状态下的背景颜色设置为灰色。然后将style1应用到了btn1上,将style2应用到了btn2上。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值