热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

LVGL基础教程–LVGL显示

显示(Displays),LVGL中显示的基本概念在显示接口部分中进行了说明。因此,在进一步阅读之前,请先阅读显示接口部分。

显示(Displays),LVGL中显示的基本概念在 显示接口 部分中进行了说明。因此,在进一步阅读之前,请先阅读 显示接口 部分。

多种显示支持

在LVGL中,可以有多个显示,每个显示都有自己的驱动程序和对象。唯一的限制是,每个显示器都必须具有相同的色深(如中所述 LV_COLOR_DEPTH )。如果在这方面显示有所不同,则可以在驱动程序中将渲染的图像转换为正确的格式 flush_cb

创建更多的显示很容易:只需初始化更多的显示缓冲区并为每个显示注册另一个驱动程序。创建UI时,用于 lv_disp_set_default(disp) 告诉库在其上创建对象的显示。

为什么要多显示器支持?这里有些例子:


  • 具有带有本地UI的“常规” TFT显示屏,并根据需要在VNC上创建“虚拟”屏幕。(需要添加 VNC 驱动程序)。

  • 具有大型TFT显示屏和小型单色显示屏。

  • 在大型仪器或技术中具有一些较小且简单的显示器。

  • 有两个大型TFT显示屏:一个用于客户,一个用于店员。


仅使用一个显示器

使用更多显示器可能很有用,但在大多数情况下,并非必需。因此,如果仅注册一个显示器,则整个多显示器概念将被完全隐藏。默认情况下,最后创建的(唯一的)显示用作默认设置。

lv_scr_act() , lv_scr_load(scr) , lv_layer_top() , lv_layer_sys() , LV_HOR_RES 以及 LV_VER_RES 始终应用在最后创建的(默认)屏幕上。 如果将 NULL 作为 disp 参数传递给显示相关功能,通常将使用默认显示。 例如。 lv_disp_trig_activity(NULL) 将在默认屏幕上触发用户活动。(请参见下面的非活动状态)。

镜面展示

要将显示器的图像镜像到另一台显示器,则无需使用多显示器支持。只需将在 drv.flush_cb 中接收的缓冲区也转移到另一个显示器。

分割影像

可以从较小的显示创建较大的显示。可以如下创建它:


  1. 将显示器的分辨率设置为大显示器的分辨率。

  2. 在中 drv.flush_cb ,截断并修改 area 每个显示的参数。

  3. 将缓冲区的内容发送到带有截断区域的每个显示。


屏幕

每个显示器都有每组屏幕和屏幕上的对象。

确保不要混淆显示和屏幕:



  • 显示 是绘制像素的物理硬件。


  • 屏幕 是与特定显示器关联的高级根对象。一个显示器可以具有与其关联的多个屏幕,但反之则不然。

屏幕可以视为没有父级的最高级别的容器。屏幕的大小始终等于其显示,屏幕的大小始终为(0;0)。 因此,无法更改屏幕坐标,即,不能在屏幕上使用 lv_obj_set_pos(), lv_obj_set_size() 或类似功能。

可以从任何对象类型创建屏幕,但是,两种最典型的类型是 基础对象_ 和 图像_ (用于创建墙纸)。

要创建屏幕,请使用 lv_obj_t * scr = lv__create(NULL, copy) 。复制可以是另一个屏幕来复制它。

要加载屏幕,请使用 lv_scr_load(scr) 。要获取活动屏幕,请使用 lv_scr_act() 。这些功能在默认显示屏上起作用。如果要指定要处理的显示器,请使用 lv_disp_get_scr_act(disp)lv_disp_load_sc(disp,scr) 。屏幕也可以加载动画。在这里阅读更多。

可以使用lv_obj_del(scr)删除屏幕,但请确保不删除当前加载的屏幕。

透明屏幕

通常,屏幕的不透明度是 LV_OPA_COVER 为其子级提供坚实的背景。如果不是这种情况(不透明度<100%),则显示器的背景颜色或图像将可见。有关更多详细信息,请参见显示背景部分。如果显示器的背景不透明性也不是,则 LV_OPA_COVERLVGL 不会绘制纯色背景。

