lvgl 笔记 基础对象与组件

news2025/7/21 23:06:03

一、基础对象

1.1基础对象简介

 lvgl 库是纯 c 语言编写的,使用结构体实现类的操作。其所有组件都继承字lv_obj_t,可以使用他的属性和方法。

创建一个基本对象非常简单:

lv_obj_t* obj1 = lv_obj_create(lv_scr_act());

其中填入的 lv_scr_act() 是他的父对象,这个值可以是其他的实例化的基础对象,在这里 lv_scr_act() 是值屏幕窗口,告知 lvgl 直接在窗口创建一个对象,不继承自其他对象。

1.2 基本对象大小与位置 (size&position)

    lv_obj_t* obj1 = lv_obj_create(lv_scr_act()); //创建对象

    lv_obj_set_height(obj1, 200); //只设置高度
    lv_obj_set_width(obj1, 300); //只设置宽度
    lv_obj_set_size(obj1, 300,200); //设置宽高

    lv_obj_set_x(obj1, 10);//设置x
    lv_obj_set_y(obj1, 20);//设置y
    lv_obj_set_pos(obj1, 10,20);//设置xy

在 lvgl 中,左上角坐标为 (0,0),上侧代码效果如下: 

1.3 基本对象 继承关系

基本对象之间可以互相继承,其坐标对其也会根据父坐标偏移。

lv_obj_t* obj1 = lv_obj_create(lv_scr_act()); //创建对象
lv_obj_t* obj2 = lv_obj_create(obj1); //继承obj1
lv_obj_set_size(obj2, 50, 50); //设置宽高
lv_obj_set_pos(obj2, 20, 20);//设置xy

继承后则会叠在被继承的对象之上: 

 

1.4 基本对象对齐

1.4.1 参考父对象对齐

lv_obj_t* obj1 = lv_obj_create(lv_scr_act()); //创建对象
lv_obj_set_align(obj1, LV_ALIGN_CENTER); //剧中对齐
lv_obj_align(obj1, LV_ALIGN_CENTER, 200, 0); //剧中对齐后再偏移200,0

 效果如下:

其中,对齐的参数都是以 LV_ALIGN_XXXX来 表示的,共有这些参数,子对象对齐只能选择中间的深色区域内的九种:

  

1.4.1 参考其他对象对齐(无父子关系)

    lv_obj_t* obj1 = lv_obj_create(lv_scr_act()); //创建对象
    lv_obj_t* obj2 = lv_obj_create(lv_scr_act()); //创建对象
    lv_obj_align_to(obj2, obj1, LV_ALIGN_CENTER, 10,10); //obj1为基准对象,obj2为需要对齐的对象

效果如下:因为 obj1 先被创建,obj2 后被创建,所以会叠在他之上。

 

 我们可以使用之前这张图中浅色区域的值,这样就不会发生重叠

lv_obj_t* obj1 = lv_obj_create(lv_scr_act()); //创建对象
lv_obj_t* obj2 = lv_obj_create(lv_scr_act()); //创建对象
lv_obj_align_to(obj2, obj1, LV_ALIGN_OUT_RIGHT_MID, 10,10); //obj1为基准对象,obj2为需要对齐的对象

 

1.4 基本对象样式 (styles)

1.4.1 普通样式配置

void test(void) {
    static lv_style_t style; //创建样式
    lv_style_init(&style); //初始化 
    lv_style_set_bg_color(&style, lv_color_hex(0xfb3d3d)); //配置颜色

    lv_obj_t* obj1 = lv_obj_create(lv_scr_act()); //创建部件
    lv_obj_add_style(obj1, &style, LV_STATE_DEFAULT); //配置部件颜色
}

 

1.4.2 添加本地样式

    lv_obj_t* obj1 = lv_obj_create(lv_scr_act()); //创建部件
    lv_obj_set_style_bg_color(obj1, lv_color_hex(0xfb3d3d), LV_STATE_DEFAULT); //配置部件颜色

 效果与上图相同,当我们右键查看这个函数声明时,lvgl 已经给出很多单独配置的函数:

 

 具体可以函数根据提示参数和官方文档进行配置。

1.4.4 什么时候会生效? 

 其中 lv_obj_add_style() 函数可以配置触发场景,我们之前一直写的是 LV_STATE_DEFAULT,如果我们把它换成按下触发:

    static lv_style_t style;
    lv_style_init(&style);
    lv_style_set_bg_color(&style, lv_color_hex(0xfb3d3d));

    lv_obj_t* obj1 = lv_obj_create(lv_scr_act());
    lv_obj_add_style(obj1, &style, LV_STATE_PRESSED);  //按下触发

 

1.4.5 配置对象的部分样式

对于一个 slider 拖拽条来说,可以单独配置背景色,选中色,和滑块色。 

 

