logo资料库

LVGL中文手册.pdf

第1页 / 共398页
第2页 / 共398页
第3页 / 共398页
第4页 / 共398页
第5页 / 共398页
第6页 / 共398页
第7页 / 共398页
第8页 / 共398页
资料共398页,剩余部分请下载后查看
lvgl 这篇文章的英文原版我是在 https://lvgl.io/上下载得到的。其实在一开始我本来不想翻译 的,但是用到了 lvgl 时,就顺便翻译了,现在 lvgl 是 7.4.0 版本了吧,如果下方翻译的不好,请不要骂我,因为我 翻译也是不容易的,我把下班的时间用来翻译了,一周上六天班,上班也是挺忙的,下班时从晚上 8 点开始着手 翻译,周日也是花半天时间,花费了两个月时间,所以我希望这份文档对你们有帮助,其实在不影响工作的情 况下,本人也是愿意花费这个时间。也做了不少中文化的工作。所以我是打算利用工作之余,边看边 译,到读完这篇文档,也就有个中文版了,我不希望别人得到这个文档之后去变卖,其实大家一起学习 是最好的。 本人很懒,我不过就是不想花费时间到手机上而已,这文档没有翻译附录,而且译完正文后也没 有做过任何检查。所以如果有任何问题,请不要骂我。 Cai Xuefeng 一个爱玩嵌入式的小锋 Cai Xuefeng
1.1 对象的简介 第一章 LVGL 对象 在 LVGL 中,用户界面的基本构建块是对象,也称为小部件。例如,按钮,标签,图像,列表,图表或文本 区域。在此处检查所有对象类型。 1.2 对象的属性 1.2.1 基本属性 在 LVGL 中所有对象类型都共享一些基本属性: (1) 尺寸 (2) 父母 (3) 拖动启用 (4) 单击启用等 (5) 位置 您可以使用 lv_obj_set_...和 lv_obj_get_...功能设置/获取这些属性。例如: /*设置基础对象属性*/ lv_obj_set_size(btn1, 100, 50); /*按键大小*/ lv_obj_set_pos(btn1, 20,30); /*按键位置*/ 1.2.2 具体属性 对象类型也具有特殊的属性。例如,滑块具有 (1) 当前值 (2) 自定义样式 (3) 最小值、最高值 对于这些属性,每种对象类型都有唯一的 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 / lv_slider.h) 1.3 工作机制 1.3.1 父类-子类的结构 父对象可以视为其子对象的容器。每个对象只有一个父对象(屏幕除外),但是一个父对象可以有无限多个子 Cai Xuefeng
对象。父对象的类型没有限制,但是有典型的父对象(例如按钮)和典型的子对象(例如标签)。 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); /*移动父类对象,子类对象跟着移动.*/ 1.3.3 仅在父类对象上可见 如果子类对象部分或全部不在其父级之外,则看不见外面的部分。 Cai Xuefeng
lv_obj_set_x(obj1, -30); /*Move the child a little bit of the parent*/ 1.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); 1.4 屏幕 1.4.1 创建屏幕 屏幕是没有父对象的特殊对象。因此,可以像这样创建它们: lv_obj_t * scr1 = lv_obj_create(NULL, NULL); 可以使用任何对象类型创建屏幕。例如,创建墙纸的基础对象或图像。 1.4.2 获取活动屏幕 每个显示器上始终有一个活动屏幕。默认情况下,该库为每个显示创建并加载一个“基础对象”作为屏幕。 要获取当前活动的屏幕,请使用函数 lv_scr_act()来获取活动屏幕。 Cai Xuefeng
1.4.3 加载屏幕 要加载新屏幕,如以下函数原型 lv_scr_load(scr1)。 1.4.4 用动画加载屏幕 可以使用加载新屏幕的动画。 lv_scr_load_anim(scr, transition_type, time, delay, auto_del) transition_type 存在以下转换类型,如表 1.4.4.1 所示: 参数 描述 LV_SCR_LOAD_ANIM_NONE 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 会在动画结束时自动删除旧屏幕。lv_scr_act()动画开始播放后,新屏幕将变为活动状 表 1.4.4.1 transition_type 存在以下转换类型描述 态。 1.4.5 处理多个显示 屏幕在当前选择的默认显示上创建。在默认显示是最后的注册显示屏 lv_disp_drv_register,也可以使用显式地 选择一个新的默认显示 lv_disp_set_default(disp)。 lv_scr_act(),lv_scr_load()并 lv_scr_load_anim()在默认屏幕上进行操作。 1.5 小部件 小部件可以包含多个部分。例如,按钮仅具有主要部分,而滑块则由背景,指示器和旋钮组成。 各部分的名称构造如下。例如。通常在将样式添加到对象时使用小部件。使用小部件可以将不同的样式分配 给对象的不同小部件。 LV_ + _PART_ LV_BTN_PART_MAINLV_SLIDER_PART_KNOB 1.6 状态 该对象可以处于以下状态的组合: LV_STATE_DEFAULT 正常,已发布 LV_STATE_CHECKED 切换或选中 LV_STATE_FOCUSED 通过键盘或编码器聚焦或通过触摸板/鼠标单击 LV_STATE_EDITED 由编码器编辑 LV_STATE_HOVERED 鼠标悬停(现在不支持) LV_STATE_PRESSED 已按下 Cai Xuefeng
LV_STATE_DISABLED 禁用或不活动 当用户按下,释放,聚焦等对象时,状态通常由库自动更改。但是,状态也可以手动更改。要完全覆盖当前 状态,请使用。要设置或清除给定状态(但保持其他状态不变), 在两种情况下都可以使用 ORed 状态值。例如。 lv_obj_set_state(obj, part, LV_STATE...) lv_obj_add/clear_state(obj, part, LV_STATE_...) lv_obj_set_state(obj, part, LV_STATE_PRESSED | LV_PRESSED_CHECKED) Cai Xuefeng
第二章 LVGL 的层数 2.1 创建顺序 默认情况下,LVGL 在背景上绘制旧对象,在前景上绘制新对象。 例如,假设我们向一个名为 button1 的父对象添加了一个按钮,然后向另一个名为 button2 的按钮添加了一个 按钮。然后 button1(及其子对象)将在背景中,并且可以被 button2 及其子对象覆盖。 /*创建一个屏幕*/ lv_obj_t * scr = lv_obj_create(NULL, NULL); lv_scr_load(scr); /*加载屏幕*/ /*创建两个按钮*/ lv_obj_t * btn1 = lv_btn_create(scr, NULL); /*创建一个按钮1 在屏幕中*/ lv_btn_set_fit(btn1, true, true); /*使能自动设置大小根据内容*/ lv_obj_set_pos(btn1, 60, 40); /*设置该按钮的位置 */ lv_obj_t * btn2 = lv_btn_create(scr, btn1); /*复制第一个按钮*/ lv_obj_set_pos(btn2, 180, 80); /*设置该按钮的位置*/ /*添加标签与按钮中*/ lv_obj_t * label1 = lv_label_create(btn1, NULL); lv_label_set_text(label1, "Button 1"); lv_obj_t * label2 = lv_label_create(btn2, NULL); /*创建标签于按钮2*/ lv_label_set_text(label2, "Button 2"); /*设置标签的内容*/ /*删除第一个按钮标签*/ lv_obj_del(label2); /*创建一个标签于按钮1*/ /*设置标签内容*/ 2.2 成为前台 有几种方法可以将对象置于前台: Cai Xuefeng
(1) 使用 lv_obj_set_top (obj,true)。如果 obj 或它的任何子对象被点击,那么 LVGL 将自动将该对象带到前台。 它的工作原理类似于 PC 上的典型 GUI。当点击背景中的一个窗口时,它会自动来到前台 (2) 使用 lv_obj_move_foreground(obj)显式地告诉库将一个对象放到前台。类似地,使用 lv_obj_move_background(obj)移动到背景。 (3) 当 lv_obj_set_parent(obj, new_parent)被使用时,obj 将在 new_parent 的前台 2.3 顶层和系统层 LVGL 使用两个特殊的层,分别名为 layer_top 和 layer_sys。两者在显示器的所有屏幕上都是可见的和常见 的。但是,它们不能在多个物理显示器之间共享。layer_top 总是位于默认屏幕的顶部(lv_scr_act()),而 layer_sys 位 于 layer_top 的顶部 用户可以使用 layer_top 创建一些随处可见的内容。例如,一个菜单栏,一个弹出窗口等等。如果单击属性是 启用的,那么 layer_top 将吸收所有用户单击,并作为一个模态 lv_obj_set_click (lv_layer_top(),true); layer_sys 也用于类似的目的在 LVGL 上。例如,它将鼠标光标放在那里,以确保它总是可见的 Cai Xuefeng
分享到:
收藏