Multiple display support

在LVGL中,可以存在多个Display,每个都有他们各自的Driver和Object。唯一的限制是这些Display的颜色深度要一样(由LV_COLOR_DEPTH定义)。如果Display的颜色深度不一致,图像可以在驱动的flush_cb中转换成正确的格式。

可以轻松创建多个Display:只需要为每个Display初始化各自的Display Buffer并注册各自的Driver。当创建UI的时候,调用lv_disp_set_default(disp)来告知LVGL在哪个Display上创建Object。

为什么会需要多屏幕的支持呢?下面是一些使用场景:

  • 一个正常的TFT用于显示本地的UI,同时在VNC上创建一个虚拟的屏幕(需要添加VNC驱动)。
  • 一个大的TFT显示屏和一个小的单色屏。
  • 在大型设备上有多个小的简单的屏幕。
  • 有两块TFT显示屏,一个用于给用户显示,一个用于给店员显示。

Using only one display

用多个Display可以很有用,但是在大多数场景中,并不需要这样。因此,当仅仅注册了一个Display的时候,整个多屏显示的概念是隐藏起来的。默认情况下,最后创建的Display将作为默认Display。

lv_scr_act(),lv_scr_load(scr),lv_layer_top(),lv_lay_sys(),LV_HOR_RES和LV_VER_RES总是应用在最后创建(默认)的Display上。如果给Display相关的函数的disp参数传递NULL,通常就会使用默认的Display,如lv_disp_trig_activity(NULL)会在默认屏幕上触发一次User Activity。

Mirror display

如果只是想实现屏幕镜像,就不需要使用多屏显示,而只需要在drv.flush_cb()里面将buffer发送给另外一个Display。

Split image

可以用下面的方法将多个小屏组成一个大屏:

  1. 将Display的分辨率设置为大屏幕的分辨率。
  2. 在drv.flush_cb()中清空并为每个Display修改area参数。
  3. 将修改后的区域的buffer发送给每个Display。

Screens

每个Display都有各自的Screen集合以及Screen上的Object。

不要混淆Display和Screen的概念:

  • Display是绘制像素的物理硬件。
  • Screen是和某个Display关联的,高等级的根Object。一个Display可以有多个Screen和它关联,但是反过来就不对。

Screen可以看作是没有父Object的最高等级的容器。Screen的尺寸总等于Display的尺寸并且其坐标是(0, 0)。因此Screen的坐标不可更改,即lv_obj_set_pos(),lv_obj_set_size()这样的函数不可用于Screen。

Screen可以从任何类型的Object创建,但是有两种常见的类型:Base Object和Image(壁纸)。

调用lv_obj_t * scr = lv__create(NULL, copy)来创建Screen,其中copy是另一个可以复制的Screen。

调用lv_scr_load(scr)载入Screen,调用lv_scr_act()获取当前活跃Screen。这些函数都在默认Display上生效。如果想要指定Display,调用lv_disp_get_scr_act()和lv_disp_load_scr(disp, scr)。Screen的载入也可以添加动画。

Screen可以用lv_obj_del(scr)来删除,但是要确保不会删除当前的Screen。

Transparent screens

通常,Screen的不透明度是LV_OPA_COVER以为其子Object提供完全不透明的背景。如果不透明度不是这个值,Display的背景色或者背景图案就会可见。如果Display的背景的不透明度也不是LV_OPA_COVER,LVGL就不会绘制完全不透明的背景。

上述这样的配置(Screen和Display都透明)可以用于创建如OSD这样的菜单,其下层Layer播放视频,上层Layer显示菜单。

LVGL需要使用特殊的(慢的)颜色混合算法来实现透明度的显示,因此lv_conf.h中的LV_COLOR_SCREEN_TRANSP需要使能。由于这个模式是控制像素的Alpha通道,所以需要设置LV_COLOR_DEPTH=32。32位颜色的Alpha通道在没有Object的地方为0,在有完全不透明Object的地方为255。

综上所述,要使用透明的Screen和Display以创建OSD菜单这样的显示效果,要按如下设置:

  • 使能lv_conf.h中的LV_COLOR_SCREEN_TRANSP。
  • 确保使用LV_COLOR_DEPTH_32。
  • 设置Screen的不透明度为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)设置Display的不透明度为LV_OPA_TRANSP。

Features of displays

Inactivity

每个Display的用户不活跃是分开统计的。每次使用输入设备(如果与Display关联)都视为一次活动。要获取上次活跃之后的时间间隔,调用lv_disp_get_inactive_time(disp)。如果参数传递NULL,将返回所有Display中,最小的不活跃时间(注意不是默认Display)。