此配置(透明屏幕和显示器)可用于创建OSD菜单,例如在其中将视频播放到下层,并在上层创建菜单。

为了处理透明显示器,LVGL需要使用特殊(较慢)的颜色混合算法,因此需要使用LV_COLOR_SCREEN_TRANSPn 启用此功能lv_conf.h。由于此模式在像素的Alpha通道上运行,因此也是必需的。32位颜色的Alpha通道在没有对象的情况下将为0,在有实体对象的情况下将为255。LV_COLOR_DEPTH = 32

总而言之,要启用透明屏幕和显示以创建类似于OSD菜单的UI:


  • lv_conf.h 中启用 LV_COLOR_SCREEN_TRANSP

  • 请务必使用 LV_COLOR_DEPTH 32

  • 将屏幕的不透明度设置为 LV_OPA_TRANSP 例如 lv_obj_set_style_local_bg_opa(lv_scr_act(), LV_OBJMASK_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_TRANSP)

  • 使用 lv_disp_set_bg_opa(NULL, LV_OPA_TRANSP); 将显示不透明度设置为 LV_OPA_TRANSP


显示器功能


不活跃

在每个显示器上测量用户的不活动状态。每次使用输入设备(如果与显示器关联)都被视为一项活动。要获取自上一次活动以来经过的时间,请使用 lv_disp_get_inactive_time(disp) 。如果传递了 NULL ,则所有显示(不是默认显示)将返回整体最小的不活动时间。

可以使用手动触发活动 lv_disp_trig_activity(disp) 。如果 dispNULL ,则将使用默认屏幕(并非所有显示)。

背景

每个显示都有背景色,背景图像和背景不透明度属性。当当前屏幕是透明的或未定位为覆盖整个显示器时,它们将变为可见。

背景色是填充显示的一种简单颜色。可以使用 lv_disp_set_bg_color(disp,color) 进行调整;

背景图像是用作墙纸的文件路径或指向 lv_img_dsc_t 变量(转换后的图像)的指针。可以使用 lv_disp_set_bg_color(disp,&my_img); 进行设置。如果设置了背景图片(非 NULL ),则背景将不会填充 bg_color

可以使用 lv_disp_set_bg_opa(disp,opa) 调整背景颜色或图像的不透明度。

这些函数的disp 参数可以为 NULL ,以将其引用到默认显示。

色彩

颜色模块处理所有与颜色相关的功能,例如更改颜色深度,从十六进制代码创建颜色,在颜色深度之间转换,混合颜色等。

颜色模块定义了以下变量类型:



  • lv_color1_t 存储单色。为了兼容性,它也具有R,G,B字段,但它们始终是相同的值(1个字节)


  • lv_color8_t 用于存储8位颜色(1字节)的R(3位),G(3位),B(2位)的结构体。


  • lv_color16_t 用于存储16位颜色(2字节)的R(5位),G(6位),B(5位)的结构体。


  • lv_color32_t 用于存储24位颜色(4字节)的R(8位),G(8位),B(8位)的结构体。


  • lv_color_t 等于 lv_color1/8/16/24_t 根据颜色深度设置


  • lv_color_int_t uint8_tuint16_tuint32_t 根据颜色深度设置。用于从纯数字构建颜色阵列。


  • lv_opa_t 一种简单的 uint8_t 类型,用于描述不透明度。

lv_color_tlv_color1_tlv_color8_tlv_color16_tlv_color32_t 类型具有四个字段:



  • ch.red 红色通道


  • ch.green 绿色通道


  • ch.blue 蓝色通道


  • full 红+绿+蓝为一个数字

通过将 LV_COLOR_DEPTH 定义设置为1(单色),8、16或32,可以在lv_conf.h中设置当前颜色深度。

转换颜色

可以将一种颜色从当前颜色深度转换为另一种颜色。转换器函数以数字返回,因此必须使用 完整 字段:

