【LVGL学习笔记】(二) 基础概念

news2024/11/18 18:30:52

LVGL全程LittleVGL,是一个轻量化的,开源的,用于嵌入式GUI设计的图形库。并且配合LVGL模拟器,可以在电脑对界面进行编辑显示,测试通过后再移植进嵌入式设备中,实现高效的项目开发。
在这里插入图片描述
LVGL中文教程手册:百问网LVGL中文教程手册文档

以下的内容均是以VS环境下的LVGL模拟器进行展开,之后会再针对移植的事项进行说明。

一. 框架

学过QT或者其他UI开发的选手应该了解:
UI界面就是由一个个控件,以及控件之间的相互关系(如父子继承关系,事件触发等)组成的。每个控件都有其独有的属性(如样式,触发函数等),LVGL也是如此。
LVGL还带有主题功能,能够便捷地统一控件样式。
因为是面向嵌入式设备进行开发,LVGL还需要有硬件相关的驱动。

// 主函数代码
int main(int argc, char** argv)
{	
	/*Initialize LittlevGL*/
	lv_init();

	/*Initialize the HAL for LittlevGL*/
	hal_init();

	/*
	 * Demos, benchmarks, and tests.
	 */
	 lv_demo();
	 
	while (1)
	{
		/* Periodically call the lv_task handler.
		* It could be done in a timer interrupt or an OS task too.*/
		lv_task_handler();
		Sleep(10);       /*Just to let the system breathe */
	}

	return 0;
}
  1. 对于功能实现,我们需要做的,就是将上面的lv_demo替换为我们自己写的函数。
  2. 因为lvgl内部是以不同线程的形式来处理各项任务,如刷屏等,并且我们也可以注册任务的,所以需要循环调用lv_task_handler来进行任务处理。
  3. lv_task_handler的调用除了在主函数的while中进行调用,也可以在OS或者定时器中断中进行调用,比如STM32使用FreeRTOS的一个线程进行处理。

二. 对象

对象具有各种属性,如位置尺寸等。
可以使用lv_obj_set _… 和 **lv_obj_get _…**来设置及获取属性信息。

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

/* 获取按键的父级指针 */
lv_obj_get_parent(btn)

不同控件的特殊属性可以使用带控件名称的函数进行实现。

/* 设置滑块的最小值和最大值 */
lv_slider_set_range(slider1, 0, 100);   

/* 设置回调函数 */
lv_slider_set_action(slider1, my_action);       

工作机制

1. 亲子结构
父对象可以作为其子对象的容器。每个对象只能一个父对象(屏幕除外),但是一个父对象可以有无限多个子对象。
父对象的类型没有限制,但是有特殊的父对象(例如,按钮)和特殊的子对象(例如,标签)。
2. 子对象仅在父对象的范围内可见
3. 子对象的位置是相对于父对象的位置,父对象移动时,两者相对位置不变。

创建和删除对象

/**
 * @param 指向父对象的指针。创建屏幕时以 NULL 作为父级。
 * @param 此参数可选,表示创建新对象时,把 copy 对象上的属性值复制过来
 */
lv_obj_t * lv_ <type>_create(lv_obj_t * parent, lv_obj_t * copy);

/* 所有对象类型都有一个通用的删除功能。它删除对象及其所有子对象 */
void lv_obj_del(lv_obj_t * obj);

/* 异步删除 */
void lv_obj_del_async(lv_obj_t * obj)

/*  删除对象的所有子对象(但不会删除对象本身) */
void lv_obj_clean(lv_obj_t * obj);

屏幕对象

/* 创建屏幕 */
lv_obj_t * scr = lv_obj_create(NULL, NULL);

/* 加载屏幕 */
lv_scr_load(scr)

/* 获取活动屏幕对象 */
lv_obj_t * scr = lv_scr_act()

/* 动态加载屏幕 */
/**
 * @brief 动态加载屏幕
 * @param 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 使新屏幕淡进旧屏幕
 * @time 转换时间
 * @delay 延迟时间
 * @auto_del 切换后是否删除旧屏幕
 */
