用户工具

站点工具


icore4tlvgl_4
银杏科技有限公司旗下技术文档发布平台
技术支持电话0379-69926675-801
技术支持邮件Gingko@vip.163.com
版本 日期 作者 修改内容
V1.0 2020-11-16 yang 初次建立

实验四:LVGL对象

一、对象

在 LVGL 中,用户界面的基本构建块是对象,也称为小部件。例如,按钮,标签,图像,列表,图表或文本区域。

二、对象属性

  • 2.1基本属性

在 LVGL 中所有对象类型都共享一些基本属性: 尺寸、父对象、拖动启用、单击启用、位置 可以使用 lv_obj_set_…lv_obj_get_…功能设置/获取这些属性。例如:

/*设置基础对象属性*/
lv_obj_set_size(btn1, 100, 50);    /*按键大小*/
lv_obj_set_pos(btn1, 20,30);       /*按键位置*/
  • 2.2具体属性

对象类型也具有特殊的属性。例如滑块具有 当前值、自定义样式、最小值、最高值 对于这些属性,每种对象类型都有唯一的 API 函数。例如一个滑块:

/*设置滑块的特殊属性*/ 
lv_slider_set_range(slider1, 0, 100);            /* 设置滑块的最小、最大值 */ 
lv_slider_set_value(slider1, 40, LV_ANIM_ON);    /* 设置滑块当下值的位置 */ 
lv_slider_set_action(slider1, my_action);        /* 设置滑块的回调函数 */

对象类型的 API 在其文档中进行了描述,不过用户也可以查看相应的头文件(例如 lv_objx .h 或 lv_slider.h)有更详细的介绍。

三、工作机制

  • 3.1父类-子类的结构

父对象可以视为其子对象的容器。每个对象只有一个父对象(屏幕除外),但是一个父对象可以有无限多个子对象。父对象的类型没有限制,但是有典型的父对象(例如按钮)和典型的子对象(例如标签)。

  • 3.2一起移动

如果更改了父类对象的位置,则子类对象将与父类对象一起移动。因此,所有位置都相对于父类。(0; 0)坐标表示对象将独立于父对象的位置保留在父对象的左上角。

lv_obj_t * par = lv_obj_create(lv_scr_act(), NULL);     /*创建一个父类对象在屏幕中*/ 
lv_obj_set_size(par, 100, 80);                          /*设置父类对象的位置*/ 
lv_obj_t * obj1 = lv_obj_create(par, NULL);             /*创建一个子类对象与父类对象中*/ 
lv_obj_set_pos(obj1, 10, 10);                           /*设置子类对象的位置*/ 

修改父类对象的位置:

lv_obj_set_pos(par, 50, 50);             /*移动父类对象,子类对象跟着移动.*/
  • 3.3仅在父类对象上可见

如果子类对象部分或全部不在其父级之外,则看不见外面的部分。

lv_obj_set_pos(par, 50, 50);            /*移动父类对象,子类对象跟着移动.*/
  • 3.4创建-删除对象

在LVGL中,可以在运行时动态创建和删除对象。这意味着仅当前创建的对象消耗 RAM。例如,如果需要图表,则可以在需要时创建它,并在不可见或不必要时将其删除。 每个对象类型都有自己的带有统一原型的创建功能。它需要两个参数:

(1) 指向父对象的指针。要创建屏幕,请以 NULL 作为父级。

(2) (可选)用于复制具有相同类型的对象的指针。该复制对象可以为 NULL,不复制操作。

所有对象均以 C 语言中的 lv_obj_t 指针作为句柄进行引用。以后可以使用该指针设置或获取对象的属性。 创建函数如下所示:

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

所有对象类型都有一个通用的删除功能。它删除对象及其所有子对象。

void lv_obj_del(lv_obj_t * obj);

