0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

简析LVGL基础知识之对象模块

电子工程师 来源:极客笔记 作者:极客笔记 2021-06-11 10:47 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

概述

LVGL 中,用户界面的基本构建块是对象,也称为小部件(widget)。本文主要是介绍LVGL的对象模块。

LVGL基础知识之对象

对象(Objects)

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

查看 LVGL所有的对象类型(widget) 。

对象的属性(Attributes)

对象的基本属性

所有对象类型都共享一些基本属性:

Position (位置)

Size (尺寸)

Parent (父母)

Drag enable (拖动启用)

Click enable (单击启用)

position (位置)

等等

我们可以使用 lv_obj_set _.。。 和 lv_obj_get _.。。 等前缀的函数设置或者获取这些属性。例如:

/* 设置基础对象的属性 */

lv_obj_set_size(btn1, 100, 50); /* 设置按键的大小 */

lv_obj_set_pos(btn1, 20,30); /* 设置按键的位置 */

对象的特殊属性

有些对象类型也具有特殊的属性。例如,滑块具有

Min. max. values (最小最大值)

Current value (当前值)

Custom styles (自定义样式)

对于这些属性,每种对象类型都有唯一的 API 函数。例如一个滑块的 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)

对象的工作机制

亲子结构

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

追随原则

如果更改了父对象的位置,则子对象将与父对象一起移动,并且子对象的位置都保持相对于父对象位置不变。例如,坐标 (0,0) 表示子对象将独立于父对象的位置保留在父对象的左上角,代码:

pYYBAGDC0LqAJMlDAAATv2dZDjk853.jpg

一个父子对象

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); /* 基于前面创建的对象(par)创建一个子对象(obj1),之前的对像成为父对象 */

lv_obj_set_pos(obj1, 10, 10); /* 设置子对象的位置 */

当我们修改父对象的位置,子对象也会一起移动,以保持和父对象的相对位置不变:

poYBAGDC0MCAcbFjAAAMTOzFifo552.jpg

子对象跟随父对象

lv_obj_set_pos(par, 50, 50); /* 移动父对象,子对象也会跟着移动,以保持相对位置不变 */

子对象仅在父对象的范围内可见

如果子对象的部分或全部不在其父级之内,则超出父对象的部分将不可见。

子对象超出父对象的部分不可见

pYYBAGDC0MaAOYs_AAAWYb5vagQ224.jpg

lv_obj_set_x(obj1, -30); /* 将子对象移出一部分到从父对象的范围内之外 */

创建-删除对象

在LVGL中,可以在运行时动态地创建和删除对象。这意味着仅当前创建的对象需要消耗RAM。例如,如果需要图表,我们可以在需要时创建它,并在不可见或不需要时将其删除。

每个对象类型都有各自的创建函数。它需要两个参数:

指向父对象的指针。创建屏幕时以 NULL 作为父级。

用于复制具有相同类型的对象的指针(可选)。如果不行进行复制操作为 NULL。

使用 lv_obj_t 指针作为句柄在 C 代码中引用所有对象。以后可以使用该指针设置或获取对象的属性。

创建函数如下所示:

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);

屏幕对象

创建屏幕对象

屏幕是没有父对象的特殊对象。应该像这样创建它们:

lv_obj_t * scr1 = lv_obj_create(NULL, NULL);

可以使用任何对象类型创建屏幕。例如:创建墙纸的基础对象或图像。

获取活动屏幕

这始终是每个显示屏上的活动屏幕。默认情况下,该库为每个显示创建并加载 “基础对象” 作为屏幕。

要获取当前活动的屏幕使用函数 lv_scr_act()

载入屏幕

调用函数 lv_scr_load(scr1) 加载屏幕。

加载屏幕动画

我们可以调用函数:lv_scr_load_anim(scr, transition_type, time, delay, auto_del) 加载屏幕动画。参数 transition_type 是动画过渡类型,该参数可设为:

LV_SCR_LOAD_ANIM_NONE 延迟x毫秒后立即切换

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() 返回)。

处理多个显示

屏幕在当前选择的默认屏幕上创建。默认显示设备使用 lv_disp_drv_register 注册的最后一个屏幕作为显示,或者可以使用 lv_disp_set_default(disp) 显式选择新的默认显示屏幕。

lv_scr_act() , lv_scr_load() 和 lv_scr_load_anim() 将会在默认的屏幕上操作。

零件-Parts

widget 可以包含多个 Parts 。例如,按钮仅具有主要部分,而滑块则由背景,指示器和旋钮组成。

Parts 名称的构造类似于 LV_ + 《TYPE》 _PART_ 《NAME》 。比如 LV_BTN_PART_MAIN 、 LV_SLIDER_PART_KNOB 。通常在将样式添加到对象时使用 Parts。使用 Parts 可以将不同的样式分配给对象的不同 Parts 。

状态-States

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

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_.。。) 可以组合使用状态值。例如: lv_obj_set_state(obj, part, LV_STATE_PRESSED | LV_PRESSED_CHECKED) 。

以上就关于在 LVGL 中,用户界面的基本构建块之对象的介绍。

责任编辑:lq6

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 对象模
    +关注

    关注

    0

    文章

    1

    浏览量

    6147
  • LVGL
    +关注

    关注

    3

    文章

    127

    浏览量

    4697

原文标题:LVGL基础知识(一)