lv_scr_load_anim(scr, transition_type, time, delay, auto_del)

多显示屏的使用

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

/* 以最后一个注册的显示设备作为默认显示屏幕 */
lv_disp_drv_register(lv_disp_drv_t * driver)

/* 选择新的默认显示屏幕 */
lv_disp_set_default(disp)

零件

对象部件一般都有多个零件。例如,按钮仅具有主要部分,而滑块则由背景,指示器和旋钮组成。我们可以对不同零件分别进行样式设计。
命名规则:LV_ + < TYPE > _ PART _ < NAME >
如:LV_BTN_PART_MAIN 、 LV_SLIDER_PART_KNOB

/* 设置容器样式 */
lv_obj_set_style_local_value_str(h, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, "Text input");

状态

/* 状态列表 */
LV_STATE_DEFAULT  // 默认或正常状态
LV_STATE_CHECKED  // 选中或点击
LV_STATE_FOCUSED  // 通过键盘或编码器聚焦或通过触摸板/鼠标单击
LV_STATE_EDITED   // 由编码器编辑
LV_STATE_HOVERED  // 鼠标悬停(现在还不支持)
LV_STATE_PRESSED  // 按下
LV_STATE_DISABLED // 禁用或无效
  1. 当用户按下,释放,聚焦等对象时,状态通常由库自动检测更改。
  2. 状态可以手动检测更改。
/* 完全覆盖当前状态 */ 
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) .

三. 对象层级

规则:新创建的对象会覆盖旧对象进行显示。

/* 对象或它的任何子对象被点击,将自动将该对象带到最前面显示。*/
lv_obj_set_top(obj,true);

/* 对象或它的任何子对象被点击,将自动将该对象带到最后面。*/
lv_obj_move_foreground(obj);

/* 对象被带到新的父级对象前面 */
lv_obj_set_parent(obj,new_parent);

顶层和系统层

顶层:layer_top
系统层:layer_sys
两者在显示器的所有屏幕上都是可见且通用的,但是,它们不会在多个物理显示器之间共享。
位置:layer_top始终位于默认屏幕的顶部, layer_sys则位于layer_top的顶部。

/* 设置顶层可点击,其会吸收所有用户单击,也就是说其他控件都点不了了。*/
lv_obj_set_click(lv_layer_top(), true);

根据系统层的特性,可以将鼠标光标放在系统层,保持其一直可见。

四. 事件

多个对象可以使用一个回调函数

/* 指定一个事件回调函数 */
lv_obj_t * btn = lv_btn_create(lv_scr_act(), NULL);
lv_obj_set_event_cb(btn, my_event_cb);    

void my_event_cb(lv_obj_t * obj, lv_event_t event)
	switch(event){
		case LV_EVENT_PRESSED:              /* 对象被按下 */
		    printf("Pressed\n");
		    break;
		case LV_EVENT_SHORT_CLICKED:        /* 对象被短点击 */
		    printf("Short clicked\n");
		  	break;
		case LV_EVENT_CLICKED:              /* 对象被点击 */
		    printf("Clicked\n");
		    break;
}  

事件类型参考:事件(Events)

LV_EVENT_REFRESH是特殊事件,因为它旨在供用户用来通知对象刷新自身。如:

  1. 通知标签根据一个或多个变量(例如当前时间)刷新其文本
  2. 语言更改时刷新标签
/* 手动发布事件 */
lv_event_send(obj, LV_EVENT_..., &custom_data);

/* 发布刷新事件至对象 */
lv_event_send_refresh(obj);

/* 发布刷新事件至对象及其子对象 */
lv_event_send_refresh_recursive(obj);

五. 输入设备

设备类型:

  1. 指针式输入设备,如触摸板或鼠标
  2. 键盘,如普通键盘或简单的数字键盘
  3. 带有左/右转向和推入选项的编码器
  4. 外部硬件按钮,分配给屏幕上的特定点

