lvgl概览

发布时间 2023-04-07 16:37:01作者: 自动化工程师

写这篇文章的目的在于系统介绍一下LVGL的大概结构和编程的大致方法,可以通过下面的介绍快速入门。本文主要作用不是具体介绍组件和函数的具体用法,只是提供一个思路,具体组件的用法请查看文档docs.lvgl.io
概述:

LVGL是一个轻量级的GUI框架,主要优点就是它的轻量级特点,可以很容易应用于各种系统中开发显示界面。用于嵌入式系统开发有如下优点:

1.开发语言是C语言,意味着适合于大部分嵌入开发人员。

2.轻量级开发应用,对硬件资源要求低,64KROM(推荐180KB),ram 16K,可以采用单framebuffer以降低显示ram要求。

3.MIT license,适合大部分开发者要求。

4.完善的例子和开发文档,方便入手,降低开发难度。

5.提供PC的模拟器,可以在PC上模拟有关开发界面。

6.源代码开放,提供完整的HAL层,可以很容易地移植到各个操作系统。并且现实中有多个硬件系统的移植。

7.易于配置,提供专门的配置参数应用于不同的分辨率

个人认为在一些小屏幕的LCD上优势还是比较明显的。

LVGL把各个对象放在链表里,系统会启动一个定时器的线程,定时读取输入设备,所有的输入设备都在一个链表里,遍历这个链表就可以得到所有的输入事件,同时对象和事件也放在链表中,遍历这些链表就可以得到所有需要处理的事件,然后再通过显示驱动改变显示内容。对于移植就是hal文件夹下的文件。实际上就是三个:tick,indev,disp,对于tick,因为lvgl的线程操作是基于定时器展开的,所以这个tick产生就是一个重要因素。indev顾名思义,就是输入设备,lvgl把输入设备分成了几类,每个输入设备有自己的特定数据,根据这些数据类型你可以确定自己的输入设备属于那一类,对于输入设备都有一个注册函数,在定时器的线程中会调用这个回调函数,把有关的参数读出来放在对应的数据中。disp是显示设备,也是通过一个注册驱动函数实现最后可视的输出。
每个组件都是一个和draw有关的函数,如果想自己添加组件可以通过自己的draw函数实现自定义组件,组件的重绘机制是通过事件机制实现的。

LVGL开发需要掌握的基本概念

组件(widget),事件(event),样式(style),这些都基于lv_obj,obj的基本属性包括 坐标,父对象,子对象,样式和属性。坐标决定了组件在屏幕上的位置。父对象和子对象和构建链表有关,在进行所有对象的遍历的时候通过父对象和子对象就可以遍历全部对象。样式,顾名思义就是对显示属性的一些设置。这里的属性是指一些特殊的属性,比如是否点击以后产生特点事件,是否可以滚动等等。

对于界面的设计可以在网上搜索一下,有NXP的GUIbuilder(免费)和LVGL自己开发(需要收费)的拖拽形式的编辑组件界面,用起来感觉都很方便.如果是自己用现成的组件就要注意一个原则,尽量通过设定组件的style来实现各种显示,而不要通过自己创建新的组件,即自己画新的组件实现,举个例子,如果想画一个圆,目前LVGL的组件没有直接是圆形的组件,但是用label组件,然后设置一个style lv_style_set_radius为 LV_RADIUS_CIRCLE,就可以显示出来一个圆形了。如果要对组件进行排版,可以看一下LVGL的layout组件,按照作者的说法,应该是参考了CSS的布局方式。

lvgl中有一个概念很重要的,就是每个widget都可以分成一个个的parts,比如一个组件可以包括main Part,indicator Part等等,这样在设定style的时候有一个selector的参数,可以指定不同的selector.从而给不同的part指定属性。

具体的编程步骤如下:
1.创建组件,先声明一个lv_obj_t的指针指向自定义的组件,然后调用函数lv_create_xxxx函数,对于不同的组件有不同的创建函数。这个创建函数有一个参数是父指针,指向父组件,设定了父组件以后,所有的组件都会以这个父组件作为参考。
2.创建style,与组件不同,声明的是一个变量而不是指针,然后调用lv_style_init进行初始化。
3.设定style各项属性,有些属性是通用的,比如背景色,有些属性是特殊的,对于不同的组件有不同的设定函数,具体可以参考文档。
4.用lv_obj_add_style对组件设定style.这个函数参数包括指向组件的指针,指向style的指针,以及选择器,
5.用lv_obj_set_pos设定组件的位置。这个函数参数包括指向组件的指针,组件的纵坐标和横坐标
6.用lv_obj_add_event_cb来对组件添加设备,这个函数的参数包括指向组件的指针,发生事件时候的回调函数,以及事件,最后一个参数是回调函数调用时传递的指针。

按照以上的步骤就可以构建自己的UI界面了。