LVGL介绍

LVGL(轻量级多功能图形库)是一个免费的开源图形库,提供创建嵌入式 GUI 所需的一切,具有易于使用的图形元素、漂亮的视觉效果和低内存占用。

要求

基本上,每个能够驱动显示器的现代控制器都适合运行 LVGL。最低要求是:

  • 16、32 或 64 位微控制器或处理器

  • > 建议时钟速度为 16 MHz

  • Flash/ROM:> 64 kB(用于非常重要的组件)(建议> 180 kB)

  • 内存:

    • 静态 RAM 使用量:~2 kB,取决于使用的功能和 Widget 类型

    • 堆栈:> 2kB(建议> 8 kB)

    • 动态数据(堆):> 2 KB(如果使用许多 GUI 小部件,建议> 48 kB)。

      LV_MEM_SIZE 在 lv_conf.h 中设置。

    • 显示缓冲区:> “水平分辨率”像素(建议>10 X “水平分辨率” )

    • MCU 或外部显示控制器中的一个帧缓冲器

  • C99 或更新的编译器

基础知识

display

Display(显示器):指的是物理硬件设备,也就是用于实际显示图像和像素的物理设备(例如 LCD 屏幕、OLED 屏幕等)。

lv_display_t(显示对象):是 LVGL 中表示显示器的一个内存对象,它表示一个显示设备,但它并不是物理设备,而是一个存在于内存中的数据结构,用来管理与物理显示设备的交互。LVGL 会通过这个对象来控制显示设备上的内容,例如更新屏幕上的图形或文本。

Screen(屏幕):是一个小部件,是整个界面布局的根,包含所有其他的 UI 元素,并附加到一个具体的 lv_display 上来进行显示。

当第一个显示 (lv_display) 对象被创建时,它将成为默认显示。

Screen

屏幕只是任何没有父级的 Widget(即 parent 在创建期间传递 NULL 作为参数)。因此,它们构成了 Widget 树的“根”。

所有屏幕:

  • 在创建屏幕时自动附加到当前的默认显示;
  • 自动占据相关显示器的全部区域;
  • 无法移动,即 lv_obj_set_pos() 和 lv_obj_set_size() 等功能无法在屏幕上使用。

所有的组件的位置都是相对于父组件的,Screen 没有父控件,所以也就无法移动他的位置;

当一个 lv_display_t 对象被创建时,LVGL 会自动为其创建四个“屏幕”(或层),并将这些屏幕附加到 lv_display_t 对象上。这些屏幕是显示界面上不同部分的图层管理。

  1. 底层(活动屏幕下方,透明,不可滚动,但可点击)
  2. 活动屏幕(这是当前正在显示的屏幕)
  3. 顶层(活动屏幕上方,透明且不可滚动或点击)
  4. 系统层(位于顶层之上,透明,不可滚动,不可点击)

为了使底层可见,活动屏幕的背景必须至少部分透明(如果不是完全透明的话)。

Widget

初始化 LVGL 后,为了创建交互式用户界面,应用程序接下来创建一个 Widget 树,LVGL 可将其渲染到相关显示器,并可与用户进行交互。

Widget 是“智能” LVGL 图形元素,例如基本小部件(简单的矩形和屏幕)、按钮、标签、复选框、开关、滑块、图表等。

初始化:

  1. 在系统执行早期通过调用 lv_init()初始化 LVGL。这需要在进行任何其他 LVGL 调用之前完成。
  2. 初始化您的驱动程序。
  1. lv_timer_handler()通过每隔几毫秒调用一次来管理 LVGL 计时器,从而驱动 LVGL 时间相关任务。

  2. 可选择使用 来设置主题 lv_display_set_theme()。

  3. 此后,在需要使用 LVGL 函数的源文件中 #include “lvgl/lvgl.h”。

LGL 数据流

intro_data_flow

渲染原理

把每个显示的页面看作一个“图层”,然后在这个图层上我们添加不同的 组件(按钮、文本框、进度条等)。

图层

在图层上我们可以自由地添加各种 UI 组件,比如按钮、文本框、图片等。

图层就是显示的背景,它决定了界面显示的整体内容和顺序。

组件

在图层上创建的每个 UI 组件 都是一个“对象”。

比如,一个按钮就是一个对象,一个标签也是一个对象。

每个对象都有自己的 位置、大小、样式(如颜色、边框、字体等),以及 功能(如点击按钮后的反应)。

渲染顺序

每个对象的显示顺序是由它的“层级”决定的

  • 层级 就是指对象显示的前后顺序。可以理解为 z-index,值越大,越靠前显示,覆盖在其他对象之上。
  • 比如,背景图层会被放在最底层,按钮、文字等会放在更上层。

通过设置不同的层级,你可以控制哪些组件显示在最前面,哪些在后面。

更新与绘制

每当有事件发生时(比如按钮被点击,文本框内容变化),界面上相应的组件需要 重新绘制

  • 绘制 是指将组件的内容更新到屏幕上。例如,当按钮被按下时,按钮的颜色和样式可能会改变,系统会重新绘制这个按钮。
  • 局部刷新:只更新有变化的部分,而不是重新绘制整个屏幕,这样可以提高效率。

最终显示

所有的组件渲染(绘制)操作会先在 内存中的缓冲区 完成,这个缓冲区就像是一个“虚拟屏幕”。

当所有组件都准备好之后,系统会把缓冲区的内容 一次性显示 到屏幕上。

F407yihuofeimen