LVGL学习笔记8 - 字体

news2024/9/28 9:28:53

目录

1. 修改默认字体

 2. 修改字体

3. 特殊字体

3.1 SUBPX字体

3.2 28像素压缩字体

3.3 16像素希伯来语/阿拉伯语/Perisan字母

3.4 16像素中文字体

 3.5 8像素Ascii字体

 3.6 16像素Ascii字体 

3.7 内置图标

4. 超大字体

5. 编码方式

6. 添加字体

6.1 在线字体转换器

6.2 载入字体

7. 加载二进制字体文件


字体是位图和呈现字母(字形)图像所需的其他信息的集合。LVGL的字库信息保存在lv_font_t的变量中。LVGL默认使用ASCII范围(包含所有ASCII字符,度数符号(U + 00B0),项目符号(U + 2022)和内置图标)的一组字体,在lv_conf.h中有相关的宏定义可以使能相应大小的字体,默认使用LV_FONT_MONTSERRAT_14,这里的14指的是字体大小。数字越大,字体的像素越大,占用的空间越大。

/*Montserrat fonts with ASCII range and some symbols using bpp = 4
 *https://fonts.google.com/specimen/Montserrat*/
#define LV_FONT_MONTSERRAT_8  0
#define LV_FONT_MONTSERRAT_10 0
#define LV_FONT_MONTSERRAT_12 0
#define LV_FONT_MONTSERRAT_14 1
#define LV_FONT_MONTSERRAT_16 0
#define LV_FONT_MONTSERRAT_18 0
#define LV_FONT_MONTSERRAT_20 0
#define LV_FONT_MONTSERRAT_22 0
#define LV_FONT_MONTSERRAT_24 0
#define LV_FONT_MONTSERRAT_26 0
#define LV_FONT_MONTSERRAT_28 0
#define LV_FONT_MONTSERRAT_30 0
#define LV_FONT_MONTSERRAT_32 0
#define LV_FONT_MONTSERRAT_34 0
#define LV_FONT_MONTSERRAT_36 0
#define LV_FONT_MONTSERRAT_38 0
#define LV_FONT_MONTSERRAT_40 0
#define LV_FONT_MONTSERRAT_42 0
#define LV_FONT_MONTSERRAT_44 0
#define LV_FONT_MONTSERRAT_46 0
#define LV_FONT_MONTSERRAT_48 0

1. 修改默认字体

如果要修改默认字体,可以在lv_conf.h中添加LV_FONT_DEFAULT的宏定义,LVGL默认的是LV_FONT_MONTSERRAT_14。

#define LV_FONT_DEFAULT &lv_font_montserrat_14

 对比14和24的字体

 2. 修改字体

字体信息也是保存在Style中,对应的API是

void lv_style_set_text_font(lv_style_t * style, const lv_font_t * value)

测试代码如下,显示字符串“Hello World!”, 使用24的字体,显示效果同上图第二个Rect。

    static lv_obj_t *label1 = lv_label_create(btn1);
    static lv_style_t style1;
    lv_style_init(&style1);
    lv_style_set_text_font(&style1, &lv_font_montserrat_24);
    lv_obj_add_style(label1, &style1, LV_STATE_DEFAULT);

    lv_obj_set_size(label1, LV_PCT(100), LV_PCT(80));
    lv_obj_align(label1, LV_ALIGN_CENTER, 0, 0);
    lv_label_set_text(label1, "Hello World!");

还有一个API函数是直接修改对象的字体:

void lv_obj_set_style_text_font(struct _lv_obj_t * obj, const lv_font_t * value, lv_style_selector_t selector)

 测试代码如下

    static lv_obj_t *label1 = lv_label_create(btn1);
    lv_obj_set_size(label1, LV_PCT(100), LV_PCT(80));
    lv_obj_set_style_text_font(label1, &lv_font_montserrat_24, LV_PART_MAIN);
    lv_obj_align(label1, LV_ALIGN_CENTER, 0, 0);
    lv_label_set_text(label1, "Hello World!");

3. 特殊字体

在lv_conf.h中还有6个特殊字体,其宏定义如下:

#define LV_FONT_MONTSERRAT_12_SUBPX      1
#define LV_FONT_MONTSERRAT_28_COMPRESSED 1  /*bpp = 3*/
#define LV_FONT_DEJAVU_16_PERSIAN_HEBREW 1  /*Hebrew, Arabic, Perisan letters and all their forms*/
#define LV_FONT_SIMSUN_16_CJK            1  /*1000 most common CJK radicals*/

#define LV_FONT_UNSCII_8  1
#define LV_FONT_UNSCII_16 0

