LVGL 源码分析大全

2023-11-08


1、概述

LVGL 是一款流行的免费和开源嵌入式图形库,为纯C的轻量级GUI框架,支持framebuffer直接渲染图层,因此LVGL能更容易为 MCU、MPU等显示设备开发漂亮的UI。
可视化的 UI 编辑器官方上有推荐使用 SquareLine Studio 工具。当然,也可以选择 NXP(恩智浦半导体) 提供的 GUI Guider 工具。

SquareLine Studio GUI Guider

LVGL官方地址:https://lvgl.io/
中文参考文档:百问网LVGL中文开发手册

2、已完成源码分析文章列表

源码分析在不断更新中,欢迎大家订阅、点赞。有关注的模块请留言给我,可优先考虑撰写。

2.1、硬件抽像层(hal)

LVGL hal indev(porting evdev)
LVGL hal disp(porting display)

2.2、核心框架(core/misc)

LVGL core theme主题管理(lv_theme.c)
LVGL core event事件管理(lv_event.c)
LVGL core obj and obj_class 对象管理(lv_obj.c/lv_obj_class.c)
LVGL core disp显示设计(lv_disp.c)
LVGL core obj_tree对象树管理(lv_obj_tree.c)
LVGL misc timer 定时器(lv_timer.c)
LVGL misc list 列表管理(lv_ll.c)
LVGL misc tlsf算法(lv_tlsf.c)
LVGL misc lru最少使用算法(lv_lru.c)
LVGL misc log日志系统(lv_log.h)
LVGL font 字库管理(lv_font.c)
LVGL core group焦点分组管理(lv_group.c)
LVGL lv_color_t 像素定义详解

2.3、定制功能

【定制功能】LVGL 词条管理
【定制功能】LVGL 页面管理
【定制功能】LVGL 新增图层
【定制功能】字体裁减工具
【定制功能】LVGL 图片缩放
【定制功能】LVGL 多任务异步执行时也按添加顺序执行
【定制功能】LVGL加密资源管理
【定制功能】LVGL 邮件日志功能

2.4、内部接口

【内部接口】LVGL WIFI配网
【内部接口】音量设置接口说明文档
【内部接口】亮度管理接口
【内部接口】升级方案

2.5、案例讲解

【案例讲解】LVGL 如何用LVGL画一个勾
【案例讲解】LVGL GIF开机动画和关机动画
【案例讲解】LVGL 解决字体展示花屏的问题
【案例讲解】LVGL 给label增加滑动条
【案例讲解】LVGL 向UI任务发送顺序执行的延时任务方法
【案例讲解】LVGL 焦点处理示例

2.6、其它

LVGL之增加配置选项

3、样式

在LVGL中,像素分为三种:像素(pixel),百分比(percentage) 和 特殊值(LV_SIZE_CONTENT)。而它的盒子模型(Boxing model) 遵循 CSS 的 border-box 模型。
很显然,这个模型与浏览器默认的盒模型是不一致的。默认的浏览器盒模型为 content-box。

border-box content-box

引用 developer.mozilla.org 中盒模型的说明如下:

  • content-box gives you the default CSS box-sizing behavior. If you set an element’s width to 100 pixels, then the element’s content box will be 100 pixels wide, and the width of any border or padding will be added to the final rendered width, making the element wider than 100px.
  • border-box tells the browser to account for any border and padding in the values you specify for an element’s width and height. If you set an element’s width to 100 pixels, that 100 pixels will include any border or padding you added, and the content box will shrink to absorb that extra width. This typically makes it much easier to size elements. box-sizing: border-box is the default styling that browsers use for the <table>, <select>, and <button> elements, and for <input> elements whose type is radio, checkbox, reset, button, submit, color, or search.