指针

指针设备通常指鼠标

lv_indev_t * mouse_indev = lv_indev_drv_register(&indev_drv);
/* Declare the image file */
LV_IMG_DECLARE(mouse_cursor_icon); 
/* Create an image object for the cursor */
lv_obj_t * cursor_obj =  lv_img_create(lv_scr_act(), NULL);
/* Set the image source */ 
lv_img_set_src(cursor_obj, &mouse_cursor_icon); 
/* Connect the image  object to the driver */            
lv_indev_set_cursor(mouse_indev, cursor_obj);               

键盘和编码器

可以使用键盘和编码器选择对象,将像指针一样。所有想要通过键盘或编码器控制的对象需要添加到Group中。在每个组中,只有一个被聚焦的对象可以接收按下的键盘或编码器的动作。

/* 创建组 */
lv_group_t * g = lv_group_create()

/* 将对象添加进组 */
lv_group_add_obj(g, obj)

/* 关联组和设备 */
lv_indev_set_group(indev, g)

按键

/* 按键类型 */
LV_KEY_NEXT //专注于下一个对象
LV_KEY_PREV //专注于上一个对象
LV_KEY_ENTER //触发 LV_EVENT_PRESSED/CLICKED/LONG_PRESSED 等事件
LV_KEY_UP //增加值或向上移动
LV_KEY_DOWN //减小值或向下移动
LV_KEY_RIGHT //增加值或向右移动
LV_KEY_LEFT //减小值或向左移动
LV_KEY_ESC //关闭或退出(例如,关闭下拉列表)
LV_KEY_DEL //删除(例如,“ 文本”区域中右侧的字符)
LV_KEY_BACKSPACE //删除左侧的字符(例如,在文本区域中)
LV_KEY_HOME //转到开头/顶部(例如,在“ 文本”区域中)
LV_KEY_END //转到末尾(例如,在“ 文本”区域中)

其中,编码器仅使用 LV_KEY_LEFTLV_K​​EY_RIGHTLV_KEY_ENTER

编辑和导航模式
主要是针对编码器的应用。
LV_KEY_ENTER:切换编辑/浏览模式。
编辑模式:编码器左右旋为LV_KEY_LEFT/RIGHT
导航模式:编码器左右旋为LV_KEY_NEXT/PREV

状态
对象聚焦状态:LV_STATE_FOCUSED
对象编辑状态:LV_STATE_FOCUSED | LV_STATE_EDITED
因此需要设置这些状态下的样式,以区分对象状态。

六. 字体

字体属于是对象属性其中之一,可以通过设置对象样式的形式改变文本的字体样式。

/* Create a label on the second button */
lv_obj_t * label = lv_label_create(btn, NULL);        
lv_style_t my_style;
lv_style_init(&my_style);

/*Set a larger font*/
lv_style_set_text_font(&my_style, LV_STATE_DEFAULT, &lv_font_montserrat_28);

/* Add style to the objct */
lv_obj_add_style(label, LV_LABEL_PART_MAIN, &my_style);
lv_label_set_text(label, "Button"); 

字体样式

有几种不同大小的内置字体,可以通过 LV_FONT _… 定义在 lv_conf.h 中启用。启用后即可按照上述的格式进行字体样式调用。

/* 普通字体 */
LV_FONT_MONTSERRAT_<VAL> // VAL为12,14,16 ... 48,数值越大字体越大 

/* 特殊字体 */
LV_FONT_MONTSERRAT_12_SUBPX // 与常规12像素字体相同,但具有亚像素渲染
LV_FONT_MONTSERRAT_28_COMPRESSED // 与普通的28 px字体相同,但压缩字体为3 bpp
LV_FONT_DEJAVU_16_PERSIAN_HEBREW // 正常范围内的16像素字体+希伯来语,阿拉伯语,Perisan字母及其所有形式
LV_FONT_SIMSUN_16_CJK // 16 px字体,具有正常范围+ 1000个最常见的CJK部首
LV_FONT_UNSCII_8 // 仅包含ASCII字符的8 px像素完美字体

