LVGL库入门 01 - 样式

一、LVGL样式概述

Styles 用于设置对象的外观。 lvgl 中的样式很大程度上受到 CSS 的启发。

简而言之,其概念如下:

  • 样式是一个 lv_style_t 变量,它可以保存边框宽度、文本颜色等属性。它类似于 CSS 中的“类”。

  • 可以将样式分配给对象以更改其外观。在赋值过程中,可以指定目标部分(CSS 中的pseudo element)和目标状态(pseudo class)。例如,当滑块处于按下状态时,可以将“style_blue”添加到滑块的旋钮。

  • 任何数量的对象都可以使用相同的样式。

  • 样式可以级联,这意味着可以将多个样式分配给一个对象,并且每个样式可以具有不同的属性。因此,并非所有属性都必须在样式中指定。 LVLG 将寻找一个属性,直到一个样式定义它,或者如果它没有被任何样式指定,则使用默认值。例如,style_btn 可以导致默认的灰色按钮,而style_btn_red 只能添加一个background-color=red 来覆盖背景颜色。

  • 后来添加的样式具有更高的优先级。这意味着如果在两种样式中指定了一个属性,则将使用稍后添加的样式。

  • 如果对象中未指定某些属性(例如文本颜色),则可以从父级继承。

  • 对象可以具有比“正常”样式具有更高优先级的本地样式。

  • 与 CSS(伪类描述不同的状态,例如:focus)不同,在 LVGL 中,属性被分配给给定的状态。

  • 当对象改变状态时可以应用转换。

1、创建样式

在 LVGL 中,样式都是以对象的方式存在,一个对象可以描述一种样式。每个控件都可以独立添加样式,创建的样式之间互不影响。

可以使用 lv_style_t 类型创建一个样式并初始化:

static lv_style_t style;
lv_style_init(&style);

样式是延迟渲染的,因此需要使用 static 存储类别说明符或将其声明为全局变量。

样式是多方面的,不仅包括颜色和形状,还包括边距、边框,甚至动画变换效果等细节。

二、样式属性

1、尺寸和位置

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

image

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

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

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

属性描述默认值
width宽度由控件类别决定
min_width最小宽度0
max_width最大宽度屏幕的宽度
height高度由控件类别决定
min_height最小宽度0
max_height最大宽度屏幕的高度
align对齐方式左上方
x对齐后在水平方向的偏移量0
y对齐后在竖直方向的偏移量0

注意这里有一个最小或最大的宽度和高度,可以给它们提供一个阈值防止过大或过小。

在设置宽度和高度时,除了使用确定的数值外,还可以使用百分比值 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 的位置:

image

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

2、边框和边距

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

属性描述默认值
border_width边框宽度,只能用绝对宽度描述0
border_side绘制哪些部分的边框LV_SIDE_ALL
border_post绘制顺序,设置 true 表示包含的子控件绘制完成了再绘制边框false
...与颜色有关的属性将在之后介绍

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

属性描述默认值
pad_top上边距0
pad_bottom下边距0
pad_left左边距0
pad_right右边距0
pad_row当控件拥有布局时,每行间的间距0
pad_column当控件拥有布局时,每列间的间距0

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

3、轮廓

轮廓(outline)类似边框,但轮廓并不算在一个控件的主体内,因此设置坐标、尺寸等属性时都不包含轮廓的尺寸。

轮廓可设置的属性远比边框少。下表列出了轮廓的一些属性:

属性描述默认值
outline_width轮廓宽度0
outline_pad轮廓到主体的间距0
...与颜色有关的属性将在之后介绍

轮廓和边框最根本的差异是两者不是同一个东西,因此可以在同一个元素同时使用不同样式的轮廓的边框来实现一些有趣的效果。

4、阴影

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

属性描述默认值
shadow_width设置阴影的模糊半径0
shadow_ofs_x设置阴影的水平偏移量0
shadow_ofs_y设置阴影的垂直偏移量0
shadow_spread设置阴影的放大量0
...与颜色有关的属性将在之后介绍

例如,以下设置模糊半径为 50 的蓝色阴影:

LVGL 中无法给同一个控件设置多个阴影叠加,从而实现更复杂的效果,这是比较可惜的一点。

5、文本样式

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

属性描述默认值
text_font设置文字的字体默认字体
text_letter_space字符间隔0
text_line_space设置多行文本的行间距0
text_decor设置文本装饰(下划线或删除线)LV_TEXT_DECOR_NONE
text_align设置文本对齐方式LV_TEXT_ALIGN_AUTO
...与颜色有关的属性将在之后介绍

需要注意的是,文本的样式是可继承的,意思是如果子控件没有特别指定的话,它会使用父容器设置的文本样式。

在一段文本内可能存在许多种样式,对此,可以使用类似 CSS 的 span 来拆分样式在文本内的作用域。

span-group 提供的以下函数顶用它对比浮签更符合用于拍卖大段的文件:

函数介绍
lv_spangroup_set_align(obj, align)

设置文本框中文本的对齐方式,可以设置为左对齐、居中对齐或右对齐

lv_spangroup_set_overflow(obj, overflow)设置文本框中文本的溢出处理方式,可以设置为自动换行、截断或滚动
lv_spangroup_set_indent(obj, indent)设置文本框中文本的缩进,可以设置为左缩进、右缩进或无缩进
lv_spangroup_set_mode(obj, mode)设置文本框中文本的换行模式,可以设置为自动换行或不换行,不换行时是将文本框的宽度调整为文本的宽度

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

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