LVGL中的styles(风格样式)很大程序上受到CSS的启发。具体大家可以参考相关的开发文档,这里为了方便大家更好的理解它,我把它与浏览器中的标准CSS样式(以下简称标准CSS样式)做一个简单的对比。
简单而言 LVGL样式仅为标准CSS样式的子集,故LVGL仅支持标准CSS中的部分样式。未实现的部分按属性功能来看,可以分为属性部分功能实现和未支持属性。例如border属性仅为部分功能实现,在LVGL中认为四个方向的线条是同样大小,而标准CSS中却是四个方向的线条可以单独设置的。又例如margin属性却是LVGL中未实现的(网上有提margin采用outline来替换,但严格来讲还是有所区别的)。

4、组件

LVGL的组件分为基础组件、核心组件和额外组件。
基础组件仅有一个Base object(基础对象) (lv_obj),它是所有其它组件的基类;
核心组件有Arc(圆弧) (lv_arc)Bar(进度条) (lv_bar)Button(按钮) (lv_btn)Button matrix(按钮矩阵) (lv_btnmatrix)Canvas(画布) (lv_canvas)Checkbox(复选框) (lv_checkbox)Drop-down list(下拉列表) (lv_dropdown)Image(图象) (lv_img)Label(标签) (lv_label)Line(线条) (lv_line)Roller(滚轮) (lv_roller)Slider(滑动条) (lv_slider)Switch(开关) (lv_switch)Table(表) (lv_table)Text area(文本框) (lv_textarea)
额外组件有 Animation Image (lv_animimg)Calendar (lv_calendar)Chart (lv_chart)Color wheel (lv_colorwheel)Image button (lv_imgbtn)Keyboard(键盘)(lv_keyboard)LED (lv_led)List (lv_list)Menu (lv_menu)Meter (lv_meter)Message box (lv_msgbox)Span (lv_span)Spinbox (lv_spinbox)Spinner (lv_spinner)Tabview (lv_tabview)Tile view (lv_tileview)Window (lv_win)
这里只列举了LVGL提供的基本组件,后续在相关源码分析中会详细再说明。

5、主题

LVGL默认是支持夜景和白景两种场景的主题的。在 lv_conf.h 配置文件中,有相关宏定义如下:

/*A simple, impressive and very complete theme*/
#define LV_USE_THEME_DEFAULT 1
#if LV_USE_THEME_DEFAULT

    /*0: Light mode; 1: Dark mode*/
    #define LV_THEME_DEFAULT_DARK 0

    /*1: Enable grow on press*/
    #define LV_THEME_DEFAULT_GROW 1

    /*Default transition time in [ms]*/
    #define LV_THEME_DEFAULT_TRANSITION_TIME 80
#endif /*LV_USE_THEME_DEFAULT*/

6、开发环境