比如要实现以上效果,只需要在 lv_obj_set_style_bg_color() 之后与上需要设置的配置即可。

    lv_obj_t* slider = lv_slider_create(lv_scr_act());
    lv_obj_set_align(slider,LV_ALIGN_CENTER);

    lv_obj_t* slider1 = lv_slider_create(lv_scr_act());
    lv_obj_set_align(slider1, LV_ALIGN_CENTER);
    lv_obj_set_pos(slider1, 0, 50);
    lv_obj_set_style_bg_color(slider1, lv_color_hex(0xf4b183), LV_STATE_DEFAULT);

    lv_obj_t* slider2 = lv_slider_create(lv_scr_act());
    lv_obj_set_align(slider2, LV_ALIGN_CENTER);
    lv_obj_set_pos(slider2, 0, 100);
    lv_obj_set_style_bg_color(slider2, lv_color_hex(0xf4b183), LV_STATE_DEFAULT | LV_PART_INDICATOR);

    lv_obj_t* slider3 = lv_slider_create(lv_scr_act());
    lv_obj_set_align(slider3, LV_ALIGN_CENTER);
    lv_obj_set_pos(slider3, 0, 150);
    lv_obj_set_style_bg_color(slider3, lv_color_hex(0xf4b183), LV_STATE_DEFAULT | LV_PART_KNOB);

1.5 基本对象事件(events)

以下是两个关于事件的函数: 

lv_obj_t* obj1; //创建两个基本对象
lv_obj_t* obj2;

static void my_event_cb(lv_event_t* e) {

    lv_event_code_t code = lv_event_get_code(e); //获得触发事件
    if (code == LV_EVENT_CLICKED) {
        printf("LV_EVENT_CLICKED \n");
    }
    else if (code == LV_EVENT_LONG_PRESSED) {
        printf("LV_EVENT_LONG_PRESSED \n");
    }

    lv_obj_t* target = lv_event_get_target(e); //获得触发的基本对象
    if (target == obj1) {
        printf("obj1 \n");
    }else if(target == obj2){
        printf("obj2 \n");
    }
}

void test(void) {
    obj1 = lv_obj_create(lv_scr_act()); //创建基本对象
    lv_obj_add_event_cb(obj1, my_event_cb, LV_EVENT_CLICKED,NULL); //绑定单击事件
    lv_obj_add_event_cb(obj1, my_event_cb, LV_EVENT_LONG_PRESSED, NULL); //绑定长摁事件

    obj2 = lv_obj_create(lv_scr_act()); //创建基本对象
    lv_obj_set_pos(obj2,300,0);
    lv_obj_add_event_cb(obj2, my_event_cb, LV_EVENT_CLICKED, NULL); //绑定单击事件
    lv_obj_add_event_cb(obj2, my_event_cb, LV_EVENT_LONG_PRESSED, NULL); //绑定长摁事件
}

 其中:这两个函数可以获得触发的事件和对象

lv_event_code_t code = lv_event_get_code(e); //获得触发事件
lv_obj_t* target = lv_event_get_target(e); //获得触发的基本对象

 效果如下:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

KUKA U盘备份系统

KUKA U盘备份系统 原创 March Cai Cass 机器人 2022-03-10 12:39 首先想做系统备份,需要KUKA 官方的U盘,需要设置如下 双击KUKA U盘里的Recovery.exe 打开如右上图,点开专家设置 设置好需要的功能 返回主菜单组选择 配置界面,…

20230306 LS-DYNA悬臂梁案例学习笔记

一、创建材料 在左侧linear elastic,将这个拉至新建的mat材料上

【立体匹配论文阅读】Pyramid Stereo Matching Network

Authors: Jia-Ren Chang, Yong-Sheng Chen Link: https://arxiv.org/abs/1803.08669 Years: 2018 Credit Novelty and Question set up 本文提出之时,基于深度学习的立体匹配主流方式仍是patch-based孪生结构,这种方式缺乏上下文信息的获取能力&#xf…

buuctf-web-[SUCTF 2018]MultiSQL1

打开界面,全部点击一遍,只有注册和登录功能可以使用注册一个账号,注册admin提示用户存在,可能有二次注入,注册admin自动加了一个字符,无法二次注入,点击其他功能点换浏览器重新登录后&#xff0…

java多线程(二一)并发协作生产者消费者设计模式

1.两个线程一个生产者一个消费者 需求情景 两个线程,一个负责生产,一个负责消费,生产者生产一个,消费者消费一个。 涉及问题 同步问题:如何保证同一资源被多个线程并发访问时的完整性。常用的同步方法是采用标记或加…

如何查看并读懂昇腾平台的应用日志

当您完成训练/推理工程开发后,将工程放到昇腾平台运行,以调试工程是否正常,此时,可能会出现各种各样、五花八门的异常状况。当问题发生时,我们的第一反应是不是查看日志,看看哪里报错了。昇腾平台有哪些日志…

面向对象设计模式:结构型模式之装饰器模式