lv_span_t* span = lv_spangroup_new_span(spangroup);
lv_span_set_text(span, "LVGL is an open-source graphics library");
lv_style_set_text_color(&span->style, lv_palette_main(LV_PALETTE_BLUE));

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");

效果为:

image

可以注意到默认的 span-group 是没什么样式的。

6、其它样式

下表列出了一些其它的样式属性:

属性描述默认值
radius设置控件的圆角,该属性会一并影响边框和轮廓0,即无圆角
clip_corner如果有圆角,是否要将 Content-aera 超出圆角的部分去除
layout设置控件的布局方式0
base_dir设置文字的书写方向,它会同时影响布局的方向默认书写方向
...与颜色有关的属性将在之后介绍

在设置半径时可以使用百分数,例如 lv_pct(50) 将使控件变成圆形。

三、参考资料:

Styles — LVGL documentation

官方文档——样式简介

Style properties — LVGL documentation

官方文档——所有的样式属性简介

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Lvgl(LittlevGL)是一个开源的嵌入式图形,它专注于创建漂亮、高效的用户界面。Lvgl 提供了丰富的组件和功能,可以在嵌入式系统中轻松创建各种用户界面。如果你对Lvgl感兴趣,并想学习如何使用它,可以找到一些入门教程的PDF资源。 这些入门教程PDF通常会介绍Lvgl的基础知识,包括如何搭建Lvgl开发环境、如何创建和设计不同类型的界面元素,以及如何添加交互功能等。它们通常还会提供一些实例代码和示例项目,帮助你快速上手。 你可以通过在搜索引擎中输入关键词“Lvgl 入门教程 PDF”,来寻找一些可用的资源。一些开发者和Lvgl社区会分享一些免费的教程,你可以从中获取到基础的学习材料。此外,一些教育和培训机构也会提供付费的教程和课程,深入介绍Lvgl的各个方面,并提供更多实践经验。 当你找到一个合适的PDF教程后,建议你按照教程中的步骤一步一步地学习和实践。通过动手实践,你可以更好地理解Lvgl的使用方法,掌握其核心概念和技巧。 总的来说,Lvgl入门教程的PDF资源可以帮助你了解和学习如何使用这个嵌入式图形,为你在嵌入式系统中创建漂亮的用户界面提供支持。希望你能找到一份适合你的教程,顺利入门Lvgl,并在你的项目中取得成功! ### 回答2: LVGL(Light and Versatile Graphics Library)是一款开源的嵌入式图形,用于快速开发嵌入式GUI界面。它具有轻量级、灵活性强、多平台支持等优点。 LVGL入门教程PDF提供了关于LVGL的初学者指南。这份教程PDF通常包含了以下内容: 1. LVGL的介绍:教程会对LVGL的特点、优势和适用场景进行简要介绍,让读者对LVGL有一个整体的认识。 2. 安装和设置:教程会指导读者如何在开发环境中安装和设置LVGL,包括如何下载文件、配置编译和构建环境等。 3. 基本概念和术语:教程会介绍LVGL中常用的概念和术语,如屏幕、窗口、按钮、标签等,让读者了解这些基本概念和它们的关系。 4. GUI设计:教程会演示如何使用LVGL设计图形用户界面(GUI),包括创建和配置屏幕、添加和定位控件等。 5. 事件处理:教程会讲解如何处理用户操作产生的事件,如触摸屏、按键等,以及如何编写代码来响应这些事件。 6. 高级功能:教程会介绍一些LVGL的高级功能,如动画、主题和样式等,以丰富和定制界面的外观和交互效果。 7. 实例和示例代码:教程通常会提供一些实例和示例代码,以帮助读者更好地理解和运用LVGL。 通过阅读LVGL入门教程PDF,读者可以掌握LVGL的基本概念和用法,并能够使用LVGL进行嵌入式GUI界面开发。 ### 回答3: lvgl(Light and Versatile Graphics Library)是一款优秀的开源图形,以其轻量级和具有扩展性的特点而闻名。如果您正在寻找lvgl入门教程PDF,以下是一些建议: 首先,您可以在lvgl的官方网站上查找相关的入门教程。在官方文档中,您可以找到详细的lvgl教程,包括如何安装和配置lvgl,以及如何使用其不同的功能和工具。 其次,在各大技术论坛和开发社区中,可能也有一些热心的开发者或爱好者分享了关于lvgl入门教程。您可以通过搜索引擎或在相关社区发帖询问,获取更多的资料和资源。 另外,您还可以关注一些专注于嵌入式开发或图形的技术博客和视频教程,这些资源通常会提供高质量的入门指南和示例代码。 不过,值得注意的是,虽然lvgl是一款功能强大的图形,但也需要一定的编程基础才能更好地理解和应用。所以,在学习lvgl之前,建议您先学习一些C语言或其他相关编程语言的基础知识。 总之,通过官方文档、技术论坛、博客和视频教程,您应该能够找到一些入门教程PDF来帮助您更好地理解和学习lvgl。希望您能够顺利掌握lvgl,为您的项目开发带来更多可能性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值