LVGL第二篇-组件创建与显示(以slider为例)

一、LVGL 中组件加载步骤

  1. 分配内存与初始化

    • 首先,通过调用相应组件的创建函数来分配内存并初始化组件对象。例如,若要创建一个按钮组件,可使用lv_XXX_create函数。这些创建函数会返回一个指向新创建组件对象(lv_obj_t类型)的指针。在创建过程中,会依据组件类型分配适当的内存空间,用于存储该组件的各种属性,如位置、大小、状态等。
  2. 设置组件属性

    • 在创建组件后,需设置其各种属性,包括位置(lv_obj_set_pos)、大小(lv_obj_set_size)、样式(lv_obj_set_style)等。以设置按钮的位置为例,通过指定xy坐标,可将按钮放置在屏幕或父容器的特定位置。样式属性能够控制组件的外观,如背景颜色、文本颜色、边框样式等。对这些属性的设置可使组件符合应用程序的设计要求。
  3. 添加到父容器(如果有)

    • 许多 LVGL 组件需要添加到一个父容器中才能正确显示。例如,按钮可以添加到一个屏幕对象或者一个容器对象中。通过lv_obj_add_child函数,可将新创建的组件添加到父容器。父容器负责管理其内部子组件的布局和显示顺序。在添加组件到父容器时,LVGL 会根据父容器的布局规则(如线性布局、网格布局等)来确定子组件的最终位置和大小。

二、样例:创建一个滑动组件并实时记录滑动位置

以下是创建一个滑动组件并实时记录滑动位置的代码示例:

lv_obj_t *label;   /*Label to display the slider value*/
lv_obj_t *slider1; /*Slider object*/slider1 = lv_slider_create(lv_scr_act());
lv_slider_set_range(slider1, 0, 100);
lv_slider_set_left_value(slider1, 50, LV_ANIM_ON);
lv_obj_center(slider1);// 设置样式
static lv_style_t style1;
lv_style_init(&style1);
lv_style_set_bg_color(&style1, lv_color_hex(0xa03080));
lv_style_set_border_width(&style1, 2);
lv_obj_add_style(slider1, &style1, LV_PART_MAIN | LV_STATE_DEFAULT);label = lv_label_create(lv_scr_act());lv_obj_align_to(label, slider1, LV_ALIGN_OUT_TOP_MID, 0, -15);               /*Align top of the slider*/
lv_obj_add_event_cb(slider1, slider_event_cb, LV_EVENT_VALUE_CHANGED, NULL); /*Assign an event function*/

添加滑动时值改变的信号LV_EVENT_VALUE_CHANGED并注册回调函数slider_event_cb,设置文本的值:

static void slider_event_cb(lv_event_t *e)
{lv_obj_t *slider = lv_event_get_target(e);if (e->code == LV_EVENT_VALUE_CHANGED){/*Refresh the text*/lv_label_set_text_fmt(label, "%" LV_PRId32, lv_slider_get_value(slider));lv_obj_align_to(label, slider1, LV_ALIGN_OUT_TOP_MID, 0, -15); /*Align top of the slider*/}
}

通过上述代码,可以实现一个实时滑动显示滑动进度的滑动条组件。效果如下:

在这里插入图片描述

三、滑动条具体实现

调用函数lv_slider_create(lv_scr_act());,该函数如下:

lv_obj_t * lv_slider_create(lv_obj_t * parent)
{LV_LOG_INFO("begin");lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent);lv_obj_class_init_obj(obj);return obj;
}

在这个函数中,根据lv_slider_classMY_CLASS)的属性,创建了一个以parent为父节点的slider元素。lv_slider_class签名如下:

const lv_obj_class_t lv_slider_class = {.constructor_cb = lv_slider_constructor,.event_cb = lv_slider_event,.editable = LV_OBJ_CLASS_EDITABLE_TRUE,.group_def = LV_OBJ_CLASS_GROUP_DEF_TRUE,.instance_size = sizeof(lv_slider_t),.base_class = &lv_bar_class
};

