| **银杏科技有限公司旗下技术文档发布平台** |||| |技术支持电话|**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)有更详细的介绍。 {{ :icore4t:icore4t_rtt_lvgl_4_1.png?direct |}} ==== 三、工作机制 ==== * **3.1父类-子类的结构** 父对象可以视为其子对象的容器。每个对象只有一个父对象(屏幕除外),但是一个父对象可以有无限多个子对象。父对象的类型没有限制,但是有典型的父对象(例如按钮)和典型的子对象(例如标签)。 * **3.2一起移动** 如果更改了父类对象的位置,则子类对象将与父类对象一起移动。因此,所有位置都相对于父类。(0; 0)坐标表示对象将独立于父对象的位置保留在父对象的左上角。 {{ :icore4t:icore4t_rtt_lvgl_4_2.png?direct |}} 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); /*设置子类对象的位置*/ 修改父类对象的位置: {{ :icore4t:icore4t_rtt_lvgl_4_3.png?direct |}} lv_obj_set_pos(par, 50, 50); /*移动父类对象,子类对象跟着移动.*/ * **3.3仅在父类对象上可见** 如果子类对象部分或全部不在其父级之外,则看不见外面的部分。 {{ :icore4t:icore4t_rtt_lvgl_4_4.png?direct |}} lv_obj_set_pos(par, 50, 50); /*移动父类对象,子类对象跟着移动.*/ * **3.4创建-删除对象** 在LVGL中,可以在运行时动态创建和删除对象。这意味着仅当前创建的对象消耗 RAM。例如,如果需要图表,则可以在需要时创建它,并在不可见或不必要时将其删除。 每个对象类型都有自己的带有统一原型的创建功能。它需要两个参数: **(1) 指向父对象的指针。要创建屏幕,请以 NULL 作为父级。** **(2) (可选)用于复制具有相同类型的对象的指针。该复制对象可以为 NULL,不复制操作。** 所有对象均以 C 语言中的 **lv_obj_t** 指针作为句柄进行引用。以后可以使用该指针设置或获取对象的属性。 创建函数如下所示: lv_obj_t * lv_ _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_del** 为 **true** 则会在动画结束时自动删除旧屏幕。在切换屏幕**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_ + _PART_ **。例如**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)**。