在LVGL中,用户界面的基本组成元素是objects,也称为widegts,如Button, Label,Image,List,Chart和Text area。

Attributes

Basic attributes

所有的Object都拥有一些基本属性:

  • Position
  • Size
  • Parent
  • Drag enable
  • Click enable等等

可以通过lv_obj_set_…和lv_obj_get_…来设置或者获取这些属性:

/*Set basic object attributes*/
lv_obj_set_size(btn1, 100, 50);	 /*Button size*/

Specific attributes

不同类型的Object也有各自的属性,例如,Slider拥有如下特殊的属性:

  • 最大值、最小值
  • 当前值
  • Style

对于这些属性,Object有特殊接口。拿Slider举例来说:

/*Set slider specific attributes*/
lv_slider_set_range(slider1, 0, 100);	   /*Set min. and max. values*/
lv_slider_set_value(slider1, 40, LV_ANIM_ON);	/*Set the current value (p

这些特定Object特有的属性接口在相关object的文档中有详细描述。也可以直接查看相关Object的头文件。(例如lv_objx/lv_slider.h)

Working mechanisms

Parent-child structure

父Object可以看成是其子objects的容器。每个Object都有一个明确的父Object(screen除外),但是一个父Object可以有无限多个子Object。对于父Object,没有类型的限制,但是有一些像Button和Label这样很典型的父子关系。

Moving togethre

如果父Object的位置移动了,子object也随之移动。因此,所有的位置关系都是相对于其父Object的。

(0;0)这样的坐标意味着不管父Object在哪里,子Object始终位于父Object的左上角。

image

lv_obj_t * par = lv_obj_create(lv_scr_act(), NULL); /*Create a parent object on the current screen*/
lv_obj_set_size(par, 100, 80);	                   /*Set the size of the parent*/

lv_obj_t * obj1 = lv_obj_create(par, NULL);	         /*Create an object on the previously created parent object*/
lv_obj_set_pos(obj1, 10, 10);	                   /*Set the position of the new object*/

改变父Object的位置:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2fV8AHRG-1626687493758)(https://docs.lvgl.io/7.11/_images/par_child2.png)]

lv_obj_set_pos(par, 50, 50);	/*Move the parent. The child will move with it.*/

(简单起见,上述代码中省去了设置Object的颜色)

Visiblility only on the parent

如果子Object部分或者全部超出了其父Object的范围,那么这部分就不可见了。

image

lv_obj_set_x(obj1, -30);	/*Move the child a little bit of the parent*/

Create-delete objects

LVGL的Object可以在运行时动态创建和删除。这意味着只有当前创建的Object会消耗内存。例如,如果你要一个Chart,那么就在需要的时候创建,当它不可见的时候删除。

每种的Object都有其独特的创建函数,但是这些创建函数有统一的原型。它需要两个参数:

  • 一个指向父Object的指针。创建screen的时候,传入NULL作为父Object。
  • 可选的,一个指向同类型的待复制的object的指针。不用复制的时候这个参数可以传入NULL。

所有的Object都是用一个lv_obj_t类型的指针最为句柄。这个指针稍后可用于设置或者获取Object的属性。

创建的函数形如:

lv_obj_t *lv_<type>_create(lv_obj_t *parent, lv_obj_t *copy);

所有的Object类型都有统一的删除函数,这会删除Object及其所有的子Object。

void lv_obj_del(lv_obj_t *obj);

lv_obj_del会自动删除对象。如果出于某些原因,不能立即删除对象,可以使用lv_obj_del_async(obj)函数。例如,在子Object的IV_EVENT_DELETE事件里面删除父Object。

可以用lv_obj_clean函数删除一个object的所有子Object,而不删除这个Object本身。

void lv_obj_clean(lv_obj_t *obj);

Screens

Create screens

Screen是没有父Object的特殊Object。所以,它们可以这样创建:

lv_obj_t *scr1 = lv_obj_create(NULL, NULL);

Screen可以用任何类型来创建,如Base Object,或者用Image作为墙纸。

Get the active screen

每个Display上总有一个活跃的Screen。默认情况下,LVGL为每个Display创建并载入一个Basic Object作为Screen。

用lv_scr_act()函数来获取当前活跃的Screen。

Load screens

用lv_scr_load(scr1)来载入新的Screen。

Load screen with animation

也可以用lv_scr_load_anim(scr, transition_type, time, delay, auto_del)在载入时增加动画。transiition_type有如下几种:

  • LV_SCR_LOAD_ANIM_NONE:在delay毫秒后立即切换
  • LV_SCR_LOAD_ANIM_OVER_LEFT/RIGHT/TOP/BOTTOM:新Screen向指定方向覆盖老Screen
  • LV_SCR_LOAD_ANIM_MOVE_LEFT/RIGHT/TOP/BOTTOM:新Screen和老Scree都向指定的方向移动
  • LV_SCR_LOAD_ANIM_FADE_ON:淡入

如果向auto_del传true,当动画结束,老的Screen会被自动删除。

当动画在延迟了delay毫秒开始播放的时候,新Screen会成为活跃的Screen。这个时候,用lv_scr_act()就会返回新的Screen。

Handling multiple display

Screen在当前选择的默认的Display上创建。默认的Display是用lv_disp_drv_register()注册的最后一个display,也可以用lv_disp_set_default(disp)来设置默认Display。

lv_scr_act(),lv_scr_load()和lv_scr_load_anim()都是在默认Display上操作。

详见Multi-display support这一章节。

Parts

Widget由一个或多个Part组成。例如,Button只有一个main part,而Slider有background, indicator和knob。

Part的名称形如LV_PART。例如LV_BTN_PART_MAIN和LV_SLIDER_PART_KNOB。通常当Style添加到Object的时候,Part会被用到。通过使用Part,可以对Object的不同部分使用不通的Style。

获取关于Part的更多详细信息,请查看Style overview章节。

States

Object可以处于下列状态的组合状态下。

  • LV_STATE_DEFAULT
  • LV_STATE_CHECKED
  • LV_STATE_FOCUSED
  • LV_STATE_EDITED
  • LV_STATE_HOVERED
  • LV_STATE_PRESSED
  • LV_STATE_DISABLED

当用户对一个Object按压、释放、更改焦点的时候,LVGL会自动更改其State。然而,State也可以手动改变。用lv_obj_set_state(obj, part, LV_STATE_…)来完全改变一个Object的状态。用lv_obj_add/clear_state(obj, part, LV_STATE_…)来设置或者清除某一特定状态。这两种使用方法中,State值都可以用“或”运算组合。

获取更多State信息,请查看Style overview章节。

GitHub 加速计划 / lv / lvgl
30
0
下载
嵌入式图形库,用于为任何微控制器(MCU)、微处理器(MPU)和显示类型创建美观的用户界面(UI)。它通过一个专业且价格合理的拖放式UI编辑器——SquareLine Studio——得到增强。
最近提交(Master分支:10 天前 )
c2965110 Signed-off-by: Robert Budai <robert.budai@analog.com> 3 天前
e7af9006 3 天前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