一、背景

前两天在研究一个UI项目,需要支持中文字体。项目用到的是LVGL 7.11版本,默认情况下只支持英文和数字(其他LVGL版本也一样)。所以要想用上中文,必须要自己动手加上中文字体的支持。

二、先来个效果图

  • 默认情况是这样的:(只能显示数字 1,其他中文内容都看不到)

  • 改完之后是这样的:( 可以完整显示内容

三、实践过程

1、浏览官网LVGL字体相关资料

官方的LVGL 字体相关说明中找到了添加字体部分。内容如下:

大概是说有三种方法生成字体文件,以及如何在代码中使用字体文件,具体方法请继续往下看。

2、用官方工具生成字体文件

我先选择了在线工具,但我找了几个字体文件后,发现生成经常报错(其中一个错误如下图所示),也没有找到原因。

3、改用第三方工具LvglFontTool

于是又找了一个第三方工具 LvglFontTool,看起来还挺好用的,界面也比较清新。

按照网上的一些提示,选择了对应的字体文件,并选择工具中【加入常用汉字】按钮,然后生成。

4、修改相关源码

生成文件后按照官方提示的加入到代码中,具体修改内容如下:

  • 自动生成的lv_fon_sans_28.c文件主要内容
//下面这个变量需要在其他文件中引用
lv_font_t lv_font_sans_28 = {.dsc = &font_dsc,.get_glyph_bitmap = __user_font_get_bitmap,.get_glyph_dsc = __user_font_get_glyph_dsc,.line_height = 32,.base_line = 0,
};
  • 修改lv_con.h文件
// ...........* https://fonts.google.com/specimen/Montserrat  */
#ifndef LV_USING_FREETYPE_ENGINE#define LV_FONT_MONTSERRAT_12    1#define LV_FONT_MONTSERRAT_14    0#define LV_FONT_MONTSERRAT_16    1#define LV_FONT_MONTSERRAT_18    0#define LV_FONT_MONTSERRAT_20    1#define LV_FONT_MONTSERRAT_22    0#define LV_FONT_MONTSERRAT_24    1#define LV_FONT_MONTSERRAT_26    0#define LV_FONT_MONTSERRAT_28    0//1  关闭默认28号字体
//..............//LV_FONT_CUSTOM_DECLARE  最后一行添加 自定义lv_font_sans_28字体声明
#define LV_FONT_CUSTOM_DECLARE LV_FONT_DECLARE(lv_font_song) \LV_FONT_DECLARE(lvsf_font_stfangso_16) \LV_FONT_DECLARE(lvsf_font_stfangso_20) \LV_FONT_DECLARE(lvsf_font_simhei_16) \LV_FONT_DECLARE(lvsf_font_simhei_20) \LV_FONT_DECLARE(lv_font_sans_28) \
//..............
#if LV_HOR_RES_MAX > 350#define LV_THEME_DEFAULT_FONT_SMALL         &lv_font_montserrat_16#define LV_THEME_DEFAULT_FONT_NORMAL        &lv_font_montserrat_20#define LV_THEME_DEFAULT_FONT_SUBTITLE      &lv_font_montserrat_24//将TITLE字号改为:自定义lv_font_sans_28字体#define LV_THEME_DEFAULT_FONT_TITLE         &lv_font_sans_28 //&lv_font_montserrat_28#define LV_THEME_DEFAULT_FONT_BIGL          &lv_font_montserrat_36
#else
// ......
#endif

注意:这里根据实际控件中使用的字体来进行修改,我这里因为控件使用了lv_theme_get_font_subtitle定义的字体,所以修改了LV_THEME_DEFAULT_FONT_TITLE定义的字体。

5、显示失败

看完自己修改完后一次就编译通过了,就知道可能大事不好, 果不其然,什么中文都没显示,还是只有数字 1。

好在有如下图所示的错误提示了,lv_draw_letter: glyph dsc. not found

于是我翻阅了相关代码,发现是在label控件中,画文字的时候,符号没找到。
符号是通过lv_font_get_glyph_des->__user_font_get_glyph_dsc(lv_font_sans_28.c)寻找的,于是把这个letter局部变量打印出来看了一下,发现这个好像是字符编码,但实际这个编码又不是我要显示的文字编码。

为了缩小范围,减少干扰,我把代码做了一下修改,每个label只保留一个中文字符,但奇怪的是错误提示not found也不见了, 难道是生成的字体有问题? 于是又去折腾工具,发现怎么弄都没法显示。

6、编码问题

在尝试了多次无果后,看到官网的字体说明里看到了如下重要提示:源码文件需要保存为UTF-8编码格式,而我的源码文件默认是ANSI编码格式。

而且虽然没有提示,但实际上lv_draw_letter这个函数还是没有正常执行,在注释掉if (letter>=20)后,发现有大量的not found 0上报,而控件要显示的中文内容您好显然不是这个编码,这也验证了源文件编码问题

7、修改源文件编码

将需要显示中文内容的源码文件的编码格式设置为UTF-8编码格式,这里我使用了windows自带的记事本,将源码文件另存为,然后选择编码格式UTF-8

8、修改编译错误

结果在编译的时候又发现出错了,编码改回去就可以正常编译。网上查了一下发现visual studio编译器默认支持UTF-8 with BOM编码,不支持UTF-8编码格式,如果需要支持UTF-8文件,需要增加编译该文件的编译参数/utf-8,设置如下:

9、成功显示

设置完后,编译终于大功告成,可以正常显示中文了。

四、总结

LVGL字体替换的软件设计还是不错的,但工具做得并不是很好,而且过程中容易踩坑,网上相关资料也不多,需要自行摸索。特别是针对中文这类的外文字体。我个人有四点建议:

  • 1、仔细阅读官方文档,知道整个流程和限制;
  • 2、使用第三方字体转换工具(官方字体转换工具并不是很好用,特别是出现错误提示并不友好);
  • 3、字体文件一定要选择支持中文的字体文件,否则第三方工具并不提示错误,但实际却不能显示;
  • 4、注意默认情况下只支持UTF-8文件编码格式,否则会出现编码问题导致无法显示。

LVGL支持中文字体实践指南相关推荐

  1. java pdf 中文_java-pdf-itext 生成pdf 文档(支持中文字体)

    java-pdf-itext 生成pdf 文档(支持中文字体) itext 版本:2.1.7 package com.demo.preview; import java.io.ByteArrayOut ...

  2. Unity 工具 之 VText 简单快速实现 文字 3D 效果,VText 的导入设置和简单使用(可支持中文字体)

    Unity 工具 之 VText 简单快速实现 文字 3D 效果,VText 的导入设置和简单使用(可支持中文字体) 目录 Unity 工具 之 VText 简单快速实现 文字 3D 效果,VText ...

  3. Fira Code字体中增加思源黑体支持中文字体

    在Fira Code字体基础上增加思源黑体,合并到一个字体中,解决类似sourceinsight mono模式下无法显示中文的问题 下载链接如下(不需要付费,免费下载的): FiraCode字体中增加 ...

  4. Linux 服务器不支持中文字体

    下载支持中文字体语言包 地址:https://www.download-free-fonts.com/ 搜索微软雅黑:Microsoft YaHei 拷贝到linux 服务器 默认字体目录下/usr/ ...

  5. WEB中文字体应用指南

    http://www.fontsquirrel.com/fontface @font-face是CSS3中的一个模块,他主要是把自己定义的Web字体嵌入到你的网页中,随着@font-face模块的出现 ...

  6. linux不支持中文字体,evince部分中文字体不支持怎么办

    jovde 于 2009-06-02 09:16:51发表: Evince是Ubuntu系统下的PDF文件阅读器. yucos@Ubuntu-ThinkPad:~$ sudo apt-cache sh ...

  7. flex 4 中普遍支持中文字体了

    flex3 中的中文字体只支持有限的几种,要么嵌入字体,要么就使用这几种: 支持一些默认的英文字体,如Arial.Times New Roman.Courier New.Georgia.Verdana ...

  8. iOS开发苹果支持中文字体,和使用字体

    1.中文字体 转自:https://zhidao.baidu.com/question/1239016138772367339.html ios7英文字体:Helvetica 下的各种系统,例如Hel ...

  9. 解决后端乱码,制作支持中文字体JRE8基础镜像

    有时候基于官网的jdk/JRE镜像制作自己的后端镜像包运行起来,可能由于缺乏中文字体会导致程序中文乱码. 可参考如下 将你用的中文字体写到dockerfile同级fonts目录下,运行docker b ...

最新文章

  1. ASP.net 中的页面继承实现和通用页面的工厂模式的实现
  2. js 实现多选框(复选框) 和单选框,下拉框功能完整示例代码附效果图
  3. 推荐几首好听的Coldplay的歌
  4. 部署go的web应用_使用Docker部署Go Web应用
  5. frameset小结
  6. 《MongoDB权威指南》读书笔记 第一章 简介
  7. 问题之JS中传递数值过大或前置有零时
  8. WCF学习(五)数据契约之已知类型
  9. 比特币Merkle树和SPV机制
  10. 【Oracle】RAC集群中的命令
  11. 【单目标优化求解】基于matlab遗传算法求解非线性目标函数最小值问题【含Matlab源码 1574期】
  12. 网络规划设计师教程pdf版下载
  13. Ubuntu 突然不然联网解决方法
  14. 云服务器哪家比较好呢?
  15. pygal:一款好用到爆的 Python 可视化利器,炫酷动态图轻松绘制
  16. 一个复杂页面该如何布局设计
  17. 宾果消消乐和宾果消消消_《宾果消消消》攻略之关卡障碍介绍
  18. 【C语言】判断输入是否能被5整除
  19. 哈工大近世代数定义、定理、推论汇总
  20. storm笔记:Trident应用

热门文章

  1. 【云杂谈】之二《AT&T发布基于云存储的物联网产品》
  2. 跨模态/多模态 cross-modal
  3. 简易的java程序,银行管理系统
  4. html网站video标签blob视频如何下载
  5. 宜家东京出租房,每月租金1美金
  6. android课程助手,小鹅通课堂助手APP
  7. 大容量U盘制作成WinPE启动盘经验
  8. skywalking了解及搭建使用
  9. easyui实现鼠标移到某一行,就会弹出一个提示信息效果
  10. 英特尔推出首款采用3D Xpoint存储技术的SSD硬盘