可以调用lv_disp_trig_activity(disp)手动触发一次活动。如果参数传递NULL,仅仅会使用默认Display(注意不是所有Display)。

Background

每个Display都有背景色,背景图片和背景不透明度属性。当当前Screen是透明的,或者没有覆盖整个屏幕的时候,Display的背景才可见。

背景色就是填充Display的颜色,可用lv_disp_set_bg_color(disp, color)来设置。

背景图片是文件路径或者指向lv_img_dsc_t类型变量(转换后的图片)的指针,被当作墙纸来使用。可以用lv_disp_set_bg_color(disp, &my_img)来设置。如果设置了背景图片(即非空),就不再显示背景色。

背景色或者背景图片的不透明度可以用lv_disp_set_bg_opa(disp, opa)来设置。

上面这些函数中,disp参数如果传NULL,就是指默认Display。

Colors

颜色模块处理所有与颜色有关的函数,如改变颜色深度,从16进制代码创建颜色,在不同颜色深度之间转换,混合颜色等等。

下面是颜色模块定义的变量:

  • lv_color1_t 存储单色。从兼容性考虑,它也有RGB字段,但是他们的值总是一样的。
  • lv_color8_t 存储组成8位颜色(R(3位),G(3位),B(2位))的结构体 (1字节)。
  • lv_color16_t 存储组成16位颜色(R(5位),G(6位),B(5位))的结构体(2字节)。
  • lv_color32_t 存储组成24位颜色(R(8位),G(8位),B(8位))的结构体(4字节)。
  • lv_color_t 根据颜色深度设置,等同于lv_color1/8/16/24_t。
  • lv_color_int_t 根据颜色深度设置,等同于uint8_t,uint16_t或者uint32_t。用于从数字创建颜色数组。
  • lv_opa_t 用于描述不透明度的uint8_t类型。

lv_color_t,lv_color1_t,lv_color8_t,lv_color16_t和lv_color32_t类型都有4个字段:

  • ch.red 红色通道
  • ch.green 绿色通道
  • ch.blue 蓝色通道
  • full 将三个通道合成一个数字

可以通过设置lv_conf.h中的LV_COLOR_DEPTH为1、8、16、32来设置当前的颜色深度。

Convert color

可以将当前颜色深度中的一个颜色转换成另外一个颜色深度中的颜色。转换函数返回一个数字,所以要使用full字段。

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*/

Swap 16 colors

可以通过设置lv_conf.h中的LV_COLOR_16_SWAP宏来交换RGB565颜色的字节序。如果是通过SPI接口这样的基于字节的接口发送颜色的话,这会很有用。

因为16bit的数字是用小端的格式存储的(低字节存储在低地址),接口会先发送低字节。然而Display通常是先需要高字节。字节顺序的错乱会导致颜色的错乱。

Create and mix colors

可以用LV_COLOR_MAKE宏在当前颜色深度创建颜色。需要三个8位的参数(红,绿,蓝)。例如创建淡红色:my_color = COLOR_MAKE(0xFF, 0x80, 0x80)。

也可以用16进制数来创建颜色:my_color = lv_color_hex(0x288ACF)或者my_color = lv_folro_hex3(0x28C)。

用mixed_color = lv_color_mix(color1, color2, ratio)可以混合两种颜色。ratio的取值范围是0 ~ 255。0表示全是color1,255表示全是color2。

也可以用lv_color_hsv_to_rgb(hue, saturation, value)从HSV空间创建颜色。hue的取值范围是0 ~ 360,saturation和value的取值范围是0 ~ 100。

Opacity

为了描述不透明度,封装了uint8_t类型为lv_opa_t。下面是一些定义:

  • LV_OPA_TRANSP 0:表示全透明。
  • LV_OPA_10 25:表示只有一点点不透明。
  • LV_OPA_20 … OPA_80 即字面含义。
  • LV_OPA_90 229:几乎都不透明。
  • LV_OPA_COVER 255:完全不透明。

在lv_color_mix()函数中也可以用上面这几个宏。

Built-in colors

有如下基本颜色的定义:

  • LV_COLOR_WHITE
  • LV_COLOR_BLACK
  • LV_COLOR_GRAY
  • LV_COLOR_SILVER
  • LV_COLOR_RED
  • LV_COLOR_MAROON
  • LV_COLOR_LIME
  • LV_COLOR_GREEN
  • LV_COLOR_OLIVE
  • LV_COLOR_BLUE
  • LV_COLOR_NAVY
  • LV_COLOR_TEAL
  • LV_COLOR_CYAN
  • LV_COLOR_AQUA
  • LV_COLOR_PURPLE
  • LV_COLOR_MAGENTA
  • LV_COLOR_ORANGE
  • LV_COLOR_YELLOW
  • LV_COLOR_WHITE