lv_slider_class中指定了组件的初始化、事件触发回调、编辑状态、组定义、大小以及基类信息。

  1. lv_obj_class_create_obj:该方法申请内存,构建出一个lv_obj_t对象,并且指定当前显示的父节点。(如果父节点为NULL,则显示在默认的显示对象上)。

  2. lv_obj_class_init_obj:这个函数负责初始化一个对象,具体步骤如下:

    • lv_obj_mark_layout_as_dirty:标记对象的布局为脏,使得重新计算对象布局。
    • lv_obj_enable_style_refresh:禁用样式刷新,这样在初始化过程中不会立即应用样式。
    • lv_theme_apply:将当前主题应用到对象上。
    • lv_obj_construct:构造对象。
    • lv_obj_enable_style_refresh:启用样式刷新,允许对象应用样式。
    • lv_obj_refresh_style:刷新对象的样式,确保所有部分和属性都更新。
    • lv_obj_refresh_self_size:刷新对象的自身大小,确保大小信息是最新的。
    • lv_group_add_obj:这部分代码检查是否存在默认组,并且对象是否应该属于该组。如果是,则将对象添加到默认组中。
    • lv_event_send:发送LV_EVENT_CHILD_CHANGEDLV_EVENT_CHILD_CREATED事件给父对象,通知父对象有新的子对象。如果对象不是屏幕(即没有父对象),它会使对象的区域无效,这可能会触发布局更新。
    • lv_obj_invalidate:这个组件只在父对象的区域内显示,超出部分不显示。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/456409.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

百度文心一言接入流程-java版

百度文心一言接入流程-java版 一、准备工作二、API接口调用-java三、百度Prompt工程参考资料: 百度文心一言:https://yiyan.baidu.com/百度千帆大模型:https://qianfan.cloud.baidu.com/百度千帆大模型文档:https://cloud.baidu.com/doc/WENXINWORKSHOP/index.html千tokens…

Modbus TCP报错:Response length is only 0 bytes

问题描述: 使用modbus_tk库,通过Modbus tcp连接PLC时,python中的一个报错信息: Response length is only 0 bytes报错原因: 与Modbus TCP 服务端建立连接后没有断开,继续作为长连接使用,客户端…

时序数据库 TDengine 支持集成开源的物联网平台 ThingsBoard

Thingsboard 中“设备配置”和“设备”的关系是一对多的关系,通过设备配置为每个设备设置不同的配置,每个设备都会有一个与其关联的设备配置文件。等等,这不就是TDengine 中超级表的概念: 超级表是一种特殊的表结构,用…

Unity3D学习FPS游戏(4)重力模拟和角色跳跃

前言:前面两篇文章,已经实现了角色的移动和视角转动,但是角色并没有办法跳跃,有时候还会随着视角移动跑到天上。这是因为缺少重力系统,本篇将实现重力和角色跳跃功能。觉得有帮助的话可以点赞收藏支持一下!…

Spring Cloud:构建高可用分布式系统的利器

摘要:本文将介绍Spring Cloud,一个基于Spring Boot的开源微服务架构工具集。我们将探讨Spring Cloud的核心组件、特性以及如何使用Spring Cloud构建高可用、分布式系统。通过本文,读者将了解到Spring Cloud在实现微服务架构中的应用和优势。 …

ResNet-RS 乳腺癌识别

一、模型结构 1.1 模型思路 ResNet-RS是一种改进的ResNet架构,它在2021年由谷歌大脑和UC Berkeley的研究者们提出。ResNet-RS的提出基于对现有ResNet架构的深入研究,研究者们重新审视了ResNet的结构、训练方法以及缩放策略,并提出了一些改进…

git入门操作(2)

文章目录 git入门操作(2)git diff 查看差异git diff gitignore忽略文件1.在代码仓库创建这个文件2.添加对 log 文件过滤 连接远程仓库与ssh配置远程仓库和本地仓库关联步骤分支基本操作步骤命令: 合并冲突分支合并逻辑1.新建分支 dev&#xf…

MySQL查看当前客户端连接数的方法

每当有客户端连接到 MySQL 时,MySQL 会为该连接创建一个新的线程来处理所有与该连接相关的查询和操作。所以通过查看MySQL当前的连接线程数量就可以知道有多少客户端连接到MySQL。 方法一 Threads_connected 仅显示活跃的客户端连接数 SHOW STATUS LIKE Threads_…

H7-TOOL的LUA小程序教程第15期:电压,电流,NTC热敏电阻以及4-20mA输入(2024-10-21,已经发布)

