所有的显示内容都在屏幕上,在程序里,屏幕也是个对象,屏幕是没有父类的基础对象。在进行初始化时,会调用 lv_obj_create 函数,按道理应该传入点东西的,但是传入的是 NULL ,在函数实现里,传入 NULL 就要去创建一个屏幕,顺便设置了屏幕的大小。
分析一下 lvgl_init 做了什么事情:
void lv_init(void)
{
/* 初始化显示器链表 */
_lv_ll_init(&LV_GC_ROOT(_lv_disp_ll), sizeof(lv_disp_t));
_lv_ll_init(&LV_GC_ROOT(_lv_indev_ll), sizeof(lv_indev_t));
}
初始化的时候,创建的屏幕有 3 层,平时操作的是最底层用户层,中间层是顶层,放弹出对话框。最上层是系统层,不会被任何东西阻挡,自由运动,放鼠标指针。
顶层实际上是针对用户而言的可以操作的最上层,一般来讲操作用户层就够了。
lv_scr_act(void); /* active screen disp->scr */
lv_layer_top(void); /* top layer disp->top_layer */
lv_layer_sys(void); /* system layer disp->sys_layer */
在这个屏幕基础对象上创建其他所有显示的东西。
在屏幕上创建了一个东西。
lv_obj_t
lvgl 采用面向对象的编程思想(OOP),基本构造块(类)是对象(实例),也就是我们所说的部件(Widgets)就是一个个部件,比如 button、label、image 等等。
首页的 demo 就是一个一个对象堆叠起来的,一个个部件就是一个个对象。
lv_obj_t (类)定义了部件的抽象特点,其定义包含了数据的形式以及对数据的操作。部件(子类)比原本的类(称为父类或基类)要更加具体化,子类会继承父类的属性和行为。
在 lvgl 中,所有的对象都在 lv_obj_t 这个结构体的基础上进行演变,所以我们就看到了各种不一样的部件,就算是一样的部件,继承基础父类(基类)之后演变出来对象(实例)的形态或风格样式都不一样 。现在 Weight 已经派生出 30 多个了
比如不同的部件就有不一样的效果,按钮和下拉列表。比如同样创建出来的按钮部件,可以是红色的,是蓝色的,是有阴影效果并且有被按下时不同的互动效果等等。这样我们看到就是多姿多彩的用户界面了,每个人写出来的界面可能都不一样!
由于 lvgl 使用 c 语言编写,因此 lv_obj_t 只能通过结构体来表示,它并不是一个实例化后的类,因此我们需要先实例化出一个父类(基类),其他所有的部件(对象)都继承自这个父类(基类),也就是我们下节课说到的基础对象(lv_obj)。
使用 lv_obj_t 类实例化一个对象,就叫做基础对象
基础对象的一些属性:
前面初始化的时候,分辨率 1024*600,
一个简单的体验,创建了一个东西,然后画了个标签。
或者直接
总之,都在 lv_scr_act() 的基础上,做后面的事情。在创建一个东西的时候,传入的都是 parent
lv_obj 是一个基础对象。
在屏幕上创建一个基础对象
基础对象里其中有一个属性是大小,有三个个方法与这个属性相关
除了设置也可以查询,函数返回对象的大小
此外还需要控制对象位置,位置有绝对位置和相对位置。位置用坐标的方式来表达。 LCD 坐标原点在屏幕左上角