LVGL官方文档-7.11.0-14-Overview-Displays相关推荐

  1. LVGL官方文档-7.11.0-5-Porting-Input device interface

    Types of input devices 配置输入设备的时候,需要初始化一个lv_indev_drv_t类型的变量: lv_indev_drv_t indev_drv; lv_indev_drv_ ...

  2. LVGL官方文档-7.11.0-4-Porting-Display interface

    为了配置一个Display,一个lv_disp_buf_t类型的变量和一个lv_disp_drv_t类型的变量必须要初始化. lv_disp_buf_t 包含内部的图像buffer lv_disp_d ...

  3. LVGL官方文档-7.11.0-8-Porting-Logging

    默认情况下,LVGL不是线程安全的. 但是,在下列情况下,调用LVGL相关函数是安全的. 在Event中. 在lv_task中. Tasks and threads 如果需要使用正常的Task或者是线 ...

  4. Harbor安装教程-完全根据官方文档2.6.0版本

    说明: 版本2.6.0 一.安装要求 硬件 硬件类型 最小要求 建议 CPU 2 CPU 4 CPU 内存 4 GB 8GB 硬盘 40 GB 160 GB 软件 软件名称 版本 Docker eng ...

  5. boost官方文档同步机制Synchronization mechanisms overview

    参考链接 官方文档 Synchronization mechanisms overview Named And Anonymous Synchronization Mechanisms Types O ...

  6. tensorflow官方文档_Tensorflow 2.0 Preview 官方文档

    TensorFlow 2.0目前放出了Preview版本.目前想了解TensorFlow 2.0最快的方式就是查看官方API中的变化.本文列举一些从TF官方API中看出的TF 2.0的改进. Tens ...

  7. django官方文档1.11编翻:1-1-1概述

    django概述 因为django是在快节奏的编辑环境下开发的,它旨在使常见的Web开发任务变得快速而简单. 这是一个关于如何用django编写数据库驱动的Web应用程序的非正式概述. 本文档的目的是 ...

  8. (6)APB总线协议——(官方文档阅读APB3.0)

    第一章:简介 1.1APB3介绍 低速总线协议 时钟上升沿采样,每次数据传输需要两个时钟周期 可与AHB/AXI接口连接 第二章:数据传输 2.1写传输 2.1.1无等待状态 分析: 写传输从地址.写 ...

  9. 官方文档太辣鸡?TensorFlow 2.0开源工具书,30天「无痛」上手

    本文转载自机器之心. 项目作者:lyhue1991 「官方文档排布凌乱.搜索难用.API 丑陋不堪--」这是很多人对 TensorFlow 官方文档的吐槽.但吐槽归吐槽,到了工业界,你是无论如何也绕不 ...

最新文章

  1. 关于使用JAVA中JDK安装和在命令行中编译和运行程序的一些总结
  2. 磁盘硬件结构及容量计算
  3. 国际计算机语言,国际标准的5种PLC编程语言简介
  4. Scala入门到精通——第二十三节 高级类型 (二)
  5. 语音识别插件_2D动画唇动合成,根据语音自动生成动画人物口型
  6. Bootstraptable源码
  7. android马赛克代码,android图片马赛克 mosaic
  8. Ubuntu设置终端相对短路径
  9. windows 查看ttf字体
  10. C++ cin.get用法(详解版)
  11. ora-20011 ora-01555
  12. emWin BATTON控件透明化
  13. QtWebApp的使用【在Qt中搭建HTTP服务器】(三)
  14. 骂人不带脏字的80后
  15. 谷歌的AI布局:机器学习是重心 继续在中国招人
  16. Django企业开发实战--by胡阳,学习记录1015
  17. vue3+vite UC浏览器兼容
  18. Matlab×物理化学实验:蔗糖水解反应速率常数测定
  19. python 制作电子书的软件_电子书制作软件下载-电子书制作软件工具箱下载v1.2 绿色版-西西软件下载...
  20. c语言常量中有换行符,处理 Qt 中文提示 “常量中有换行符”

热门文章

  1. Python之龟兔赛跑
  2. 5G常见缩略语大全(一)
  3. 2023年【安徽省安全员C证】免费试题及安徽省安全员C证证考试
  4. 解决 openwrt/Lede pppoe拨号频繁掉线的问题
  5. 台式机win10系统能连接上wifi,但是不能上网,终于解决了
  6. 计算机网络验证性试验报告
  7. 英文版系统远程桌面无法连接到远程计算机,windows server 2016远程桌面进去,英文系统修改语言...
  8. 全志系列芯片选型简介
  9. 计算机视觉(北邮鲁鹏)--卷积
  10. 数字证书颁发及认证原理