lvgl - 物件介绍

前言

lvgl是一个开源的图形库,可以用于嵌入式系统中创建美观的用户界面。lvgl提供了多种物件,如按钮、滑块、文本框等,可以让开发者快速地构建出所需的界面。本文将介绍lvgl中的物件的基本概念和操作方法。物件是lvgl中最基本的元素,它们代表了界面上的各种元件,如图标、文字、图形等。物件有自己的属性,如颜色、大小、位置、对齐方式等,可以通过函数或者风格来设置。物件也有自己的事件,如点击、拖动、释放等,可以通过回调函数来处理。

目的

本文旨在介绍lvgl中物件的基本概念和操作方法,包括如何创建、设置大小、设置位置、设置对齐方式、处理父子关系等。通过本文,读者可以了解lvgl中物件的特点和用法,并能够使用物件来构建自己的GUI

设置大小

要设置物件的大小,可以使用 lv_obj_set_size 函数,它接受一个物件指针和两个坐标参数作为输入,分别表示物件的宽度和高度。例如:

lv_obj_t * obj = lv_obj_create(lv_scr_act()); //创建一个基础物件

lv_obj_set_size(obj, 100, 50); //设置物件的宽度为100像素,高度为50像素

除了使用像素值来设置物件的大小外,还可以使用百分比值或者 LV_SIZE_CONTENT 常量来表示相对于父物件或者内容区域的大小。例如:

lv_obj_t * obj = lv_obj_create(lv_scr_act()); //创建一个基础物件
lv_obj_set_size(obj, lv_pct(50), LV_SIZE_CONTENT); //设置物件的宽度为父物件的50%,高度为自适应内容

设置大小时,还需要考虑物件的填充(padding)和轮廓(outline)等属性,它们会影响物件的内容区域和外观。填充是指物件两侧与其子物件之间的空间,轮廓是指物件外围的一圈边框。要设置这些属性,可以使用 lv_obj_set_style_pad_all 和 lv_obj_set_style_outline_width 等函数。例如:

lv_obj_t * obj = lv_obj_create(lv_scr_act()); //创建一个基础物件
lv_obj_set_size(obj, 100, 50); //设置物件的宽度为100像素,高度为50像素
lv_obj_set_style_pad_all(obj, 10, 0); //设置物件的四个方向的填充为10像素
lv_obj_set_style_outline_width(obj, 5, 0); //设置物件的轮廓宽度为5像素

设置位置

要设置物件的位置,可以使用 lv_obj_set_pos 函数,它接受一个物件指针和两个坐标参数作为输入,分别表示物件的x坐标和y坐标。例如:

lv_obj_t * obj = lv_obj_create(lv_scr_act()); //创建一个基础物件
lv_obj_set_pos(obj, 50, 100); //设置物件的x坐标为50像素,y坐标为100像素

除了使用像素值来设置物件的位置外,还可以使用百分比值或者 LV_ALIGN_DEFAULT 等常量来表示相对于父物件或者对齐方式的位置。例如:

lv_obj_t * obj = lv_obj_create(lv_scr_act()); //创建一个基础物件
lv_obj_set_pos(obj, lv_pct(50), LV_ALIGN_CENTER); //设置物件的x坐标为父物件宽度的50%,y坐标为居中对齐

设置位置时,还需要考虑物件的变换(transform)等属性,它们会影响物件的移动和旋转等效果。变换是指在完成布局、对齐和其他定位之后,对物件进行额外的操作,如平移、缩放和旋转等。要设置这些属性,可以使用 lv_obj_set_style_transform_x lv_obj_set_style_transform_zoom 等函数。例如:

lv_obj_t * obj = lv_obj_create(lv_scr_act()); //创建一个基础物件
lv_obj_set_pos(obj, 50, 100); //设置物件的x坐标为50像素,y坐标为100像素
lv_obj_set_style_transform_x(obj, 10, 0); //在x方向上移动物件10像素
lv_obj_set_style_transform_zoom(obj, 200, 0); //将物件放大一倍

设置对齐方式

要设置物件的对齐方式,可以使用 lv_obj_align 函数或者 lv_obj_align_to 函数。lv_obj_align 函数可以设置物件相对于其父物件的对齐方式,lv_obj_align_to 函数可以设置物件相对于另一个物件的对齐方式。这些函数都接受一个物件指针和一个对齐常量作为输入,还可以选择输入x和y方向的偏移量。例如:

lv_obj_t * obj1 = lv_obj_create(lv_scr_act()); //创建一个基础物件

lv_obj_set_size(obj1, 100, 50); //设置物件的宽度为100像素,高度为50像素

lv_obj_align(obj1, LV_ALIGN_CENTER, 0, 0); //设置物件相对于父物件居中对齐

lv_obj_t * obj2 = lv_obj_create(lv_scr_act()); //创建另一个基础物件

lv_obj_set_size(obj2, 50, 25); //设置物件的宽度为50像素,高度为25像素

lv_obj_align_to(obj2, obj1, LV_ALIGN_OUT_BOTTOM_MID, 0, 10); //设置物件相对于obj1在下方居中对齐,并在y方向上偏移10像素