特殊符号
在这里插入图片描述

/* 直接调用 */
lv_label_set_text(my_label, LV_SYMBOL_OK);

/* 与字符一起用 */
lv_label_set_text(my_label, LV_SYMBOL_OK "Apply");

/* 多个符号一起用 */
lv_label_set_text(my_label, LV_SYMBOL_OK LV_SYMBOL_WIFI LV_SYMBOL_PLAY);

七. 动画效果

可以使用动画在开始值和结束值之间自动更改变量的值。

/* 初始化动画 */
lv_anim_t a;
lv_anim_init(&a);

/* --- 必选设置 --- */

/* 设置“动画制作”功能 */
lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t) lv_obj_set_x);

/* 设置“动画制作”功能 */
lv_anim_set_var(&a, obj);

/* 动画时长[ms] */
lv_anim_set_time(&a, duration);

/* 设置开始和结束值。例如。 0、150 */
lv_anim_set_values(&a, start, end);

/* --- 可选设置 --- */

/* 开始动画之前的等待时间[ms] */
lv_anim_set_delay(&a, delay);

/* 设置路径(曲线)。默认为线性 */
lv_anim_set_path(&a, &path);

/* 设置一个回调以在动画准备好时调用。 */
lv_anim_set_ready_cb(&a, ready_cb);

/* 设置在动画开始时(延迟后)调用的回调。 */
lv_anim_set_start_cb(&a, start_cb);

/* 在此持续时间内,也向后播放动画。默认值为0(禁用)[ms] */
lv_anim_set_playback_time(&a, wait_time);

/* 播放前延迟。默认值为0(禁用)[ms] */
lv_anim_set_playback_delay(&a, wait_time);

/* 重复次数。默认值为1。LV_ANIM_REPEAT_INFINIT用于无限重复 */
lv_anim_set_repeat_count(&a, wait_time);

/* 重复之前要延迟。默认值为0(禁用)[ms] */
lv_anim_set_repeat_delay(&a, wait_time);

/* true(默认):立即应用开始值,false:延迟设置动画后再应用开始值。真正开始。 */
lv_anim_set_early_apply(&a, true/false);

/* 应用动画效果 */
lv_anim_start(&a);                 

路径设置

lv_anim_path_linear  		// 线性动画
lv_anim_path_step 	 		// 一步到位
lv_anim_path_ease_in 		// 渐进效果
lv_anim_path_ease_out 		// 渐退效果
lv_anim_path_ease_in_out 	// 渐进和渐退效果
lv_anim_path_overshoot 		// 超出最终值
lv_anim_path_bounce 		// 从最终值反弹一点(就像撞墙一样)
/* 初始化路径 */
lv_anim_path_t path;
lv_anim_path_init(&path);
lv_anim_path_set_cb(&path, lv_anim_path_<type>);
lv_anim_path_set_user_data(&path, &foo); /* 自定义数据(可选) */

/* 在动画中设置路径 */
lv_anim_set_path(&a, &path);

速度设置

/* 将速度转换为时间再赋值 */
lv_anim_set_time(&a, lv_anim_speed_to_time(speed, start, end));

删除动画

lv_anim_del(var,func)

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

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

相关文章

心理健康网站

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a; 管理员功能&#xff1a; 1、管理关于我们、联系我们 2、管理文章类型、添加心理文章 3、审核咨询师注册信息 4、查看咨询…

我的创作纪念日——为什么要写博客

文章目录收获意义憧憬收获 转载和摘抄只是对知识的搜集&#xff0c;不仅不会起到扩充知识体系的作用&#xff0c;反而会让人陷入盲目的自信或者自卑。一些人会把收藏当作底蕴&#xff0c;例如看到一个如何快速学Python的标题&#xff0c;就会逢人说自己会Python&#xff1b;另…