一、引入 咖啡馆订购系统 Initial 初始 4 种咖啡 House blend (混合咖啡)Dark Roast (深度烘培)Decaf (低咖啡因咖啡)Espresso (意式浓缩咖啡) 需求变更:客户可以加料(咖啡、牛奶、糖等) steamed milksoymochaWhip 使用继承&#xff1…

Vue2的基本内容(二)

目录 一、props配置 二、全局事件总线 1.作用 2.原理 3.使用 三、插槽 1.默认插槽 2.具名插槽 3.作用域插槽 四、Vuex 1.vuex是什么 2.vuex工作流程 3.vuex的API (1)state (2)state辅助函数mapState (…

Linux 练习六 (IPC 管道)

文章目录1 标准管道流2 无名管道(PIPE)3 命名管道(FIFO)3.1 创建删除管道文件3.2 打开和关闭FIFO文件3.3 管道案例:基于管道的客服端服务器程序使用环境:Ubuntu18.04 使用工具:VMWare workstati…

【C++】STL——string类的模拟实现

文章目录👉string类👈📕 概念📕 成员变量📕 构造函数、析构函数📕 size() 、getstr() 函数📕 拷贝构造📕 赋值重载📕 迭代器📕 运算符重载📕 尾插…

如何管控第三方软件,保护企业数据安全?

日前,密码管理供应商LastPass公布了关于其数据泄露事件的调查新进展。据其透露,这是一起“二次协同攻击”事件。LastPass在2022年8月、12月先后披露的两起违规事件,这两起事件的攻击链有关联。在此次攻击事件中,LastPass发现恶意黑…

王道计算机组成原理课代表 - 考研计算机 第五章 中央处理器 究极精华总结笔记

本篇博客是考研期间学习王道课程 传送门 的笔记,以及一整年里对 计算机组成 知识点的理解的总结。希望对新一届的计算机考研人提供帮助!!! 关于对 “中央处理器” 章节知识点总结的十分全面,涵括了《计算机组成原理》课…

C++基础——C++相比C语言的新特性梳理总结(C++新特性、输入输出方式、命名空间namespace)

【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! 《QT开发实战》 《嵌入式通用开发实战》 《从0到1学习嵌入式Linux开发》 《Android开发实战》 《实用硬件方案设计》 长期持续带来更多案例与技术文章分享…

论文翻译 | Momentum Contrast for Unsupervised Visual Representation Learning(前三章)

前言: 上一次读恺明大神的文章还是两年前,被ResNet的设计折服得不行,两年过去了,我已经被卷死在沙滩上 Momentum Contrast for Unsupervised Visual Representation Learning 摘要 我们提出了针对无监督表征学习的方法MOCO,利用…

上门按摩预约APP源码-东郊到家源码(开发,PHP,平台搭建)

一、什么是上门按摩预约APP源码? 上门按摩预约APP源码是一款家政服务类型的APP,可以帮忙用户在家就能享受按摩的服务。APP源码分两端,一端是用户端,另外一端是技师端。采用的技术,前端是安卓IOS,后端是PHP&…

java_Day004

1.二维数组 二维数组的创建与初始化(java是支持规则数组和不规则数组的) 例:int[][] array {{1,2},{2,3}{3,4,5}}; 结构如下: 二维数组的遍历: 例子: Testpublic void test21(){int[][] array new int[…

C++学习记录——십이 vector

文章目录1、vector介绍和使用2、vector模拟实现insert和erase和迭代器失效补齐其他函数深浅拷贝难点思考1、vector介绍和使用 vector可以管理任意类型的数组&#xff0c;是一个表示可变大小数组的序列容器。 通过vector文档来看它的使用。 #include <iostream> #inclu…

集群、分布式的理解

一、单机模式小型系统相对简单&#xff0c;所有的业务全部写在一个项目中&#xff0c;部署服务到一台服务器上&#xff0c;所有的请求业务都由这台服务器处理&#xff0c;这就是单机模式。显然&#xff0c;当业务增长到一定程度的时候&#xff0c;服务器的硬件会无法满足业务需…

强化学习 | 课堂笔记 | 第三课 MP的便利性,随机逼近方法

一、回顾 一、值函数、贝尔曼方程、贝尔曼最优方程 二、最优值函数 三、ADP 3.1 VI 3.2 PI 四、ADP可以使用的条件 五、Q函数 六、解决问题的方案 &#xff08;指的是解决“四 ADP可以使用的条件”中的三个问题&#xff09; 二、期望的计算 一、Markov过程的便利性 1…

新搭建Gitlab代码仓代码如何导入

这里写目录标题一级目录1.本地代码如何导入新Gitlab2.怎么将旧Gitlab代码导入新Gitlab一级目录 1.本地代码如何导入新Gitlab 修改本地代码 .git 目录下面的config 文件&#xff0c;主要是url参数&#xff0c;将url指向新的Gitlab仓库地址 [core]repositoryformatversion 0f…