LUA脚本的好处是用户可以根据自己注册的一批API(当前TOOL已经提供了几百个函数供大家使用),实现各种小程序,不再限制Flash里面已经下载的程序,就跟手机安装APP差不多,所以在H7-TOOL里面被广泛使用&#xff…

Go语言中三个输入函数(scanf,scan,scanln)的区别

Go语言中三个输入函数(scanf,scan,scanln)的区别 在 Go 语言中,fmt 包提供了三种输入函数:Scanf、Scan 和 Scanln。这三个函数都是用于从标准输入读取数据并存储到变量中,但是它们在处理输入的方式上有所不同。下面详细解读每个函数的特点和…

网站被浏览器提示“不安全”,如何快速解决

当网站被浏览器提示“不安全”时,这通常意味着网站存在某些安全隐患,需要立即采取措施进行解决。 一、具体原因如下: 1.如果网站使用的是HTTP协议,应立即升级HTTPS。HTTPS通过使用SSL证书加密来保护数据传输,提高了网…

CSS设置层叠样式时报红(identifier expected css/selector expected css)

不规范语法 如上图所示,在一个 css 文件中添加层叠样式时报红:at-rule or selector expected,意思就是说我们的语句不符合 css 的语法书写规范,虽然不会导致启动报错并且还能达到预期的样式效果,但是对于有强迫症的同学…

养狗为什么需要宠物空气净化器?宠物空气净化器排行榜公布!

刚开始养狗时候怎么没人跟我说要买宠物空气净化器呢?那时候什么都不懂,只买了狗粮、喂食碗、狗笼、狗窝、便盆、牵引绳以及一些狗狗玩具。结果一个星期就家里就被搞得狗毛乱飞、臭味熏天。最后在养狗博主的建议下买了一台宠物空气净化器,开了…

ffmpeg视频滤镜:压缩-deflate

滤镜简述 deflate 官网链接 > https://ffmpeg.org/ffmpeg-filters.html#deflate 压缩滤镜可以降低视频的质量&#xff0c;从而减少视频的大小&#xff0c;虽然一定程度上影响了观看体验&#xff0c;但是方便传输。 滤镜使用 参数 threshold0 <int> …

函数的力量:掌握C语言的基石

目录 前言 标准库&#xff1a;C语言的百宝箱 头文件&#xff1a;库函数的藏宝图 实例分析&#xff1a;计算平方根的sqrt函数 功能描述 头文件包含的重要性 库函数文档的一般格式 自定义函数&#xff1a;释放你的编程创造力 函数的语法形式 函数的比喻 函数的举例 简化…

FreeSSl 申请免费证书,ACME实现自动化续期(https证书自动续期)

网站&#xff1a;https://freessl.cn/ 参考&#xff1a;ACME自动化快速入门 注册/登录后 1 添加域名 2 申请证书 安装acme.sh curl https://get.acme.sh | sh -s emailmyexample.com执行ACME.sh 申请证书命令 cd ~/.acme.sh/ # 直接拷贝上面步骤生成的命令 ./acme.sh …

springboot诊所就医系统-计算机毕业设计源码16883

目 录 摘要 1 绪论 1.1 研究背景 1.2选题背景及意义 1.3论文结构与章节安排 2 诊所就医系统系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用例分析 …

论文笔记:通用世界模型WorldDreamer

整理了WorldDreamer: Towards General World Models for Video Generation via Predicting Masked Tokens 论文的阅读笔记 背景模型实验 背景 现有的世界模型仅限于游戏或驾驶等特定场景&#xff0c;限制了它们捕捉一般世界动态环境复杂性的能力。针对这一挑战&#xff0c;本文…

雷池社区版有多个防护站点监听在同一个端口上,匹配顺序是怎么样的

如果域名处填写的分别为 IP 与域名&#xff0c;那么当使用进行 IP 请求时&#xff0c;则将会命中第一个配置的站点 以上图为例&#xff0c;如果用户使用 IP 访问&#xff0c;命中 example.com。 如果域名处填写的分别为域名与泛域名&#xff0c;除非准确命中域名&#xff0c;否…

关于写删除接口的一些理解

背景 在前两篇文章中&#xff0c;我讲了如何编写查询接口和新增接口。这篇文章将讲解如何编写删除接口。 “删除”接口的总体思路 一般情况下&#xff0c;删除接口的思路是通过记录的id来删除某一行。在实际工作中&#xff0c;我还没有遇到过使用其他字段来删除记录的情况&am…