哈夫曼树,哈夫曼编码及应用——(代码实现)

哈夫曼树&#xff0c;哈夫曼编码及应用1.哈夫曼树1.1 什么是哈夫曼树2.如何构造哈夫曼树&#xff08;哈夫曼算法&#xff09;2.1 举例实现哈夫曼树2.1.1手动实现具体步骤2.1.2代码实现具体步骤3.哈夫曼编码3.1 什么是哈夫曼编码3.2哈夫曼编码的具体实现END!!!1.哈夫曼树 路径长…

零基础可以学习Python吗?转行小白怎么学Python?

ython学习常用的技巧有这些&#xff1a;一是要明确自己的学习目的;二是从易到难&#xff0c;循序渐进;三是合理的选择资料&#xff0c;有所取舍;四是坚定自己的信念。以下是关于Python学习技巧的具体介绍。 1、明确自己的学习目的 每个人学Python的初衷绝对是不一样的&#xf…

【观察】Akamai:向分布式云迈出坚实一步,让云和边缘“无处不在”

近年来&#xff0c;云正如同日常生活中的水、电那样&#xff0c;融入到社会的各个层面&#xff0c;它不再是一种单纯的架构或者技术&#xff0c;而是千行百业走向数字化的核心基础设施&#xff1b;云也正在变成一种融合剂&#xff0c;无论是大数据、人工智能、物联网等&#xf…

多目标背包问题:MOJAYA求解多目标背包问题(Multi-objective Knapsack Problem,MOKP)提供Matlab代码

