lvgl开发-2.显示例程解析

  1. LVGL开发-2.显示例程的解析
    1. 例程代码的运行
    2. 函数内容
    3. lv_obj_t
    4. 实战修改

LVGL开发-2.显示例程的解析

该博客通过对例程代码进行解析,从而学习LVGL

例程代码的运行

该例程为LVGL库自带例程,函数名字为:lv_example_libpng_1();

导入的步骤省略。运行代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
int main(void)
{

lv_init();
lv_port_disp_init(); // lvgl显示接口初始化,放在lv_init()的后面
lv_example_libpng_1();
while(1)
{
lv_task_handler();
delay_us(1);
}
}

运行效果为在屏幕中央显示文字。

函数内容

该函数的内容如下:

1
2
3
4
5
6
void lv_example_libpng_1(void)
{
lv_obj_t * label = lv_label_create(lv_screen_active());
lv_label_set_text(label, "Hello world");
lv_obj_center(label);
}

需要注意的是,该函数前方有一个宏定义判断,效果为显示图片。我们仅对这部分进行解析。

这段代码使用LVGL创建了一个标签并设置其文本为 “Hello world”,然后将该标签在屏幕上居中显示。

lv_obj_t

lv_obj_t是一个结构体类型,代表一个 LVGL 的对象(object)。

LVGL 中的各种界面元素,如按钮、标签、容器等都是从这个基本的对象类型派生出来的。

lv_obj_t结构体包含了许多用于描述和操作图形对象的成员变量,例如位置、大小、样式、事件处理函数等。通过对这些成员变量的操作,可以实现对图形界面元素的各种属性和行为的控制。

查看定义:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
struct _lv_obj_t {
const lv_obj_class_t * class_p;
lv_obj_t * parent;
lv_obj_spec_attr_t * spec_attr;
lv_obj_style_t * styles;
#if LV_OBJ_STYLE_CACHE
uint32_t style_main_prop_is_set;
uint32_t style_other_prop_is_set;
#endif
void * user_data;
#if LV_USE_OBJ_ID
void * id;
#endif
lv_area_t coords;
lv_obj_flag_t flags;
lv_state_t state;
uint16_t layout_inv : 1;
uint16_t readjust_scroll_after_layout : 1;
uint16_t scr_layout_inv : 1;
uint16_t skip_trans : 1;
uint16_t style_cnt : 6;
uint16_t h_layout : 1;
uint16_t w_layout : 1;
uint16_t is_deleting : 1;
};

发现这个结构体中包含了非常多的成员信息。以下是对该结构体各个成员的解释:

  1. const lv_obj_class_t * class_p:指向对象的类定义结构体的指针,用于确定对象的类型和行为。
  2. lv_obj_t * parent:指向该对象的父对象的指针,用于构建对象层次结构。
  3. lv_obj_spec_attr_t * spec_attr:可能用于存储特定于对象的属性。
  4. lv_obj_style_t * styles:指向对象的样式结构体的指针,用于定义对象的外观。
  5. #if LV_OBJ_STYLE_CACHE 相关部分:可能用于缓存样式相关的属性设置状态。
  6. void * user_data:允许用户关联自定义的数据到对象。
  7. #if LV_USE_OBJ_ID 部分:如果启用了对象 ID 功能,这里将存储对象的唯一标识。
  8. lv_area_t coords:存储对象的坐标和大小信息。
  9. lv_obj_flag_t flags:用于设置对象的各种标志,以控制对象的行为。
  10. lv_state_t state:表示对象的状态,例如正常、按下、禁用等。
  11. uint16_t layout_inv : 1:可能是一个位标志,用于指示布局是否被反转。
  12. uint16_t readjust_scroll_after_layout : 1:位标志,用于指示在布局后是否重新调整滚动。
  13. uint16_t scr_layout_inv : 1:可能与屏幕布局反转相关的标志。
  14. uint16_t skip_trans : 1:位标志,用于指示是否跳过过渡效果。
  15. uint16_t style_cnt : 6:可能用于存储样式的数量。
  16. uint16_t h_layout : 1:位标志,用于指示水平布局状态。
  17. uint16_t w_layout : 1:位标志,用于指示垂直布局状态。
  18. uint16_t is_deleting : 1:位标志,用于指示对象是否正在被删除。

于是我们就得出,lv_obj_t * label;创建了一个lvgl部件的句柄。

1
lv_label_create(lv_screen_active());

这行代码的作用是在当前活动的屏幕上创建一个标签(label)对象。

lv_label_create是 LVGL 中的一个函数,用于创建一个标签对象。它返回一个指向新创建的标签对象的指针(类型为lv_obj_t*)。

lv_screen_active()是另一个 LVGL 函数,它返回当前活动的屏幕对象的指针(同样是lv_obj_t*类型)。这个活动屏幕通常是当前显示在设备上的屏幕,可能是主屏幕或其他活动的显示区域。
通过将lv_screen_active()的结果作为参数传递给lv_label_create,新创建的标签将被添加到当前活动的屏幕上,成为该屏幕上的一个图形元素。之后,可以使用其他 LVGL 函数来设置这个标签的属性,如文本内容、位置、大小、样式等。

那么之后的代码也显而易见了。
lv_label_set_text(label, “Hello world”);

实现的是对这个标签设置一个text文本信息

lv_obj_center(label);

实现的是将这个标签置到屏幕中间。

实战修改


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以邮件至 1186703947@qq.com

💰

×

Help us with donation

相册 动态菜单1