3.1 SUBPX字体

LV_FONT_MONTSERRAT_12_SUBPX和LV_FONT_MONTSERRAT_12是一样的,区别是SUBPX具有亚像素渲染,即产生更高质量的字母抗锯齿效果,不过对比2者的显示效果:

选择SUBPX并没有任何显示,比较奇怪。

3.2 28像素压缩字体

与普通的28 px字体相同,但压缩字体为3 bpp(每像素位数)。

2者对比如下(左边是28px字体,右边是压缩字体): 

区别是字体文件大小不同,可以节约空间,但是牺牲速度。

 

3.3 16像素希伯来语/阿拉伯语/Perisan字母

    lv_obj_set_size(label1, LV_PCT(100), LV_PCT(80));
    lv_obj_set_style_text_font(label1, &lv_font_dejavu_16_persian_hebrew, LV_PART_MAIN);
    lv_obj_align(label1, LV_ALIGN_CENTER, 0, 0);
    lv_label_set_text(label1, "Hello World! - مرحبا");

 

测试阿拉伯语,显示效果一样。

这部分显示规则需要设置LV_USE_BIDI为1,即支持双向文本。

3.4 16像素中文字体

该字体包含1000个最常见的CJK部首。CJK,是CJK Unified Ideographs的缩写,意思是“中日韩统一表意文字”,把分别来自中文、日文、韩文、越文中,本质、意义相同、形状一样或稍异的表意文字赋予相同编码。

    lv_obj_set_size(label1, LV_PCT(100), LV_PCT(80));
    lv_obj_set_style_text_font(label1, &lv_font_simsun_16_cjk, LV_PART_MAIN);
    lv_obj_align(label1, LV_ALIGN_CENTER, 0, 0);
    lv_label_set_text(label1, "Hello World! - 你好");

 3.5 8像素Ascii字体

UNSCII_8和UNSCII_16字体都是1bpp,适合单色屏使用,占用的空间比较小。

 3.6 16像素Ascii字体 

3.7 内置图标

内置图标是和字体相关的,例如lv_font_unscii_16就没有这些图标。

显示这些图标,可以直接使用LVGL定义好的宏定义,例如:

lv_label_set_text_fmt(label1, LV_SYMBOL_OK"Hello World!%d", 12);

4. 超大字体

当需要使用大字体时需要将宏定义LV_FONT_FMT_TXT_LARGE设置为1。2者的区别如下:

#if LV_FONT_FMT_TXT_LARGE == 0
    uint32_t bitmap_index : 20;     /**< Start index of the bitmap. A font can be max 1 MB.*/
    uint32_t adv_w : 12;            /**< Draw the next glyph after this width. 8.4 format (real_value * 16 is stored).*/
    uint8_t box_w;                  /**< Width of the glyph's bounding box*/
    uint8_t box_h;                  /**< Height of the glyph's bounding box*/
    int8_t ofs_x;                   /**< x offset of the bounding box*/
    int8_t ofs_y;                   /**< y offset of the bounding box. Measured from the top of the line*/
#else
    uint32_t bitmap_index;          /**< Start index of the bitmap. A font can be max 4 GB.*/
    uint32_t adv_w;                 /**< Draw the next glyph after this width. 28.4 format (real_value * 16 is stored).*/
    uint16_t box_w;                 /**< Width of the glyph's bounding box*/
    uint16_t box_h;                 /**< Height of the glyph's bounding box*/
    int16_t ofs_x;                  /**< x offset of the bounding box*/
    int16_t ofs_y;                  /**< y offset of the bounding box. Measured from the top of the line*/
#endif

5. 编码方式

#define LV_TXT_ENC LV_TXT_ENC_UTF8

LVGL支持2种编码方式,LV_TXT_ENC_UTF8和LV_TXT_ENC_ASCII。ASCII码只能支持英文,UTF8可以支持所有的文字显示。

6. 添加字体

6.1 在线字体转换器

https://lvgl.io/tools/fontconverterhttps://lvgl.io/tools/fontconverter

字体名字对应生成的文件名和字体变量名。

const lv_font_t lv_font_alibaba_regular_12 = 

Range是Unicode范围,这是如果填入0xff00到0xffff就会提示错误。