对齐方式有以下几种选项(1)

  • LV_ALIGN_DEFAULT: 相当于 LV_ALIGN_TOP_LEFT ,即以左上角作为原点
  • LV_ALIGN_TOP_LEFT/MID/RIGHT: 分别以左上角、中上方和右上角作为原点
  • LV_ALIGN_BOTTOM_LEFT/MID/RIGHT: 分别以左下角、中下方和右下角作为原点
  • LV_ALIGN_LEFT/RIGHT_MID: 分别以左中方和右中方作为原点
  • LV_ALIGN_CENTER: 以中心点作为原点

如果使用 lv_obj_align_to 函数,还可以在常量前加上 LV_ALIGN_OUT_ 前缀,表示在参考物件的外部对齐。(1)

  • LV_ALIGN_OUT_TOP_LEFT/MID/RIGHT: 分别在参考物件的上方左侧、中间和右侧对齐
  • LV_ALIGN_OUT_BOTTOM_LEFT/MID/RIGHT: 分别在参考物件的下方左侧、中间和右侧对齐
  • LV_ALIGN_OUT_LEFT/RIGHT_MID: 分别在参考物件的左侧和右侧中间对齐

 

图 1

对象的父子关系

lvgl中,每个物件都有一个父物件,除了根物件(screen)。父物件可以包含多个子物件,形成一个树形结构。父子关系会影响物件的位置、大小、可见性、事件传递等。

要创建一个子物件,可以在 lv_obj_create 函数中传入父物件指针作为第一个参数。例如:

lv_obj_t * parent = lv_obj_create(lv_scr_act()); //创建一个基础物件作为父物件


lv_obj_t * child = lv_obj_create(parent); //创建一个基础物件作为子物件

要获取或者修改一个物件的父物件,可以使用 lv_obj_get_parent 或者 lv_obj_set_parent 函数。例如:

lv_obj_t * parent = lv_obj_get_parent(child); //获取子物件的父物件

lv_obj_set_parent(child, lv_scr_act()); //将子物件的父物件修改为根物件

父子关系会影响物件的以下方面:

  • 位置:子物件的位置是相对于父物件的,而不是相对于屏幕的。如果父物件移动了,子物件也会跟随移动。
  • 大小:子物件的大小不能超过父物件的大小,否则会被裁剪。如果父物件改变了大小,子物件也会根据百分比或者自适应等规则改变大小。
  • 可见性:子物件的可见性取决于父物件的可见性。如果父物件隐藏了,子物件也会隐藏。如果父物件显示了,子物件也会显示,除非子物件本身是隐藏的。
  • 事件传递:子物件的事件会传递给父物件,除非子物件消费了该事件。这样可以实现事件的冒泡和捕获等机制。

结语

本文介绍了lvgl中物件的基本概念和操作方法,包括如何创建、设置大小、设置位置、设置对齐方式、处理父子关系等。通过本文,读者可以了解lvgl中物件的特点和用法,并能够使用物件来构建自己的GUI

lvgl是一个功能强大而灵活的图形库,它还提供了许多其他的特性和组件,如布局、样式、主题、动画、字体、图像、小工具等。这些内容将在后续的文章中进行介绍。

Q&A

Q1lvgl物件是什么?

A1lvgl物件是LVGLLight and Versatile Graphics Library)中用来构建用户界面的基本单元,也叫做部件(Widgets)。例如按钮,标签,图片,列表,图表或文本区域等。

Q2lvgl物件有哪些共同的基本属性?

A2lvgl物件都有一些共同的基本属性,例如位置,大小,父物件,拖动启用,点击启用等。您可以使用lv_obj_set_…和lv_obj_get_…函数来设置或获取这些属性。

Q3lvgl物件如何实现父子结构?

A3lvgl物件可以有一个父物件和多个子物件。父物件可以看作是子物件的容器。每个物件(除了屏幕)都有一个父物件,但是一个父物件可以有任意数量的子物件。如果父物件的位置改变了,子物件会跟随移动。因此,所有的位置都是相对于父物件的。如果子物件部分或全部超出了父物件的范围,那么超出的部分将不会可见。

Q4lvgl物件如何创建和删除?

A4:lvgl物件可以在运行时动态地创建和删除。这意味着只有当前创建(存在)的物件占用RAM。这允许您根据需要创建或删除屏幕或其他部件。每种物件类型都有自己的创建函数,它需要两个参数:一个父物件和一个复制模板(可为NULL)。

例如:

lv_obj_t * btn = lv_btn_create(lv_scr_act(), NULL); //在当前屏幕上创建一个按钮

lv_obj_t * label = lv_label_create(btn, NULL); //在按钮上创建一个标签

要删除一个物件,只需调用lv_obj_del函数并传递要删除的物件指针。例如:lv_obj_del(btn);//删除按钮和它的所有子物件

Q5lvgl物件如何设置特定的属性?

A5:除了共同的基本属性外,每种物件类型还有一些特定的属性。例如,滑块有最小值和最大值,当前值等。对于这些特定的属性,每种物件类型可能有独特的API函数。

资料来源:New Bing

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论