littleVGL学习笔记5——lv_obj 基础对象

1.介绍

  littleVGL 是以对象为概念的,而其最核心的基础对象是 lv_obj 控件,其他的所有专用控件(比如按钮,标签,列表等)都是在此 lv_obj 对象的基础上衍生出来的,所有的控件对象都具有一些共同的属性,如下所示:

  1. 位置(Position)
  2. 大小(Size)
  3. 父类(Parent)
  4. 是否可拖拽(Drag enable)
  5. 是否可点击(Click enable)等等

  你可以通过 lv_obj_set_…和 lv_obj_get_…这样的 API 接口对来读写这些属性。
  下面我们来了解一下对象的工作机制,父对象可以被看作是其子对象的容器,每个对象只有一个父对象(screen 对象没有父对象),父对象可以有无限数量的子对象,同时父对象的类型是没有限制,父对象和子对象之间具有如下 2 点特性:

  1. 一起移动
    如果父对象的位置更改,则子对象将随父对象一起移动,因此子对象的坐标位置是以父对象的左上角而言的,而不是以屏幕的左上角。
  2. 子对象只能在父对象的区域内显示
    如果子对象的一部分在父对象的外面,那么子对象的这一部分将不会被显示出来。

  在littleVGL中,对象可以动态的被创建和删除,每一种对象都有其专属的create创建函数,他需要 2 个参数,为 parent 和 copy 参数,创建函数看起来如下面这样:

lv_obj_t * lv_ <type>_create(lv_obj_t * parent, lv_obj_t * copy);
//parent: 父对象,如果想创建一个 screen 对象,那么请传 NULL 值
//copy: 此参数可选,表示创建新对象时,把 copy 对象上的属性值复制过来

  所有对象的删除函数都是相同的,如下面所示:

void lv_obj_del(lv_obj_t * obj);

  我们再来了解另外一个核心概念 Screen 屏幕对象,屏幕对象是一个特殊的对象,因为他自己没有父对象,所以它以这样的方式来创建:

lv_obj_t * screen1 = lv_obj_create(NULL, NULL);

  默认情况下,littleVGL 会为显示器创建一个 lv_obj 类型的基础对象来作为它的屏幕,即最顶层的父类,可以通过 lv_scr_act()接口来获取当前活跃的屏幕对象。

2.lv_obj 的 API 接口

2.1 littleVGL 库初始化

void lv_init(void)

  这个接口必须得在使用 littleVGL 之前先调用一次,我们直接放在 main 函数中调用即可。

2.2 创建对象

lv_obj_t * lv_obj_create(lv_obj_t * parent, const lv_obj_t * copy);

参数:
parent: 指向父对象,如果传 NULL 的话,则是在创建一个 screen 屏幕。
copy: 此参数可选,表示创建新对象时,把 copy 对象上的属性值复制过来。
返回值:
返回新创建出来的对象句柄,如果为 NULL 的话,说明 littleVGL 所管理的堆空间不足了。

2.3 立即删除对象

lv_res_t lv_obj_del(lv_obj_t * obj);

参数:
obj: 需要被删除的对象。
返回值:
删除成功之后,将会返回 LV_RES_INV,其他值代表删除失败。

2.4 更换父对象

void lv_obj_set_parent(lv_obj_t * obj, lv_obj_t * parent);

参数:
obj: 对象句柄。
parent: 新的父对象。
更换父对象之后,它的相对位置还是保持不变的。

2.5 将对象的层级前置

void lv_obj_move_foreground(lv_obj_t * obj);

2.6 将对象的层级后置

void lv_obj_move_background(lv_obj_t * obj);

2.7 设置对象的坐标位置

void lv_obj_set_pos(lv_obj_t * obj, lv_coord_t x, lv_coord_t y);

2.8 设置对象的大小

void lv_obj_set_size(lv_obj_t * obj, lv_coord_t w, lv_coord_t h);

2.9 设置对象的对齐方式

void lv_obj_align(lv_obj_t * obj, const lv_obj_t * base, lv_align_t align, lv_coord_t x_mod,lv_coord_t y_mod);

参数:
obj: 需要进行对齐的对象
base: 与哪一个对象进行对齐,即为基准或参考对象,如果传 NULL 的话,则默认以父对象为参考
align: 对齐方式,总共有 21 种
x_mod: 指定方式对齐之后,再进行 x 轴方向的偏移修正
Y_mod: 指定方式对齐之后,再进行 y 轴方向的偏移修正

2.10 是否使能自动重新对齐

void lv_obj_set_auto_realign(lv_obj_t * obj, bool en);

参数:
obj: 对象句柄
en: true 是使能自动对齐,false 是禁止自动对齐

  此接口只有在 LV_USE_OBJ_REALIGN 宏使能的前提下才有效,如果使能自动重新对齐功能后,当对象的大小发生改变时,我们就不需要去手动调用lv_obj_realign 接口来再次对齐了,因为 littleVGL 的内部已经帮我们完成了这个操作。
  还有一些许多 API 接口我这里就不列出来了,通过看函数名就能知道大概啥意思了,之后用到的时候再详述。

这段代码定义了一个名为 `lv_frd_scroll_constructor` 的静态函数,其作用是构造一个滚动对象。 首先通过 `lv_obj_set_scrollbar_mode` 函数设置滚动对象的滚动条模式为 `LV_SCROLLBAR_MODE_OFF`,即不显示滚动条;然后通过 `lv_obj_set_scroll_dir` 函数设置滚动对象的滚动方向为横向滚动;接着通过 `lv_obj_set_flex_flow` 函数设置滚动对象的布局模式为流式布局,即子对象自动换行排列;并通过 `lv_obj_set_scroll_snap_x` 函数设置滚动对象的横向滚动对齐方式为居中对齐。 接下来,通过 `lv_obj_add_flag` 函数为滚动对象添加一个滚动一次的标志位,并通过 `lv_obj_clear_flag` 函数清除滚动对象在获得焦点时自动滚动的标志位。然后通过 `lv_obj_set_flex_align` 函数设置滚动对象内部子对象的对齐方式为居中对齐。最后通过 `lv_obj_set_style_pad_all` 和 `lv_obj_set_style_pad_column` 函数设置滚动对象内部子对象的内边距。 注释后的代码如下: ```c static void lv_frd_scroll_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) { LV_UNUSED(class_p); // 设置滚动条模式为不显示滚动条 lv_obj_set_scrollbar_mode(obj, LV_SCROLLBAR_MODE_OFF); // 设置滚动方向为横向滚动 lv_obj_set_scroll_dir(obj, LV_DIR_HOR); // 设置布局模式为流式布局 lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_ROW); // 设置横向滚动对齐方式为居中对齐 lv_obj_set_scroll_snap_x(obj, LV_SCROLL_SNAP_CENTER); // 添加滚动一次的标志位,清除自动滚动标志位 lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_ONE); lv_obj_clear_flag(obj, LV_OBJ_FLAG_SCROLL_ON_FOCUS); // 设置子对象对齐方式为居中对齐 lv_obj_set_flex_align(obj, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); // 设置子对象内边距 lv_obj_set_style_pad_all(obj, 0, LV_PART_MAIN); lv_obj_set_style_pad_column(obj, 10, LV_PART_MAIN); } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贾贾乾杯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值