编码范围字符数量编码内容
0x0020-0x007F96ASCII码
0x0080-0x00BF64ASCII码增补( ©
0x2600-0x26FF256各种符号(   )
0x3000-0x301F32CJK符号( 
0x3040-0x309F94日文平假名
0x30A0-0x30FF94日文片假名
0x4E00-0x9FAF20902所有简体、繁体、日文汉字
0xAC00-0xD7A311172韩文音节
0xFF00-0xFF64100全角英文数字与标点

Symbols是将需要的文字填入即可。

6.2 载入字体

将生成的c文件加入工程,然后在lv_conf.h中找到LV_FONT_CUSTOM_DECLARE添加这个字体

#define LV_FONT_CUSTOM_DECLARE      LV_FONT_DECLARE(lv_font_montserrat_24)

多个字体则空格连续添加即可。

这个字体没有对应的图标,所以 LV_SYMBOL_OK并没有显示对。

7. 加载二进制字体文件

LVGL默认是用c文件导入到工程中实现字体的加载。如果使用外部存储的话,需要动态加载二进制文件的方式实现。

lv_font_t * lv_font_load(const char * font_name)

注意,要加载字体,需要启用LVGL的文件系统,并添加驱动程序。

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

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

相关文章

【微服务笔记01】微服务组件之Eureka注册中心的介绍及其基础环境的搭建

这篇文章&#xff0c;主要介绍微服务中的注册中心Eureka及其基础环境的搭建【源代码地址】。 目录 一、Eureka注册中心 1.1、什么是注册中心 1.2、注册中心原理 二、搭建Eureka注册中心环境 2.1、创建父工程&#xff0c;引入微服务依赖 2.2、创建Eureka服务端工程 &…

全球公开的DEM数据产品

1 简介 全球公开版地形数据包括&#xff1a;GTOPO30-DEM、ASTER-GDEM、SRTM90、ALOS-AW3D30等&#xff0c;其他的诸如World DEM及ALOS-AW3D (5m分辨率&#xff09;等全球地形数据不能免费获得。 SRTM&#xff1a;由NASA 及国家地理空间情报局NGA采用2000年2月发射的“奋进号”…

word文件损坏打不开如何修复?文件丢失怎么办?

我们日常办公中&#xff0c;经常用到Word文档。但是有时会遇到word文件损坏、无法打开的情况。这时该怎么办&#xff1f;接着往下看&#xff0c;小编在这里就给大家带来Word文件修复的方法&#xff0c;以及Word文件丢失如何恢复的方法&#xff01; 一、Word文件损坏怎么办 部分…

【vsan数据恢复】磁盘离线导致分布式存储瘫痪的数据恢复案例

vsan数据恢复环境&#xff1a; 一组4台服务器搭建vsan集群&#xff1b; 每台服务器配置有2组分别由6块硬盘组成的磁盘阵列&#xff0c;上层是虚拟机文件。 vsan故障&#xff1a; 在运行过程中&#xff0c;某一个节点的一块硬盘离线&#xff0c;vsan安全机制启动&#xff0c;开始…

梦想云图Node.JS服务 ( 最近更新时间:2022-12-30 10:04:50 )

说明 后台提供梦想Node.JS服务&#xff0c;方便调用控件后台功能&#xff0c;Windows服务程序所在目录:Bin\MxDrawServer\Windows&#xff0c;Linux服务程序所在目录:Bin\Linux\MxDrawServer 梦想云图Node.JS服务 &#xff08; 最近更新时间&#xff1a;2022-12-30 10:04:50 …

第三个脚本——时间加速and视频倍速

目录 本文主要内容 granr属性介绍 run-at属性 时间加速原理 视频倍速原理 完整示例 本文主要内容 介绍grant属性&#xff0c;run-at属性以及时间加速&#xff0c;视频倍速原理 granr属性介绍 相关函数四个&#xff1a; GM_setValue GM_getValue GM_listValues GM_del…

json基本使用与简介

一、简介 二、json两种构造结构 三、js解析JSON 1、JSON2解析JSON 2.用eval()方法把JSON字符串转化成JSON对象. 3&#xff0e;使用JSON2中的JSON对象的parser()方法解析JSON字符串 4. 使用JSON2中的JSON对象的stringify ()方法把JSON对象转换成字符串 5、案例 四、Java解…

【模型部署】人脸检测模型DBFace C++ ONNXRuntime推理部署(1)

系列文章目录 【模型部署】人脸检测模型DBFace C ONNXRuntime推理部署&#xff08;0&#xff09; 【模型部署】人脸检测模型DBFace C ONNXRuntime推理部署&#xff08;1&#xff09; 【模型部署】人脸检测模型DBFace C ONNXRuntime推理部署&#xff08;2&#xff09; 文章目录…

深度学习训练营之灵笼人物识别

深度学习训练营之灵笼人物识别原文链接环境介绍前置工作设置GPU导入数据数据查看数据预处理加载数据可视化数据检查数据配置数据集prefetch()功能详细介绍&#xff1a;归一化查看归一化后的数据构建VGG-19网络VGG优点VGG缺点利用官方给到的网络网络结构编译模型训练结果可视化预…

第03讲:GitHub的使用

一、创建远程仓库 访问GitHub官方网站&#xff0c;并创建账号&#xff0c;然后按照以下图示创建项目 复制仓库地址 二、远程仓库的操作 命令作用git remote -v查看当前所有远程地址别名git remote add 别名 远程地址起别名git push 别名 分支推送本地分支上的内容到远程仓库…

vscode+opencv+mingw+cmake配置vscode下的opencv环境

目录介绍安装VsCode安装mingw安装cmake安装opencv&#xff0c;以及其扩展库 opencv_contrib安装python利用cmake生成opencv的Makefile文件cmake命令进行编译&#xff0c;安装配置opencv环境变量配置VSCODE测试DEMO介绍 参考链接&#xff1a;https://www.cnblogs.com/czlhxm/p/…

教育行业回访话术

近些年来&#xff0c;随着知识经济的快速发展&#xff0c;教育市场呈现良好的增长态势。越来越多的人开始通过参加各种培训来提升自己&#xff0c;教育行业竞争十分激烈。 前言 近些年来&#xff0c;随着知识经济的快速发展&#xff0c;教育市场呈现良好的增长态势。而且由于受…

人力资源软件对中小企业的七点重要性

对于中小企业&#xff08;SMB&#xff09;来说&#xff0c;员工就意味着一切。你的员工几乎掌握着企业的整体增长和发展&#xff0c;他们可以成就企业&#xff0c;但也能破坏企业的发展。为了提高员工效率&#xff0c;中小型企业需要出色的人力资源管理。员工只有在受到重视和培…

被新手忽视的 自谐振频率点

在MHz的DCDC和RF LNA电路中&#xff0c;被新手忽视的 自谐振频率点Self-Resonant Frequency 计算公式为 下图显示了 1μF&#xff0c;封装为 1206 的陶瓷电容器的阻抗&#xff08;MLCC有经典的V型阻抗-频率曲线。随着频率升高&#xff0c;寄生电感的影响开始凸显&#xff0c;阻…

Faster RCNN网络源码解读(Ⅴ) --- GeneralizedRCNNTransform图像初始化代码解析

目录 一、代码作用&#xff08;transform.py&#xff09; ​编辑 二、代码解析 2.1 GeneralizedRCNNTransform类 2.1.1 初始化函数__init__ 2.1.2 normalize标准化处理 2.1.3 将图像以及bndbox进行缩放resize 2.1.4 batch_images 2.1.5 正向传播 forward 2.1.6 后…

分布式系统共识机制:一致性算法设计思想

分布式系统共识机制&#xff1a;一致性算法设计思想Paxos 算法节点角色算法流程Raft 算法节点角色核心机制leader选举日志复制PBFTHotstuff门限签名核心机制二阶段提交协议三阶段提交协议这次以一个宏观的角度去总结 自己学习过的一致性算法。一致性算法的目标就是让分布式系统…

Java开发 - 树(二叉树,二叉排序树,红黑树)

目录 前言 你好&#xff0c;认识一下&#xff0c;我是树 二叉树与二叉排序树 二叉排序树特点 为什么说二叉排序树查询效率要高于链表呢&#xff1f; 元素的类型 比较器 手写二叉排序树 定义一棵二叉树 增加元素 查询元素 修改元素 删除元素 遍历二叉树 重写toS…

JAVA注解处理API实战

简介 ​ 插件化注解处理(Pluggable Annotation Processing)API JSR 269提供一套标准API来处理Annotations( JSR 175),实际上JSR 269不仅仅用来处理Annotation&#xff0c;它建立了Java 语言本身的一个模型,它把method、package、constructor、type、variable、enum、annotatio…

工业远程I/O模块 CANopen 通讯

1.对象字典OD 对象字典是每个CANopen设备必须具有的功能&#xff0c;它包含了设备所有可以被访问的参数&#xff0c;客户端使用索引(Index)和子索引(Sub-index)来读写对象字典里的参数。 对象字典主要用来设定设备组态及进行非即时的通讯。每个对象采用16位索引的方式来寻址&…

01Editor最新破解

文章目录01Editor最新版注册算法逆向1.定位注册算法代码2.整体注册算法3.Check1算法分析4.Check2算法分析5.获得正确的任意用户名对应的序列号01Editor最新版注册算法逆向 1.定位注册算法代码 【版本】13.0.164bit\textcolor{green}{【版本】13.0.1\ 64bit}【版本】13.0.1 64b…