Layout
Flex
概述
Flexbox(简称为Flex)是CSS Flexbox的一个子集。
它可以将项目安排成行或列(tracks),处理换行,调整项目和tracks之间的间距,处理_grow_以使项目根据最小/最大宽度和高度填充剩余空间。
要将一个对象设置为flex容器,可以调用lv_obj_set_layout(obj, LV_LAYOUT_FLEX)。
请注意,LVGL的flex布局功能需要在lv_conf.h
中通过LV_USE_FLEX
全局启用。
术语
- tracks:行或列
- 主方向:行或列,即项目排列的方向
- 交叉方向:与主方向垂直的方向
- 换行:如果在当前track中没有更多空间,则开始新的track
- grow:如果在项目上设置了grow,它将扩展以填充track上的剩余空间。可用空间将根据项目的grow值分配(值越大,分配的空间越多)
- 间隙:行和列之间或track上的项目之间的空间
简单接口
使用以下函数可以在任何父对象上设置Flex布局。
Flex流动
lv_obj_set_flex_flow(obj, flex_flow)
flex_flow
的可能值有:
LV_FLEX_FLOW_ROW
:将子项放置在一行中,不换行LV_FLEX_FLOW_COLUMN
:将子项放置在一列中,不换行LV_FLEX_FLOW_ROW_WRAP
:将子项放置在一行中,并换行LV_FLEX_FLOW_COLUMN_WRAP
:将子项放置在一列中,并换行LV_FLEX_FLOW_ROW_REVERSE
:将子项放置在一行中,不换行,但顺序相反LV_FLEX_FLOW_COLUMN_REVERSE
:将子项放置在一列中,不换行,但顺序相反LV_FLEX_FLOW_ROW_WRAP_REVERSE
:将子项放置在一行中,换行,但顺序相反LV_FLEX_FLOW_COLUMN_WRAP_REVERSE
:将子项放置在一列中,换行,但顺序相反
Flex对齐
要管理子项的放置,请使用lv_obj_set_flex_align(obj, main_place, cross_place, track_cross_place)
main_place
确定如何在主轴上分配track中的项目。例如,将项目推到LV_FLEX_FLOW_ROW_WRAP
上的右侧。(在CSS中称为justify-content
)cross_place
确定如何在交叉轴上分配track中的项目。例如,如果项目具有不同的高度,将它们放置在track的底部。(在CSS中称为align-items
)track_cross_place
确定如何分配tracks(在CSS中称为align-content
)
可能的值有:LV_FLEX_ALIGN_START
:在水平方向上为左,在垂直方向上为上(默认)LV_FLEX_ALIGN_END
:在水平方向上为右,在垂直方向上为下LV_FLEX_ALIGN_CENTER
:居中LV_FLEX_ALIGN_SPACE_EVENLY
:项目分配均匀,任何两个项目之间的间距(以及到边缘的空间)相等。不适用于track_cross_place
。LV_FLEX_ALIGN_SPACE_AROUND
:项目在track中均匀分布,周围间距相等。请注意,视觉上间距并不相等,因为所有项目在两侧都有相等的空间。第一个项目与容器边缘之间有一个单位的空间,但下一个项目之间有两个单位的空间,因为下一个项目有自己的间距。不适用于track_cross_place
。LV_FLEX_ALIGN_SPACE_BETWEEN
:项目在track中均匀分布:第一个项目在起始线,最后一个项目在终止线。不适用于track_cross_place
。
Flex grow
Flex grow可以用于使一个或多个子项填充track上的可用空间。当多个子项具有grow参数时,可用空间将按grow值成比例分配。例如,有400像素的剩余空间和4个具有grow的对象:
A
的grow值为1B
的grow值为1C
的grow值为2
A
和B
将各自占100像素大小,而C
将占200像素大小。
可以通过lv_obj_set_flex_grow(child, value)在子项上设置flex grow。value
需要大于1或0以禁用子项上的grow。
样式接口
所有与Flex相关的值都是样式属性,可以像其他样式属性一样使用它们。
以下是存在的flex相关样式属性:
FLEX_FLOW
FLEX_MAIN_PLACE
FLEX_CROSS_PLACE
FLEX_TRACK_PLACE
FLEX_GROW
内部填充
要修改Flexbox在对象之间插入的最小空间,可以在flex容器样式上设置以下属性:
pad_row
设置行之间的填充。pad_column
设置列之间的填充。
例如,如果不希望对象之间有任何填充,可以使用lv_style_set_pad_column(&row_container_style, 0)来设置。
其他功能
RTL
如果容器的基础方向设置为LV_BASE_DIR_RTL
,则在ROW
布局中LV_FLEX_ALIGN_START
和LV_FLEX_ALIGN_END
的意义将会互换。即START
将表示右。
在ROW
布局中,项目将从右到左排列,而在COLUMN
布局中,tracks将从右到左排列。
新track
你可以通过lv_obj_add_flag(child, LV_OBJ_FLAG_FLEX_IN_NEW_TRACK)强制Flex将项目放入新行。
Grid
概述
Grid布局是CSS Grid的一个子集。
它可以将项目排列成一个具有行或列(tracks)的二维“表格”。项目可以跨越多个列或行。track的大小可以设置为像素、最大项目的大小(LV_GRID_CONTENT
)或“自由单位”(FR),以按比例分配剩余空间。
要将一个对象设置为grid容器,可以调用lv_obj_set_layout(obj, LV_LAYOUT_GRID)。
请注意,LVGL的grid布局功能需要在lv_conf.h
中通过LV_USE_GRID
全局启用。
术语
- tracks:行或列
- 自由单位(FR):如果track的大小设置为
FR
,它将扩展以填充父容器的剩余空间。 - 间隙:行和列之间或track上项目之间的空间
简单接口
使用以下函数,可以轻松地在任何父对象上设置Grid布局。
Grid描述符
首先需要描述行和列的大小。可以通过声明两个数组并在其中设置track大小来完成。最后一个元素必须是LV_GRID_TEMPLATE_LAST
。
例如:
static int32_t column_dsc[] = {100, 400, LV_GRID_TEMPLATE_LAST}; /*两列,宽度分别为100和400像素*/
static int32_t row_dsc[] = {100, 100, 100, LV_GRID_TEMPLATE_LAST}; /*三行,每行高度为100像素*/
要在父对象上设置描述符,请使用lv_obj_set_grid_dsc_array(obj, col_dsc, row_dsc)。
除了简单的像素大小设置外,你还可以使用两个特殊值:
LV_GRID_CONTENT
将大小设置为适应此track上的最大子项LV_GRID_FR(X)
指定此track应使用剩余空间的比例。值越大,分配的空间越多。
Grid项目
默认情况下,子项不会自动添加到grid中。需要手动将它们添加到单元格中。
为此,调用lv_obj_set_grid_cell(child, column_align, column_pos, column_span, row_align, row_pos, row_span)。
column_align
和row_align
确定如何在单元格中对齐子项。可能的值有:
LV_GRID_ALIGN_START
:在水平方向上表示左对齐,在垂直方向上表示顶部对齐(默认)LV_GRID_ALIGN_END
:在水平方向上表示右对齐,在垂直方向上表示底部对齐LV_GRID_ALIGN_CENTER
:居中对齐
column_pos
和row_pos
表示项目应放置的单元格的从零开始的索引。
column_span
和row_span
表示项目应跨越的track数。必须>= 1
。
Grid对齐
如果有一些空余空间,可以通过多种方式对齐track:
LV_GRID_ALIGN_START
:在水平方向上表示左对齐,在垂直方向上表示顶部对齐(默认)LV_GRID_ALIGN_END
:在水平方向上表示右对齐,在垂直方向上表示底部对齐LV_GRID_ALIGN_CENTER
:居中对齐LV_GRID_ALIGN_SPACE_EVENLY
:项目分布均匀,任何两个项目之间的间距(以及到边缘的空间)相等。不适用于track_cross_place
。LV_GRID_ALIGN_SPACE_AROUND
:项目在track中均匀分布,周围间距相等。请注意,视觉上间距并不相等,因为所有项目在两侧都有相等的空间。第一个项目与容器边缘之间有一个单位的空间,但下一个项目之间有两个单位的空间,因为下一个项目有自己的间距。不适用于track_cross_place
。LV_GRID_ALIGN_SPACE_BETWEEN
:项目在track中均匀分布:第一个项目在起始线,最后一个项目在终止线。不适用于track_cross_place
。
要设置track的对齐方式,请使用lv_obj_set_grid_align(obj, column_align, row_align)。
子Grid
如果将一个控件的列和/或行grid描述符设置为NULL
,它将使用父控件的grid描述符。例如,如果你在父控件的2到6列和1到3行上创建一个grid项目,该grid项目将看到5列和4行,并使用相应的父控件的track大小。
这样,即使在grid上使用包装项目,也可以从grid的角度将其“透明化”。
限制:
- 子grid仅在一级深度解析。也就是说,grid可以有一个子grid,但子grid不能再有其他子grid。
LV_GRID_CONTENT
tracks在子grid中不会处理,只会在其自身的grid中处理。
子grid功能与CSS中的工作方式相同。有关详细信息,请参见此描述。
样式接口
所有与Grid相关的值都是样式属性,可以像其他样式属性一样使用它们。
以下是存在的grid相关样式属性:
GRID_COLUMN_DSC_ARRAY
GRID_ROW_DSC_ARRAY
GRID_COLUMN_ALIGN
GRID_ROW_ALIGN
GRID_CELL_X_ALIGN
GRID_CELL_COLUMN_POS
GRID_CELL_COLUMN_SPAN
GRID_CELL_Y_ALIGN
GRID_CELL_ROW_POS
GRID_CELL_ROW_SPAN
内部填充
要修改Grid在对象之间插入的最小空间,可以在grid容器样式上设置以下属性:
pad_row
设置行之间的填充。pad_column
设置列之间的填充。
其他功能
RTL
如果容器的基础方向设置为LV_BASE_DIR_RTL
,LV_GRID_ALIGN_START
和LV_GRID_ALIGN_END
的意义将会互换。即START
将表示最右侧。
列将从右到左排列。
第三方库
文件系统接口(File System Interfaces)
LVGL提供了一个文件系统模块,为各种文件系统驱动程序提供抽象层。
LVGL内置支持以下文件系统:
- FATFS
- STDIO(Linux和Windows,使用C标准函数,例如
fopen
,fread
) - POSIX(Linux和Windows,使用POSIX函数,例如
open
,read
) - WIN32(Windows,使用Win32 API函数,例如
CreateFileA
,ReadFile
) - MEMFS(从内存缓冲区读取文件)
你仍然需要提供驱动程序和库,此扩展仅提供FATFS、STDIO、POSIX、WIN32和LVGL之间的桥梁。
使用方法
在lv_conf.h
中启用LV_USE_FS_...
,并将一个大写字母分配给LV_FS_..._LETTER
(例如,'S'
)。之后,你可以使用该驱动程序字母访问文件。例如:"S:path/to/file.txt"
。
可以使用LV_FS_..._PATH
设置工作目录。例如:"/home/joe/projects/"
。实际的文件/目录路径将附加在该路径后面。
如果LV_FS_..._CACHE_SIZE
设置为非零值,则支持缓存读取。lv_fs_read()
会缓存此大小的数据,以减少实际从存储器读取的次数。
要使用内存映射文件仿真,需要创建并初始化一个lv_fs_path_ex_t
对象。这个对象可以作为文件名传递给lv_fs_open()
:
lv_fs_path_ex_t mempath;
lv_fs_file_t file;
uint8_t *buffer;
uint32_t size;
/*初始化缓冲区*/
...
lv_fs_make_path_from_buffer(&mempath, LV_FS_MEMFS_LETTER, (void*)buffer, size);
lv_fs_res_t res = lv_fs_open(&file, (const char *)&mempath, LV_FS_MODE_RD);
此示例展示了如何初始化内存路径并打开文件以进行读取。
API
BMP decoder
此扩展允许在LVGL中使用BMP图像。
库源代码:bmp-decoder
像素是按需读取的(而不是整个图像被加载),因此使用BMP图像需要非常少的RAM。
如果在lv_conf.h
中通过LV_USE_BMP
启用,LVGL会自动注册一个新的图像解码器,这样BMP文件可以直接用作图像源。例如:
lv_image_set_src(my_img, "S:path/to/picture.bmp");
请注意,需要注册一个文件系统驱动程序才能从文件中打开图像。有关更多信息,请阅读文件系统部分,或者在lv_conf.h
中启用一个LV_USE_FS_...
。
限制
- 仅支持BMP文件,不支持BMP图像作为C数组(
lv_image_dsc_t
)。这是因为BMP文件和LVGL的图像格式在存储图像数据方面没有实际差异。 - BMP文件只能从文件中加载。如果你想将它们存储在闪存中,最好使用LVGL的图像转换器将它们转换为C数组。
- BMP文件的颜色格式需要与
LV_COLOR_DEPTH
匹配。使用GIMP将图像保存为所需格式。RGB888和ARGB888都适用于LV_COLOR_DEPTH
32
。 - 不支持调色板。
- 因为没有读取整个图像,所以不能进行缩放或旋转。
其他
File Explorer
lv_file_explorer
提供了一个API来浏览文件系统的内容。lv_file_explorer
仅提供文件浏览功能,并不提供实际的文件操作功能。换句话说,你不能像在PC上一样点击图片文件来打开和查看图片。lv_file_explorer
会告诉你当前点击文件的完整路径和名称,文件操作功能需要用户自行实现。
lv_file_explorer
中的文件列表基于lv_table.h,快捷访问栏基于lv_list.h。因此,需要确保启用了lv_table.h和lv_list.h。
使用方法
在lv_conf.h
中启用LV_USE_FILE_EXPLORER
。
首先使用lv_file_explorer_create(lv_screen_active())
来创建一个文件浏览器,默认大小为屏幕大小。之后,你可以像小部件一样自定义样式。
快捷访问
快捷访问栏是可选的。你可以在lv_conf.h
中关闭LV_FILE_EXPLORER_QUICK_ACCESS
,这样快捷访问栏将不会被创建。这样可以节省一些内存,但不会很多。快捷访问栏创建后,可以通过点击浏览区域左上角的按钮将其隐藏,这对于小屏幕设备非常有用。
你可以使用lv_file_explorer_set_quick_access_path(file_explorer, LV_FILE_EXPLORER_QA_XX, "path")
来设置快捷访问栏的路径。目前有以下项目:
LV_FILE_EXPLORER_QA_HOME
LV_FILE_EXPLORER_QA_MUSIC
LV_FILE_EXPLORER_QA_PICTURES
LV_FILE_EXPLORER_QA_VIDEO
LV_FILE_EXPLORER_QA_DOCS
LV_FILE_EXPLORER_QA_MNT
LV_FILE_EXPLORER_QA_FS
排序
你可以使用lv_file_explorer_set_sort(file_explorer, LV_EXPLORER_SORT_XX)
来设置排序方法。
目前有以下排序方法:
LV_EXPLORER_SORT_NONE
LV_EXPLORER_SORT_KIND
你可以自定义排序。自定义排序之前,请将默认排序设置为LV_EXPLORER_SORT_NONE
。默认排序是LV_EXPLORER_SORT_NONE
。
事件
LV_EVENT_READY
:目录打开时发送。你可以自定义排序。LV_EVENT_VALUE_CHANGED
:文件列表中的项目(文件)被点击时发送。
你可以在事件处理函数中使用lv_file_explorer_get_cur_path()
获取当前路径,并使用lv_file_explorer_get_sel_fn()
获取当前选中文件的名称。例如:
static void file_explorer_event_handler(lv_event_t * e)
{
lv_event_code_t code = lv_event_get_code(e);
lv_obj_t * obj = lv_event_get_target(e);
if(code == LV_EVENT_VALUE_CHANGED) {
char * cur_path = lv_file_explorer_get_cur_path(obj);
char * sel_fn = lv_file_explorer_get_sel_fn(obj);
LV_LOG_USER("%s%s", cur_path, sel_fn);
}
}
你还可以通过strcpy()
和strcat()
等函数将获得的路径和文件名保存到数组中以供以后使用。
ChangeLog
v9.0.0
迁移指南
由于v9是一个主要版本,它包含了一些会导致API不兼容的变更。虽然v9的大部分概念变化是内部的,但API也受到了影响,一些组件进行了重命名和重构。
重要提示
如果你要将v8项目更新到v9,需要特别注意以下几点,因为某些部分:
- 不会导致编译错误,但可能会因为相关问题而无法正常运行LVGL
- 会导致难以理解的编译错误
特别注意以下几点: - :cpp:func:
lv_display_set_buffers(display, buf1, buf2, buf_size_byte, mode)
大致相当于v8中的lv_disp_draw_buf_init(&draw_buf_dsc, buf1, buf2, buf_size_px)
,但在v9中,缓冲区大小是以字节为单位设置的。 - 在v9中,
lv_color_t
总是RGB888,无论LV_COLOR_DEPTH
如何设置。 lv_conf.h
发生了很多变化,所以不要忘记从lv_conf_template.h
更新它。- 确保在
lv_conf.h
中没有包含<stdint.h>
。在v9中,我们有一些汇编部分以实现更好的性能,随意的包含会导致汇编部分出错。 - 在线图像转换器尚未更新。在此之前,请使用 LVGLImage.py。
主要新特性
- 运行时显示颜色格式调整,支持RGB888
- 内置支持
pthread
、FreeRTOS
和其他用于渲染的(RT)OSes - 内置支持LVGL的C库和其他标准库
- 更好的并行渲染架构,详见 :ref:
here
- 内置显示和触摸驱动:支持SDL、Linux Frame buffer、NuttX LCD和触摸驱动、ST7789和ILI9341驱动,更多驱动即将推出
- :ref:
observer
允许将数据绑定到UI元素,创建统一且易于维护的API - GitHub CodeSpace集成,使LVGL可以在在线VSCode编辑器中运行,只需三次点击。详见此处
- 通过ThorVG添加矢量图形支持。可用于在Canvas上绘制矢量图形
- :ref:
lv_image
支持对图像源进行对齐、拉伸或平铺,如果组件比图像源大或小
通用API更改
虽然lv_api_map.h 解决了大部分重构问题,但我们鼓励您直接使用最新的API。
lv_disp_...
重命名为lv_display_...
btn_...
重命名为button_...
btnmatrix_...
重命名为buttonmatrix_...
img_...
重命名为image_...
zoom
重命名为scale
angle
重命名为rotation
scr
重命名为screen
act
重命名为active
del
重命名为delete
col
重命名为column
lv_obj_clear_flag
重命名为lv_obj_remove_flag
lv_obj_clear_state
重命名为lv_obj_remove_state
lv_coord_t
被移除,替换为int32_t
新颜色格式管理
LV_IMG_CF_...
被LV_COLOR_FORMAT_...
取代- 支持
LV_COLOR_DEPTH 24
用于RGB888渲染 lv_color_t
始终表示RGB888
显示API
lv_disp_drv_t
和lv_disp_draw_buf_t
被移除- 创建并设置显示的方法:
lv_display_t * disp = lv_display_create(hor_res, ver_res)
lv_display_set_flush_cb(disp, flush_cb);
lv_display_set_buffers(disp, buf1, buf2, buf_size_in_bytes, mode);
- 注意,现在缓冲区大小以字节为单位,而不是像素
-
可以是:mode
LV_DISPLAY_RENDER_MODE_PARTIAL
:这样缓冲区可以比显示屏小,以节省RAM。建议至少使用1/10屏幕大小的缓冲区。LV_DISPLAY_RENDER_MODE_DIRECT
:缓冲区必须为屏幕大小,LVGL会将内容渲染到缓冲区的正确位置。这样缓冲区始终包含整个图像。使用两个缓冲区时,缓冲区内容会自动保持同步。(旧版v7行为)LV_DISPLAY_RENDER_MODE_FULL
:始终重绘整个屏幕。使用两个缓冲区是标准的双缓冲。
- 类似于组件,现在可以为显示附加事件,使用
lv_display_add_event()
monitor_cb
被移除,改为触发LV_EVENT_RENDER_READY
事件- 取消显示背景颜色和图像,添加
lv_layer_bottom()
,可以在其中设置任何颜色或创建任何组件 - 可以在运行时通过调用
lv_display_set_color_format(disp, LV_COLOR_FORMAT_...)
调整显示的目标颜色格式 LV_COLOR_16_SWAP
被移除,可以在flush_cb
中手动调用lv_draw_sw_rgb565_swap()
以进行就地交换disp_drv.scr_transp
被移除,可以改用lv_display_set_color_format(disp, LV_COLOR_FORMAT_NATIVE_ALPHA)
set_px_cb
被移除,可以在flush_cb
中转换渲染后的图像- 更多细节,请查看文档
here /porting/display>
__ 和here /overview/display>
__。
输入设备API
- 类似于显示,
lv_indev_drv_t
被移除,可以像这样创建输入设备: - 类似于组件,现在可以为输入设备附加事件,使用
lv_indev_add_event()
feedback_cb
被移除,改为向输入设备发送LV_EVENT_PRESSED/CLICKED/etc
事件
lv_indev_t * indev = lv_indev_create();
lv_indev_set_type(indev, LV_INDEV_TYPE_...);
lv_indev_set_read_cb(indev, read_cb);
其他
lv_msg
被移除,替换为 lv_observerlv_chart
刻度支持被移除,可以使用 lv_scale 代替lv_msgbox
更新为更灵活。它使用普通按钮代替按钮矩阵lv_tabview
更新为使用真实按钮而非按钮矩阵
v9.1.0 2024年3月20日
新特性
- feat(indev) 添加对指针输入设备的表冠支持 5057
- feat(test): 测试二进制图像是否加载到RAM 5895
- feat(script): 将trace_filter默认跟踪日志文件更改为log_file.systrace 5900
- feat(vg_lite): 根据opa自动选择路径类型 5896
- feat(freertos): 支持Espressif的FreeRTOS版本 5862
- feat(tests): 添加freetype字体压力测试 5828
- feat(vg_lite): 添加描边路径支持 5831
- feat(docs): 添加中文翻译(跳转链接) 5839
- feat(ci): 更新发行版到ubuntu 22.02以修复freetype构建问题 5834
- feat(image_cache): 为图像缓存添加调整大小功能 5829
- feat(nuttx): 添加CPU空闲获取器 5814
- feat(test): 为步幅调整测试添加多种颜色格式 5690
- feat(libjpeg_turbo): 添加JPEG图像EXIF数据解析 5263
- feat(freetype): 更改斜体freetype字体的倾斜度 5812
- feat(vg_lite): 添加矩阵断言 5766
- feat(vg_lite): 添加渐变缓存大小配置和自动释放缓存 5731
- feat(draw_buf): 支持draw_buf_copy中的索引图像 5686
- feat(nuttx): 更新显示驱动 5752
- feat(fs): 实现littlefs lfs.h驱动支持 5562
- feat(test_keyboard): 添加键盘测试 5739
- feat(x11): 添加LV_KEYs 5704
- feat(display): 添加保存截图到文件支持 5481
- feat(decoder): 如果设置了“no_cache”,则不尝试缓存 5688
- feat(event): 返回事件dsc以便稍后移除 5630
- feat(keyboard) 添加Home和End键映射 5675
- feat(draw_buf): 区分lv_image_dsc_t和lv_draw_buf_t 5496
- feat(indev): 在滚动时移除PRESSED状态 5660
- feat(sysmon): 显示最大内存使用量 5661
- feat(image_decoder): 添加步幅警告 5471
- feat(image, layer): 添加位图遮罩功能 5545
- feat(draw-sw): 添加简单的Helium加速 5596
- feat(cache): 使用统一的缓存条目释放回调 5612
- feat(draw_buf): 使用draw_buf作为invalidate_cache API的参数 5602
- feat(script): 添加ARGB8565格式支持 5593
- feat(vg_lite): 添加ARGB8565支持 5592
- feat(vg_lite): 添加GPU空闲刷新 5571
- feat(vg_lite_tvg): 添加缓冲区地址对齐配置 5576
- feat(vg_lite/vector): 为不支持剪刀的兼容处理添加功能 5572
- feat(vg_lite): 移除对RGB565A8的支持 5574
- feat(vg_lite_label): 将路径质量升级为HIGH 5556
- feat(font_glyph_format): 将绘制和字体格式重构为
lv_font_glyph_format_t
5540 - feat(vg_lite): 添加索引格式解码支持 5476
- feat(vector): 添加API以附加弧线 5510
- feat(nuttx_image_cache): 添加独立的图像缓存堆支持 5528
- feat(cache): 重构缓存框架并添加新API 5501
- feat(drivers): 添加libinput/xkb驱动 5486
- feat(draw_buf): 杂项更新 5498
- feat(draw): 添加方便的方法以安全地获取正确的绘制描述符 5505
- feat(profiler): 添加多线程支持和测试用例 5490
- feat(doc): 更新显示相关文档以适应新API 5489
- feat(image_cache): 添加图像头缓存删除功能 5472
- feat(fbdev): 添加文档并允许强制刷新 5444
- feat(script): 添加工具以查看二进制图像 5451
- feat(vg_lite): 添加分析仪工具 5434
- feat(draw_letter): 适配
lv_font_glyph_format_t
用于draw_letter过程 3c1a765 - feat(color): 添加ARGB8565颜色格式 86016a8
性能优化
修复
- fix(obj_tree): 修复对象删除时意外的点击触发 5907
- fix(monkey): 添加缺失的包含文件 5903
- fix(demo/vector_graphic): 添加缺失的缓冲区清除 5898
- fix(image): 修复当LV_BIN_DECODER_RAM_LOAD == 0时的图像解码器 5892
- fix(indev): 修复等待释放时无法清除的滚动对象 5833
- fix(vglite): 更新NXP的VGLite实现 5887
- fix(imagebutton): 修复中间部分的裁剪区域 5849
- fix(drm): 默认为XRGB8888帧缓冲区 5851
- fix(vg_lite): 修复描边路径内存泄漏 5883
- fix(ci): 通过Ubuntu 22.04镜像中的ASAN错误 5867
- fix(conf): 修正导致thorvg未启用的拼写错误 5837
- fix(indev): 始终保存最后一个键 5795
- fix(fsdrv/fatfs): 修复fs_dir_read中未检测到条目结束的问题 5826
- fix(layer): 在状态更改时更新缓存的图层类型 5801
- fix(file_explorer): 修复快速访问编译错误 5783
- fix(msgbox): 在lv_msgbox_get_footer中返回页脚 5804
- fix(x11): 修复删除时的断言 5799
- fix(demo_music): 修复音乐演示中的上一曲按钮不可点击的问题 5808
- fix(draw): 修复未抗锯齿的rgb565a8变换 5782
- fix(freetpye): 修复设置斜体时字体绘制不完整的问题 5807
- fix(fsdrv): 添加缺失的lv_fs_littlefs_init函数声明 5778
- fix(vg_lite): 修复在垂直或水平方向上的错误渲染问题 5789
- fix(env): 在ESP配置中添加*.cpp全局配置 5761
- fix(draw): 修复缩放区域的失效问题 5548
- fix(warning): 变量已设置但未使用 5757
- fix(draw): 修复使用LV_BLEND_MODE_MULTIPLY的rgb565问题 5749
- fix(api_map_v8): 添加一些缺失的函数 5710
- fix(refr): 在直接模式下修复ARGB8888缓冲区清除问题 (#5741) 5758
- fix(draw_buf): 按顺序初始化结构体成员 5753
- fix(refr): 在部分更新模式下考虑步幅 5741
- fix(x11): 修正拼写错误 5742
- fix(draw_vector): 检查路径中点的长度在lv_vector_path_get_bounding中 5734
- fix(vg_lite): 修复绘制图层绘制不完整问题 5729
- fix(test_span): 修复img包含span_1.png,但代码中没有的问题 5736
- fix(vg_lite): 修复绘图命令累积 5730
- fix(vg_lite): 修复矢量渲染填充dsc矩阵未生效 5728
- fix(stdlib): 修复使用LVGL TLSF内存池管理超过4 GiB内存时的问题 5720
- fix(vg_lite): 移除多余的MOVE_TO操作 5713
- fix(nuttx): 修复编译警告 5701
- fix(draw_vector): 移除多余的MOVE_TO操作 5715
- fix(draw_buf): 使用高度作为循环条件而不是检查数据指针 5687
- fix(vg_lite): 修复圆角矩形显示精度丧失问题 5714
- fix(test): 检查编译器标志不应包含’_’ 5706
- fix(imagebutton): 修复示例 5719
- fix(drm): 消除对不存在的lv_api_map.h的使用并启用烟雾测试 5694
- fix(test): 启用-Wpedantic 5676
- fix(pxp): 修复pxp缓存管理回调中的问题 5685
- fix(windows): 通过使用高分辨率滴答计数和定时器延迟实现提高图形性能 5711
- fix(windows): 改进文档 5699
- fix(example): 修复lv_example_obj_2 5697
- fix(draw): 修复禁用LV_DRAW_SW_COMPLEX时的编译错误 5695
- fix(test): 允许在本地Mac上运行测试 5672
- fix(sdl): 修复lv_display_delete上的缓冲区内存泄漏 5692
- fix(decoder): 解码后的图像应始终与原始图像具有相同的宽高 5689
- fix(cache): 修复警告 [5671](https://github.com/lvgl/lvgl
/pull/5671) - fix(dave2d): 跟随lvgl变化 5659
- fix(vg_lite): 修复decoder_close中的拼写错误 5683
- fix(vg_lite): 使用浮点数代替整数以避免类型转换 5682
- fix(formatting): 修复代码格式 5673
- fix(freetype): 在禁用LV_USE_FS_MEMFS时修复构建失败 5651
- fix(array): 使用memmove代替memcopy 5656
- fix(image): 修复错误的日志级别声明 5655
- fix(tests): 修复test_img_emoji_F617.c的错误包含路径 5652
- fix(FreeRTOS): 栈大小计算 5647
- fix(benchmark): 修复FPS计算 5646
- fix(label): 考虑最大宽度 5644
- fix(demo): 修复矢量演示中的内存泄漏 5643
- fix(calendar): 修复未设置默认值时的崩溃 5621
- fix(freetype): 修复使用memfs创建FT字体的问题 5627
- fix(indev): 在预处理器警告中修复变量名 5637
- fix(rle): 当压缩数据不是像素单位时避免缓冲区溢出 5619
- fix(LVGLImage): 使用lv_image_dsc_t代替lv_img_dsc_t 5629
- fix(vg_lite): 修复线性图像在释放后使用的问题 5618
- fix(kconfig): 默认跳过lv_conf.h 5617
- fix(image): 为所有c-array图像添加data_size字段 5608
- fix(doc): 修复显示透明度的错误代码 5607
- fix(refr): 在部分更新模式下考虑步幅 5583
- fix(test): 修复与#5559相关的拼写错误 5594
- fix(sysmon): 修复启用LV_USE_PERF_MONITOR_LOG_MODE时的构建错误 5597
- fix(sdl): 在图层中使用新的绘制缓冲区结构 5578
- fix(benchmark): 改善基准测试 5558
- fix(ffmpeg): 为ffmpeg图像添加缺失的步幅设置 5580
- fix(sysmon): 修复构建错误 5585
- fix(tileview): 在大小更改时自动更新瓷砖位置 5577
- fix(sdl): 修复键盘处理 5575
- fix(lv_conf): 修复lv_conf_template.h中的小错误 5570
- fix(vg_lite): 修复弧形图像未移动到弧形中心的问题 5554
- fix(vg_lite): 添加渐变图像缓冲区检查 5552
- fix(obj): 修复具有半透明渐变的覆盖更改 5531
- fix(vg_lite): 路径矩阵应使用主矢量矩阵 5538
- fix(vg_lite): 修复LV_RADIUS_CIRCLE不圆的问题 5543
- fix(vg_lite): 添加配置以禁用绘制阴影 5534
- fix(neon): 将步幅从px更新为字节 5526
- fix(script): 删除LVGLImage.py的TRUECOLOR 5523
- fix(sysmon): 支持在没有显示器的情况下启动LVGL 5518
- fix(chart): 正确设置系列ID 5482
- fix(vg_lite): 修复裁剪角图像显示错误 5517
- fix(arduino): 更新示例LVGL_Arduino.ino以适应v9 5499
- fix(fb): 正确设置DPI 5508
- fix(layer): 更新覆盖使用的内存计算 5504
- fix(bin_decoder): 修复潜在的垃圾地址释放问题 5509
- fix(decoder): 将ALLOCATED c-array图像视为绘制缓冲区 5483
- fix(vg_lite_tvg): 修复更改目标画布时的释放后使用问题 5497
- fix(keyboard): 在示例中设置阿拉伯字体(如果启用) 5457
- fix(codespaces): 修复codespaces中lv_conf.h未启用的问题 5484
- fix(textarea): 修复大端系统上的接受字符问题 5479
- fix(draw_line): 修复dash_dap等于1且不能正确显示水平线的问题 5473
- fix: 从原型中删除LV_ATTRIBUTE_FAST_MEM函数属性 5467
- fix(arm2d): 对arm-2d加速应用临时补丁 5466
- fix(snapshot): 在截图之前更新组件的布局 5475
- fix(vg_lite): 添加缺少的24位颜色支持检查 5469
- fix(display): 在lv_display中将last_activity_time设置为当前时间 5463
- fix(observer): 修复lv_subject_remove_all_obj 5464
- fix(image
_decoder): 修复解码器未关闭 5437 - fix(nuttx): 修复构建失败 5440
- fix: 使用GCC 11时修复-flto的警告 5433
- fix(assert): 添加新宏以格式化断言消息 5453
- fix(decoder): 如果绘制单元支持索引图像,不要添加到缓存 5438
- fix(bar): 遮罩背景以在值调整时修复 5426
- fix(lvgl.mk): 修复vg_lite_tvg.cpp无法编译 5435
- fix(ci): 使用PlatformIO的dev分支 5432
- fix(vector) : 添加路径边界和矩阵变换函数 5389
- fix(warning): 修复阴影变量警告 47750f1
- fix(thorvg): 将lvgl_thorvgl与lvgl链接 9b09182
- fix(warning): 错误:文件末尾没有换行符 9a6a194
- fix(color): 将RGB565A8 bpp视为RGB565 52426ec
- fix(warning): 错误:在所有C版本中没有原型的函数声明已被弃用 c81f654
示例
文档
- docs: 更新README 5841
- docs: 使添加更多其他翻译变得容易 5874
- docs: 构建文档时忽略README 5840
- docs(st7789): 更新文档并添加STM32的代码示例和逐步指南 5511
- docs(arduino): 更新tick设置 5832
- docs(display): 使用lv_display_delete_refr_timer删除显示定时器 5835
- docs(lv_conf): 显示如何在lv_conf.h中包含内容 5740
- docs(tick): 简化并推广lv_tick_set_cb 5781
- docs(style): 将样式属性输出到style-props.rst 5802
- docs(changelog): 提到LV_COLOR_DEPTH 8尚不支持 5796
- docs(image): 将align更新为inner_align 5721
- docs(README_Zh): 删除SquareLine Studio的提及 5640
- docs(profiler): 修复my_get_cpu_cb实现 5641
- docs(demos): 删除不一致的README 5626
- docs(README): 删除SquareLine Studio的提及 5638
- docs(changelog): 提到v9中删除的更多功能 5632
- docs(micropython): 更新文档中的MicroPython示例 5622
- docs(contributing): 修复链接 5615
- docs(porting): 在移植文档中添加缺失的冒号 5613
- docs(contributing): 更新功能开发工作流程 5601
- docs(tabview): 修复tabview文档 5588
- docs(indev): 记录LV_INDEV_MODE_EVENT与data->continue_reading之间的关系 5586
- docs(pc-simulator): 记录如何手动设置SDL,而无需IDE 5563
- docs(disp): 记录lv_refr_now 5480
- docs(disp): 修复flush_cb示例中的指针转换 5439
- docs(font): 关于“基本目录” 5429
CI和测试
- test(conf): 更新配置并删除已弃用的配置 5881
- tests(freetype): 重构代码结构 5871
- ci(micropython): 捕捉测试中的事件失败 5787
- ci(ref_imgs): 自动生成缺失的参考图像文件夹 5696
- ci(assets): 添加LV_BUILD_TEST保护 5616
- ci(codecov): 禁用CodeCov 5623
- test(asset): 在test_img_emoji_F617中添加保护 5559
- ci(micropython): 使用master分支 5460
- test(snapshot): 为#5475添加测试用例 5478
其他
- chore(cmsis-pack): 为v9.1.0做准备 5917
- chore: 修复头文件包含递归问题 5844
- chore(group): 避免空指针访问 5863
- refactor(conf): 重命名LV_DRAW_SW_LAYER_SIMPLE_BUF_SIZE为LV_DRAW_LAYER_SIMPLE_BUF_SIZE 5798
- chore(freetype): 删除未使用的代码 5885
- chore: 修复编译时警告 5872
- 为缺少的头文件添加
extern "C"
5857 - chore(stdlib): 删除重复的函数声明 5845
- chore(benchmark): 添加可能内存不足
的警告 5797 - chore(group): 添加断言以避免空指针访问 5769
- refact(Kconfig): 根据lv_conf_template.h更新 5780
- 修复lvgl 9.x在rtthread上的编译错误问题 5794
- refact(vg_lite): 抽象出通用的待释放逻辑 5756
- doc(stm32): 修正拼写错误 5772
- doc(cache): 为缓存API添加文档字符串 5718
- chore(docs): 修正拼写错误 5738
- chore(font): 删除未使用的定义 5716
- chore: 在图像资源文件中添加步幅信息 5653
- chore(draw_buf): 删除不必要的信息日志 5634
- chore(cmsis-pack): 追赶更新 5611
- 在输入设备文件中进行更多的杂务工作 5604
- 步幅调整到位 5423
- chore(conf): 使用EXTERNAL和INTERNAL宏配置库 5046
- chore(vg_lite): 使用指针访问矩阵元素 5591
- refactor(image): 将align重命名为inner_align 5560
- chore(deps): 将codecov/codecov-action从3提升到4 5567
- chore(deps): 将carlosperate/arm-none-eabi-gcc-action从1.8.0提升到1.8.1 5565
- chore(deps): 将mymindstorm/setup-emsdk从13提升到14 5566
- chore(deps): 将actions/cache从3提升到4 5568
- chore(deps): 将uraimo/run-on-arch-action从2.6.0提升到2.7.1 5569
- 可选安装演示和库 5387
- chore(arc): 修正拼写错误 5553
- 还原"feat(font_glyph_format): 将绘制和字体格式重构为
lv_font_glyph_format_t
" 5550 - chore(thorvg): 修复警告 5535
- refactor(snapshot): 使用绘制缓冲区接口 5487
- chore(vg_lite): 修正拼写错误 5525
- demo(music): 添加png资产 5520
- chore(indev): 在进行双击和三击支持工作前清理 5512
- chore(demos): 删除未使用的定义 5506
- chore(obj_draw): 删除重复的失效 5503
- chore(widgets): 为MY_CLASS定义添加括号 5485
- chore(draw-sw-transform): 删除重复代码 5488
- chore(README): 修复#5491中的拼写错误 5492
- chore(vg_lite): 移除64字节对齐要求 5477
- chore(refr): 修正拼写错误 5474
- chore(array): 使用array_front并像数组一样使用它 5448
- chore(cache): 仅缓存文件类型图像的头信息 5455
- refactor(indev_scroll): 重构代码 5456
- chore(draw_buf): 在绘制缓冲区中添加头部标志 5449
- chore(Kconfig): 添加缺失的分析仪跟踪缓冲区大小配置 5436
- chore(libpng): 修复警告 5431