LVGL的项目是在不断维护的,所以文章可能与维护后的代码有一些出入。因此建议大家参考这些内容,重在理解其设计思想与原理,不要过于纠结一些细节上的差异。
这里说明一下当前写这个文章使用的开发环境。

  • 开发板
    全志R16开发板 Linux系统
  • LVGL 版本
    LVGL v8.2.0 (下载地址:https://github.com/littlevgl/lvgl.git)
    LVGL PORT(lv_port_linux_frame_buffer) v8.2 (下载地址:https://github.com/lvgl/lv_port_linux_frame_buffer)

7、其它

本系列文章为解决实际项目所遇到的典型场景而设计或者分析LVGL源的总集。目标并不是指导如果学习LVGL代码,而项目中遇到的场景该如何解决。一些与项目强关的内容会被模糊描述或者省略,但不会影响到本系列文章的参考意义。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LVGL 源码分析大全 的相关文章

  • 使用 QEMU 模拟 Big Endian ARM 系统

    是否可以编译一些 Linux 内核并通过 QEMU 运行它 模拟一些 Big Endian ARM 处理器 如果 QEMU 无法做到这一点 我很想知道其他可以做到这一点的系统模拟器 我的基本目标是在尽可能多的本机环境中运行和调试专用的 Bi
  • 对 -finstrument-functions 的未定义引用

    我正在尝试跟踪内核函数并且我正在使用 finstrument functions这样做 但我收到未定义的参考错误 如下所示 arch arm kernel elf c 9 undefined reference to cyg profile
  • PWM DMA 到整个 GPIO

    我有一个 STM32F4 我想对一个已与掩码进行 或 运算的 GPIO 端口进行 PWM 处理 所以 也许我们想要 PWM0b00100010一段时间为 200khz 但随后 10khz 后 我们现在想要 PWM0b00010001 然后
  • ARM 汇编不能同时使用立即值和 ADDS/ADCS

    我目前正在尝试使用汇编来加速 Cortex M0 Freescale KL25Z 上的一些 C 函数 我遇到这个最小测试程序的问题 syntax unified cpu cortex m0 text global test code 16
  • arm gcc工具链为arm-elf或arm-none-eabi,有什么区别?

    当您构建 gcc 工具链时 可以将其构建为arm elf 或arm none eabi 但是有什么区别呢 我今天使用 eabi 但这只是因为其他人似乎都这样做 但由于这是一个非常糟糕的论点 因此理解其中的差异真的很高兴 注意 此工具链将为基
  • Android 上原生的自修改代码

    我正在尝试在 Android 上制作一些自修改本机代码并在模拟器中运行它 我的示例基于 android ndk 中的 Hello JNI 示例 它看起来像这样 define NOPE LENGTH 4 typedef void FUNC v
  • 将ELF文件加载到内存中

    我正在尝试将 elf 文件放入内存然后执行它 步骤如下 1 要放入内存的文件 int main printf Hello world n return 0 2 编译它gcc o hello hello c static ELF Header
  • 嵌入式 C++ (ARM9) 单元测试

    我来自 Java 和 JUnit 的世界 我演示了 Hudson 以及我使用 JUnit 取得的所有成果 我想在嵌入式设备上对 C 代码执行相同的操作 但找不到从哪里开始 该项目使用 iccarm exe IAR 编译器 进行编译 现在使用
  • 适用于arm(cortex-m3)的位置独立可执行文件(-pie)

    我正在使用codesourcery g lite 基于gcc4 7 2版本 为stm32 Cortex m3 编程 我希望动态加载可执行文件 我知道我有两个选择 1 可重定位的elf 需要一个elf解析器 2 具有全局偏移寄存器的位置无关代
  • 使用 gnueabihf 为 ARMv6 构建

    我尝试为 ARMv6 构建应用程序 但失败了 我猜问题是工具链支持硬浮点 但 ARMv6 不支持 好吧 首先我设置 march armv6 编译失败 opt gcc linaro arm linux gnueabihf 4 8 2014 0
  • ARM Neon:如何从 uint8x16_t 转换为 uint8x8x2_t?

    我最近发现了关于vreinterpret q dsttype src类型转换运算符 https stackoverflow com a 43519190 2436175 但是 这似乎不支持所描述的数据类型的转换这个链接 http infoc
  • 在 ARM 处理器上执行存储在外部 SPI 闪存中的程序

    我有一个 ARM 处理器 能够与外部闪存芯片连接 写入芯片的是为 ARM 架构编译的程序 可供执行 我需要知道如何将这些数据从外部闪存获取到 ARM 处理器上以供执行 我可以提前运行某种复制例程 将数据复制到可执行内存空间吗 我想我可以 但
  • 交叉编译 Qt 4.7 时出现“非法指令”

    我已经在这个问题上苦苦挣扎了一个多星期了 但仍然找不到解决方案 我正在尝试为 ARM 设备交叉编译 Qt 4 7 嵌入式开源版本 构建过程本身可以顺利完成 但生成的二进制文件似乎包含处理器无法理解的指令 构建主机是 i386 上的 Debi
  • 有没有办法在 Xcode 4 中为 ARM 而不是 Thumb 进行编译?

    如果有很多浮点运算正在进行 Apple 建议针对 ARM 进行编译 而不是针对拇指进行编译 我的整个应用程序几乎是一个大型浮点运算 iOS 应用程序开发工作流程指南中是这样说的 iOS 设备支持两种指令集 ARM 和 Thumb Xcode
  • 分析 Cortex-M7 (stm32f7) 上的 memcpy 性能

    简洁版本 从 GNU ARM 工具链中提取的 memcpy 的性能指标在 ARM Cortex M7 上对于不同的副本大小似乎差异很大 即使复制数据的代码始终保持不变 这可能是什么原因造成的 长版 我是使用 GNU Arm 工具链 11 2
  • 产生并处理软件中断

    有人可以告诉我如何在Linux下生成软件中断然后用request irq处理它吗 或者也许这是不可能的 您可以使用软中断来代替 您可以通过编辑 include linux interrupt h 来定义您的 sofirq 然后使用函数 ra
  • 使用 Android NDK 使用 -fsigned-char 进行构建安全吗?

    为了与其他平台保持一致 我需要使用signed char在我正在处理的一些本机代码中 但默认情况下在Android NDK上char类型是unsigned 我尝试明确使用signed char类型 但它生成太多警告differ in sig
  • 是否可以将 SpaCy 安装到 Raspberry Pi 4 Raspbian Buster

    我一整天都在安装 SpaCy sudo pip install U spacy Looking in indexes https pypi org simple https www piwheels org simple Collectin
  • 在 Intel 机器上构建 Apple Silicon 二进制文件

    如何在 macOS 11 Intel 上编译 C 项目以在 Silicon 上运行 我当前的构建脚本很简单 configure make sudo make install 我尝试过使用 host and target标志与aarch64
  • 了解 U-Boot 内存占用

    我不明白加载 U Boot 时 RAM 中发生了什么 我正在开发 Xilinx Zynq ZC702 评估套件 并尝试使用 U Boot 在其上加载 Linux 内核 于是我使用Xilinx工具Vivado和SDK生成了一个BOOT bin

随机推荐

  • CREATE TABLE 语句

    CREATE TABLE 语句用于创建数据库中的表 语法 CREATE TABLE table name column name1 data type size column name2 data type size column name
  • fwknop SPA服务端源码编译

    fwknop 源码编译 1 背景介绍 2 源码编译 2 1 源码获取 2 2 环境介绍 2 3 对git克隆下来的代码直接进行编译 2 4 挑选出C 部分的服务端进行编译 1 背景介绍 fwknop实现的是SPA Single Packet
  • 初识 flex & bison

    基本概念 flex 和 bison 经常结合使用 分别用于词法分析和语法分析 词法分析器 flex flex 用于生成词法分析器或者说是扫描器 scanner 它将输入的文本分解为称为 tokens 的序列 每个 token 都有一个特定的
  • VSCode下载慢问题

    进入VSCode官网根据自己的电脑选择相应的版本后下载 但是下载过程超级慢 有时候下载一半断开 让人有点崩溃 解决方法 改为国内镜像 打开谷歌浏览器下载内容 找到正下载的vscode 点击上图的链接 跳转到新的窗口 将其路径中的az7642
  • Vue 项目 使用 lang=“scss“ 已经有了 sass-loader 依赖 还是报错

    原因可能是 sass loader 版本太高的原因 安装7 3 1版本 即可解决问题 cnpm install sass loader 7 3 1 save dev
  • element中el-input组件限制输入条件(数字、特殊字符)

    1 只能输入纯数字
  • Spring MVC+Jquery Ajax 前后台传递Json对象

    关于Spring MVC3 X 接收和返回Json 最近开发项目时遇到此问题 解决后 特做下备忘 1 javabean 1 Content java public class Content implements Serializable
  • redis 安装

    一 Redis 介绍 二 Redis 下载 Redis下载官方下载地址 https redis io download 选择需要的版本 三 Redis 安装 将下载好的源文件上传到服务器 以下默认安装路径在 usr local目录下 使用最
  • 计算机应用在学科整合中的课题研究,多媒体计算机技术与学科教学的整合(课题研究阶段总结)...

    多媒体计算机技术与学科教学的整合 2014 12 2015 5 子长县职业教育中心 白勰 在承担课题研究任务以来 由于领导的高度重视 学校采取了切实可行的工作措施 同时也做了大量务实的工作 使课题研究能够顺利地推进 达到了预期效果 为了使课
  • CTP: 为什么报网络原因发送失败,但连接却成功?

    碰到一个很妖的问题 最后请教一位高手把问题定位到 md is logining ptr 0x7f0318027d80 init gt init lt get api version v6 5 1 20200908 10 25 08 get
  • C语言结构体——位段概念的讲解

    前言 之前我对结构体内存分配的方式 对默认对齐数的指令修改做了详细的博客讲解 C语言结构体详解 2 结构体内存对齐 默认对齐数 大家有兴趣的话可以去了解了解这方面的知识 一 什么是位段 位段的声明和结构是类似的 有两个不同 1 位段的成员必
  • 【数据库系统】--【3】DBMS数据组织

    DBMS数据组织 01关系表的数据组织 02索引的数据组织 03元数据的数据组织 04数据组织的优化 01关系表的数据组织 02索引的数据组织 03元数据的数据组织 04数据组织的优化 小结 关系表的数据组织 索引的数据组织 B树索引 HA
  • 华为AP胖瘦模式转换步骤

    华为AP胖瘦模式转换步骤 以AP3010DN AGN为例 瘦模式转换为胖模式 1 待AP启动完成后 从console口登录 波特率为9600 账号默认为admin 密码为admin huawei com 2 登录成功后 AP默认的IP地址为
  • python3+selenium调用浏览器驱动时报错的解决方法

    如题 在python3环境中使用selenium 在调用浏览器驱动时 报错 报错信息如图 报错原因是因为chromeDriver驱动需要与相应的chrome浏览器版本号相对应 解决方法 检查一下浏览器版本号 当前小编的chrome浏览器版本
  • corrupted double-linked list: 0x086a6c50(内存问题)

    新增了一段代码 程序就直接异常了 但是新增的代码没什么问题 但是在qt里面只显示异常也看不出是什么原因导致的 在终端运行了下 就提示有这个错误了 上网搜了一下 是内存的问题 通常有以下容易犯的内存问题 1 内存重复释放 出现double f
  • HTTP快速入门+(请求消息数据格式)+ 防盗链分析

    HTTP 概念 Hyper Text Transfer Protocol 超文本传输协议 传输协议 定义了 客户端和服务器端通信时 发送数据的格式 特点 1 基于TCP IP的高级协议 2 默认端口号 80 3 基于请求 响应模型的 一次请
  • struts2的国际化[三种语言的动态切换]

    一 创建三个资源文件 crms zh CN properties crms en US properties crms zh TW properties 二 struts2的配置文件
  • 远程桌面遇到的问题

    1 Remote Desktop Services服务灰色无法启动 Win R 打开运行 键入 services msc 打开服务界面 找到 Remote Desktop Services 服务 双击打开 确认服务名称为 TermServi
  • Verilog学习心得之三-----task与function的区别

    task和function说明语句分别用来定义任务和函数 特点 1 利用任务和函数可以把一个很大的程序模块分解成许多小的任务和函数 便于理解和调用 2 输入 输出和总线信号的值可以传入 传出任务和函数 3 任务和函数往往还是在程序模块中在不
  • LVGL 源码分析大全

    LVGL 源码分析大全目录 1 概述 2 已完成源码分析文章列表 2 1 硬件抽像层 hal 2 2 核心框架 core misc 2 3 定制功能 2 4 内部接口 2 5 案例讲解 2 6 其它 3 样式 4 组件 5 主题 6 开发环