一、多目标背包问题 1.1多目标背包问题描述 多目标背包问题(Multi-objective Knapsack Problem&#xff0c;MOKP)是一种重要的组合优化问题&#xff0c;在生活的许多领域都有着十分广泛的应用。多目标背包问题可以描述为&#xff1a;给定一个背包和n种物品&#xff0c;其中&a…

docker-compose安装gogs

1.gogs是什么 Gogs 的目标是打造一个最简单、最快速和最轻松的方式搭建自助 Git 服务。使用 Go 语言开发使得 Gogs 能够通过独立的二进制分发&#xff0c;并且支持 Go 语言支持的 所有平台&#xff0c;包括 Linux、Mac OS X、Windows 以及 ARM 平台。 2.准备工作gogs 在安装软…

论文精读:《FCOS3D: Fully Convolutional One-Stage Monocular 3D Object Detection》

文章目录论文精读摘要&#xff08;Abstract&#xff09;1. 介绍&#xff08;Introduction&#xff09;2. 相关工作&#xff08;Related Work&#xff09;3. 方法&#xff08;Approach&#xff09;3.1 框架总览(Framework Overview)3.2 2D引导的多层次3D预测(2D Guided Multi-Le…

【java】javac 相关API JavaCompiler StandardJavaFileManager AbstractProcessor

1.概述 转载并且补充:Java 编译器 javac 笔记:javac API、注解处理 API 与 Lombok 原理 看这个文章之前首先看:【java】java JSR 269 自定义注解实战 Lombok @Data注解 java版本直接调用 javac 是 Java 代码的编译器 [openjdk, oracle ],初学 Java 的时候就应该接触过。…

马上跨年了,如何用代码写一个“跨年倒计时”呢?

前言 大家好&#xff0c;我是陈橘又青&#xff0c;再过两周就是新的一年了&#xff0c;作为一名有仪式感的程序员&#xff0c;今天我们就来制作一个简单的跨年倒计时小网页&#xff0c;祝看到的所有人新年快乐&#xff01;&#xff08;附上完整源码&#xff0c;需要的小伙伴自取…

八、Docker 安装Mysql(流程、注意点、实例)

Docker 安装mysql 要不 安装tomcat 稍微复杂些,要配置一些参数,例如mysql密码,配置文件编写等。 1、docker hub上面查找mysql镜像 地址:Docker Hub 可以拉取最新的,也可以按照tag搜索自己想要的版本,拉取 2、从docker hub上拉取mysql5.7镜像到本地 命令:docker pull …

【实时数仓】DWM层设计模式、独立访客(UV)的计算

文章目录一 DWS层与DWM层的设计1 设计思路2 DWS层需求分析二 DWM层-UV计算1 需求分析与思路2 从kafka中读取数据&#xff08;1&#xff09;代码实现&#xff08;2&#xff09;测试&#xff08;3&#xff09;总结3 UV过滤 -- 独立访客计算&#xff08;1&#xff09;实现思路&…

Spring+SpringMVC+MP登录案例(含拦截器)

技术框架 后端&#xff1a;Spring、Spring MVC、Mybatis-Plus 前端&#xff1a;HTML、CSS、Layui、JS、Jquery 功能模块技术 1、用户的每一个请求使用了SpringMVC 拦截器技术&#xff0c;没有登录的用户自动重定向到登录页 2、统一请求模式&#xff0c;使用Restful风格对后端…

贤鱼的刷题日常(数据结构栈学习)-1551:Sumsets--题目详解

&#x1f3c6;今日学习目标&#xff1a; &#x1f340;例题讲解1551:Sumsets ✅创作者&#xff1a;贤鱼 ⏰预计时间&#xff1a;25分钟 &#x1f389;个人主页&#xff1a;贤鱼的个人主页 &#x1f525;专栏系列&#xff1a;c &#x1f341;贤鱼的个人社区&#xff0c;欢迎你的…

学Python的理由有哪些?这四大理由足够了

学Python的理由有哪些&#xff1f;可能有人会说Python是一种计算机语言&#xff0c;具有简洁性、易读性、及可扩展性&#xff0c;相对于其他语言学起来会更加容易&#xff0c;目前应用也非常广泛等等。其实总结起来&#xff0c;学Python的理由不外乎四点&#xff0c;即丰富免费…

Python数据分析主要功能是什么?可以用来做什么?

Python是一种计算机程序设计语言&#xff0c;具有简洁性、易读性以及可扩展性&#xff0c;相较于其他语言学习起来更加容易。随着互联网的发展&#xff0c;Python知识也被越来越多的人所熟知。但还是有很多人不了解它究竟可以用来做什么&#xff0c;接下来就跟随我了解一下吧&a…

【轻量级开源ROS 的机器人设备(5)】--(2)拟议的框架——µROS节点

接上文&#xff1a; 【轻量级开源ROS 的机器人设备&#xff08;5&#xff09;】--&#xff08;1&#xff09;拟议的框架——ROS节点 四、开发工具 为了方便用户应用程序的开发&#xff0c;一个代码生成器&#xff0c;一个 堆栈使用分析器和演示项目包含在框架中包裹。 4.1 代…

截止12.17 bitahub踩坑,mask无数次更改,lama代码的那些痛,羊了个羊

前面那篇跑出了STCN&#xff0c;倒是STCN熟悉了很多了 对bitahub&#xff0c;需要注意一个问题 要进ssh请用debug卡&#xff01;&#xff01;&#xff01;&#xff01; 要进ssh请用debug卡&#xff01;&#xff01;&#xff01;&#xff01; 要进ssh请用debug卡&#xff01;&…

数据库文档展示工具

实用工具&#xff1a;数据库文档展示工具 简介 数据库文档展示工具&#xff08;database doc&#xff09;&#xff0c;又叫数据库注释浏览工具&#xff0c;是一个简单的数据库展示各个字段注释的开源工具。在日常开发工作中&#xff0c;您有否这样的体验&#xff1f; 想给前…

干货 | 数字经济创新创业——数字技术创造新经济

下文整理自清华大学大数据能力提升项目能力提升模块课程“Innovation & Entrepreneurship for Digital Economy”&#xff08;数字经济创新创业课程)的精彩内容。主讲嘉宾&#xff1a;Kris Singh: CEO at SRII, Palo Alto, CaliforniaVisiting Professor of Tsinghua Unive…