文章出处:【微信号:gh_ed4f95bde4df,微信公众号:华芯微特32位MCU】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    惠州雷曼入选国家知识产权示范企业创建对象

    近日,国家知识产权局正式公布了2025-2027年度国家知识产权强国建设示范创建对象名单。雷曼光电全资子公司——惠州雷曼,凭借其在知识产权创造、运用、保护和管理方面的体系化优势,成功入
    的头像 发表于 03-03 16:36 1151次阅读

    鸿利智汇成功入选国家知识产权示范企业创建对象

    近日,国家知识产权局公示了2025—2027年知识产权强国建设示范创建对象名单,鸿利智汇集团股份有限公司入选“国家知识产权示范企业创建对象
    的头像 发表于 02-09 14:13 718次阅读

    阻燃系列基础知识

    我很荣幸有机会在这里与大家分享我对阻燃系列基础知识的研究。今天,我们将探讨的主题是“阻燃系列基础知识”。在我们日常生活中,火灾事故频发,造成巨大的财产损失和人员伤亡。因此,了解阻燃材料的基础知识对于
    的头像 发表于 02-06 08:07 742次阅读
    阻燃系列<b class='flag-5'>基础知识</b>

    罗莱迪思入选国家知识产权示范企业创建对象

    近日,国家知识产权局正式公示了2025—2027年知识产权强国建设示范创建对象评审结果,杭州数智光科技“小龙”罗莱迪思凭借在知识产权领域的深厚积淀与实力成功入选国家
    的头像 发表于 01-27 16:06 1008次阅读
    罗莱迪思入选国家<b class='flag-5'>知识</b>产权示范企业创建<b class='flag-5'>对象</b>

    芯原入选国家知识产权示范企业创建对象

    1月12日,国家知识产权局公示了“2025-2027年国家知识产权强国建设示范创建对象”的评审结果,芯原微电子 (上海) 股份有限公司凭借其在知识产权创造、运用、管理和保护方面的扎实基
    的头像 发表于 01-27 15:28 410次阅读

    度亘核芯成功入选“国家知识产权示范企业创建对象

    近日,国家知识产权局正式公布2025-2027年新一批知识产权强国建设示范企业创建对象名单,度亘凭借在知识产权创造、运用、保护、管理全链条的卓越表现成功入选。这一国家级荣誉的加持,既是
    的头像 发表于 01-21 17:31 1569次阅读
    度亘核芯成功入选“国家<b class='flag-5'>知识</b>产权示范企业创建<b class='flag-5'>对象</b>”

    LVGL创始人要来中国?是的!

    我们非常激动地宣布一个重磅消息——LVGL创始人GaborKiss-Vamosi将于1月17日首次来到中国,出席RT-Thread开发者大会(暨20周年庆)!作为全球最受欢迎的嵌入式图形库之一
    的头像 发表于 01-06 12:10 654次阅读
    <b class='flag-5'>LVGL</b>创始人要来中国?是的!

    无刷电机驱动器的基础知识

    本文将从技术角度出发,对三相无刷电机的电机驱动器的作用、种类和规格进行介绍。通过本文,您可以学习到电机驱动器选型所需的基础知识
    的头像 发表于 12-10 14:13 7038次阅读
    无刷电机驱动器的<b class='flag-5'>基础知识</b>

    RK 平台 Vendor Storage 开发指南:基础知识、流程与实用技巧

    备可靠性校验、掉电恢复等关键特性,是保障设备身份标识、功能授权等核心信息安全的重要组件。本文将从基础知识、开发流程、使用途径三方面,为开发者梳理完整的开发逻辑。 一、核心基础知识:了解 Vendor Storage 是什么? 1. 核心定位与核心特性 Vendor Sto
    的头像 发表于 11-22 07:11 1443次阅读
    RK 平台 Vendor Storage 开发指南:<b class='flag-5'>基础知识</b>、流程与实用技巧

    `lv_obj_tree.h` 在 **LVGL v9** 中的位置和作用

    /core/lv_obj_tree.h 核心作用 这个文件是 LVGL 核心模块的一部分,主要负责 UI 对象树的管理,包括: 对象的父子关系维护(添加、删除子
    发表于 11-13 15:49

    重大更新,LVGL有UI编辑器用了,2秒内加载,快到飞起!

    LVGL终于有UI编辑器可以用了,就在10月16日,LVGL官方发布了LVGLProv1.0的候选版本!下面就跟随触觉智能,为您详细解析LVGLPro功能特色:在Linux嵌入式开发领域,LVGL
    的头像 发表于 10-21 12:58 2164次阅读
    重大更新,<b class='flag-5'>LVGL</b>有UI编辑器用了,2秒内加载,快到飞起!

    LVGL近期很多人问,那它和Qt哪个好?

    最近拜访做工业控制、智能家居的客户时,常被问到同一个问题:嵌入式产品,GUI选LVGL还是Qt? 其实工具选择没有绝对的“好”与“坏”,但选对适配场景的GUI图形用户界面工具,能直接让产品开发效率
    的头像 发表于 09-23 15:54 1925次阅读
    <b class='flag-5'>LVGL</b>近期很多人问,那它和Qt哪个好?

    视觉工程师必须知道的工业相机基础知识

    工业相机基础知识概述。
    的头像 发表于 09-19 17:04 1821次阅读
    视觉工程师必须知道的工业相机<b class='flag-5'>基础知识</b>

    Modbus与MQTT的区别

    Modbus和MQTT是工业领域中两种不同的通信协议,在设计目标、应用场景、通信模式等方面存在显著差异,以下从多个维度两者的区别: 1.设计目标与起源 Modbus 诞生于1979年,由施耐德
    的头像 发表于 07-10 14:10 1332次阅读

    使用恩智浦FRDM-MCXN947开发板移植LVGL跑benchmark

    在弹出的组件选择框中查找或者输入lvgl并勾选,导入LVGL组件,如下图所示。
    的头像 发表于 06-20 10:34 2180次阅读
    使用恩智浦FRDM-MCXN947开发板移植<b class='flag-5'>LVGL</b>跑benchmark