Featured image of post LVGL基础

LVGL基础

LVGL

LVGL 中文:欢迎阅读LVGL中文开发手册! — LVGL 文档

移植流程

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
1. 下载源码包  github  lvgl_v8.3.0源码包  +  lvgl提供的案例源码(主源码包 + 分支 lvgl && lvgl_driver)
2. 合并源码包
3. 修改配置文件 lv_conf.h (包含LVGL图形库的功能的启用 每个功能都由宏定义决定是否使用 宏定义作为条件编译的选项 #if / #endif)
3. 修改配置文件 lv_drv_conf.h (包含LVGL图形库的和硬件相关的驱动的启用 由宏定义决定是否使用 宏定义作为条件编译的选项 #if / #endif)
4. 修改Makefile
5. 根据实际需求编写main.c
6. 编译程序  make
7. 检查平台  file  xxx
8. 传输文件
9. 运行程序并观察结果

使用流程

1
2
3
4
5
6
7
1. 调用lv_init()LVGL图形库进行初始化 必须首先调用
2. 初始化硬件设备驱动,比如fbdev_init() evdev_init()
3. 注册显示设备驱动和输入设备驱动(定义结构体变量 + 初始化结构体 + 设置结构体中成员 + 注册)
while(1){
    4.周期性的调用 lv_tick_inc(5);
    5.周期性的调用 lv_timer_handler();
}

注意:

绘制缓冲区的变量必须是静态的 or 全局的 or 动态分配的,不可以是局部变量!

LVGL支持使用两块绘制缓冲区,如果用户只使用一块缓冲区,则LVGL需要等待显示设备对缓冲区内容绘制完成后才可以继续使用缓冲区。

如果用户使用两块绘制缓冲区,则显示设备绘制第一块缓冲区时,LVGL可以操作第二块缓冲区,相当于效率更高。

为了提高效率,最优缓冲区大小可以设置为屏幕分辨率的 1/10

缓冲区大小 = 屏幕宽 × 屏幕高 / 10(像素个数)

为什么不使用局部变量?

普通局部变量存储在栈区,函数退出后内存会被释放,导致LVGL读取到乱码,屏幕花屏、死机、内存非法访问。

static/全局变量放在数据段,程序运行期间永久有效

回调函数

一般是作为函数参数使用的,也就是需要把一个函数的地址作为另一个函数的参数,回调函数不一定会被执行,当用户调用了把回调函数作为参数的那个函数时,回调函数才会执行。

简述回调函数的意义?

解耦:将调用方与具体实现分离,底层只负责触发,不关心具体逻辑。

异步与事件驱动:适用于等待事件发生后再执行的场景,无需阻塞等待。

灵活扩展:通过注册不同回调实现不同功能,不修改底层代码。

对象使用指针作为句柄 lv_obj_t

基础对象

1
2
3
4
5
Position	位置
Size		大小
Parent		父母
Styles		风格
Event handlers	事件回调函数		

可以通过set/get设置对象,函数调用:lv_obj_set_... lv_obj_get_...

1
2
3
/*Set basic object attributes*/
lv_obj_set_size(btn1, 100, 50);	  /*Set a button's size*/
lv_obj_set_pos(btn1, 20,30);      /*Set a button's position*/

特殊对象

对象类型也有特殊属性。例如,slider

  • Minimum and maximum values
  • Current value
1
2
3
/*Set slider specific attributes*/
lv_slider_set_range(slider1, 0, 100);	   				/*Set the min. and max. values*/
lv_slider_set_value(slider1, 40, LV_ANIM_ON);		/*Set the current value (position)*/

创建和删除对象

1
2
3
4
lv_obj_t * lv_<widget>_create(lv_obj_t * parent, <other parameters if any>);
void lv_obj_del(lv_obj_t * obj);	立即删除该对象
lv_obj_clean(obj)					删除对象的所有子节点,不移除对象本身
lv_obj_del_delayed(obj, 1000)		一段时间后删除一个对象

创建屏幕 lv_obj_create(NULL)

1
lv_obj_t * scr1 = lv_obj_create(NULL);

屏幕是没有父对象的特殊对象

获取活动屏幕 lv_scr_act()

加载屏幕 lv_scr_load(scr1)

图层

top layer 顶层(top 层) 可以添加弹窗、悬浮窗

system layer 系统层(sys 层) 可以添鼠标光标、最高级提示加

系统层 (system) > 顶层 (top) > 所有普通控件

常见状态

状态宏定义 中文释义 说明 / 使用场景
LV_STATE_DEFAULT 默认状态 / 正常释放 控件常态,未被操作、未禁用、未选中
LV_STATE_CHECKED 选中 / 勾选 开关打开、复选框勾选、按钮切换选中
LV_STATE_FOCUSED 已聚焦 通过按键 / 编码器 / 触摸 / 鼠标 让控件获得焦点
LV_STATE_FOCUS_KEY 按键聚焦 通过键盘 / 编码器聚焦(非触摸 / 鼠标)
LV_STATE_EDITED 编辑中 编码器正在编辑控件(如调节数值)
LV_STATE_HOVERED 鼠标悬停 鼠标悬浮在控件上(当前 LVGL 暂不支持
LV_STATE_PRESSED 按下中 手指 / 鼠标正在按压控件
LV_STATE_SCROLLED 滚动中 控件正在被滚动(列表 / 滚动容器)
LV_STATE_DISABLED 禁用状态 控件不可点击、不可交互、变灰失效
LV_STATE_USER_1~4 自定义状态 留给用户自己定义的 4 个扩展状态
最后更新于 2026-03-26 23:00
...