lv_obj_del 将立即删除该对象。如果由于任何原因无法立即删除对象,可以使用 lv_obj_del_async(obj)。这很有用,例如,如果您想在子 LV_EVENT_DELETE 信号中删除对象的父对象。 您可以使用以下方法删除对象的所有子对象(但不能删除对象本身)lv_obj_clean

void lv_obj_clean(lv_obj_t * obj);

四、屏幕

  • 4.1创建屏幕

屏幕是没有父对象的特殊对象。因此,可以像这样创建它们:

lv_obj_t * scr1 = lv_obj_create(NULL, NULL);

可以使用任何对象类型创建屏幕。例如,把基础对象或图片作为壁纸。

  • 4.2获取活动屏幕

每个显示器上始终有一个活动屏幕。默认情况下,该库为每个显示器创建并加载一个“基础对象”作为屏幕。要获取当前活动的屏幕,请使用函数 lv_scr_act()来获取活动屏幕。

lv_obj_t * par = lv_obj_create(lv_scr_act(), NULL);     /*第一个参数为获取的当前活动屏幕*/
  • 4.3 加载屏幕

要加载一个新屏幕,使用函数lv_scr_load(scr1)

  • 4.4 动态切换屏幕

也可以使用函数lv_scr_load_anim(scr, transition_type, time, delay, auto_del)动态切换到新屏幕。切换类型如下:

  • LV_SCR_LOAD_ANIM_NONE: 延时delay毫秒后立即切换
  • LV_SCR_LOAD_ANIM_OVER_LEFT/RIGHT/TOP/BOTTOM 新屏幕将从给定方向移入并覆盖旧屏幕
  • LV_SCR_LOAD_ANIM_MOVE_LEFT/RIGHT/TOP/BOTTOM 新屏幕将从给定方向移入,但旧屏幕不被覆盖,而是被新屏幕推出显示器
  • LV_SCR_LOAD_ANIM_FADE_ON 使新屏幕淡入旧屏幕

设置 auto_deltrue 则会在动画结束时自动删除旧屏幕。在切换屏幕delay毫秒后,新屏幕将变为活动状态,此后调用函数lv_scr_act()将返回新屏幕。

  • 4.5 处理多个显示

屏幕在当前选择的默认显示器上创建。默认显示器是通过lv_disp_drv_register最后注册的显示屏,你也可以使用函数lv_disp_set_default(disp)来选择新的默认显示器。 另外函数lv_scr_act()lv_scr_load()lv_scr_load_anim()都在默认屏幕上进行操作。

五、小部件

小部件可以包含多个部分。例如,按钮仅具有主要部分,而滑块则由背景,指示器和旋钮组成。各部分的名称构造类似LV_ + <TYPE> _PART_ <NAME>。例如LV_BTN_PART_MAIN或者LV_SLIDER_PART_KNOB。 当给对象增加样式时通常会使用到小部件。使用小部件可以将不同的样式分配给对象的不同小部件。

六、状态

对象可以处于以下状态的组合:

  • LV_STATE_DEFAULT 正常,已释放
  • LV_STATE_CHECKED 切换或选中
  • LV_STATE_FOCUSED 通过键盘或编码器聚焦或通过触摸板/鼠标单击
  • LV_STATE_EDITED  由编码器编辑
  • LV_STATE_HOVERED 鼠标悬停(现在不支持)
  • LV_STATE_PRESSED 已按下
  • LV_STATE_DISABLED 禁用或不活动

当用户按下,释放,聚焦等对象时,状态通常由库自动更改。但是,状态也可以手动更改。使用lv_obj_set_state(obj, part, LV_STATE…)来完全覆盖当前状态,请使用。要设置或清除给定状态(但保持其他状态不变)使用lv_obj_add/clear_state(obj, part, LV_STATE_…),在两种情况下都可以使用 ORed 状态值。例如lv_obj_set_state(obj, part, LV_STATE_PRESSED | LV_PRESSED_CHECKED)

icore4tlvgl_4.txt · 最后更改: 2022/04/01 11:12 由 sean