lv_color_t c;
c.red = 0x38;
c.green = 0x70;
c.blue = 0xCC;
lv_color1_t c1;
c1.full = lv_color_to1(c); /*Return 1 for light colors, 0 for dark colors*/
lv_color8_t c8;
c8.full = lv_color_to8(c); /*Give a 8 bit number with the converted color*/
lv_color16_t c16;
c16.full = lv_color_to16(c); /*Give a 16 bit number with the converted color*/
lv_color32_t c24;
c32.full = lv_color_to32(c); /*Give a 32 bit number with the converted color*/

交换16种颜色

可以在lv_conf.h中设置 LV_COLOR_16_SWAP 以交换RGB565颜色的字节。如果通过SPI等面向字节的接口发送16位颜色,则很有用。

由于16位数字以Little Endian格式存储(低位地址的低位字节),因此接口将首先发送低位字节。但是,显示通常首先需要较高的字节。字节顺序不匹配会导致色彩严重失真。

创建和混合颜色

可以使用LV_COLOR_MAKE宏以当前颜色深度创建颜色。它使用3个参数(红色,绿色,蓝色)作为8位数字。例如,创建浅红色: my_color = COLOR_MAKE(0xFF,0x80,0x80) .

颜色也可以从十六进制代码创建: my_color = lv_color_hex(0x288ACF)my_color = lv_folro_hex3(0x28C) .

可以混合两种颜色:mixed_color = lv_color_mix(color1, color2, ratio) 。比例可以是 0..255。 0 表示全彩色 2,255 表示全彩色 1。

也可以使用 lv_color_hsv_to_rgb(hue,saturation,value) 从HSV空间创建颜色。色相应在 0..360 范围内,饱和度和值应在 0..100 范围内。

不透明度

为了描述不透明度,创建了 lv_opa_t 类型作为 uint8_t 的包装。还介绍了一些定义:



  • LV_OPA_TRANSP 值:0,表示不透明度使颜色完全透明


  • LV_OPA_10 值:25,表示颜色仅覆盖一点


  • LV_OPA_20 … OPA_80 比较常用


  • LV_OPA_90 值:229,表示几乎完全覆盖的颜色


  • LV_OPA_COVER 值:255,表示颜色完全覆盖

还可以将 LV_OPA_* 定义 lv_color_mix() 作为比率使用。

内置颜色

颜色模块定义了最基本的颜色,例如:


  • #FFFFFF LV_COLOR_WHITE

  • #000000 LV_COLOR_BLACK

  • #808080 LV_COLOR_GRAY

  • #c0c0c0 LV_COLOR_SILVER

  • #ff0000 LV_COLOR_RED

  • #800000 LV_COLOR_MAROON

  • #00ff00 LV_COLOR_LIME

  • #008000 LV_COLOR_GREEN

  • #808000 LV_COLOR_OLIVE

  • #0000ff LV_COLOR_BLUE

  • #000080 LV_COLOR_NAVY

  • #008080 LV_COLOR_TEAL

  • #00ffff LV_COLOR_CYAN

  • #00ffff LV_COLOR_AQUA

  • #800080 LV_COLOR_PURPLE

  • #ff00ff LV_COLOR_MAGENTA

  • #ffa500 LV_COLOR_ORANGE

  • #ffff00 LV_COLOR_YELLOW

以及 LV_COLOR_WHITE (全白)。


推荐阅读
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Html5-Canvas实现简易的抽奖转盘效果
    本文介绍了如何使用Html5和Canvas标签来实现简易的抽奖转盘效果,同时使用了jQueryRotate.js旋转插件。文章中给出了主要的html和css代码,并展示了实现的基本效果。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • EPPlus绘制刻度线的方法及示例代码
    本文介绍了使用EPPlus绘制刻度线的方法,并提供了示例代码。通过ExcelPackage类和List对象,可以实现在Excel中绘制刻度线的功能。具体的方法和示例代码在文章中进行了详细的介绍和演示。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 记录一些 Latex 的技巧
    Latex一些技巧:1.如何创建不浮动的的figure和table\makeatletter\newcommand{\figcaption}{\def\captyp ... [详细]
author-avatar
丿虚伪丿
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有