在 LVGL 中,字体是渲染单个字母(字形)图像所需的位图和其他信息的集合,字体存储在 lv_font_t 变量中,可以在样式的 text_font 字段中设置。 例如:
字体具有 bpp(像素位数) 属性,它显示了使用多少位来描述字体中的像素,像素值决定像素的不透明度。
这样,使用更高的 bpp,字母的边缘可以更平滑。 可能的 bpp 值为 1、2、4 和 8(值越高表示质量越好)。
bpp 属性还会影响存储字体所需的内存量。 例如,bpp = 4 使字体比 bpp = 1 大近四倍。
LVGL 支持 UTF-8 编码的 Unicode 字符。 编辑器通常需要配置为将代码/文本保存为 UTF-8(通常是默认值)格式, LV_TXT_ENC 在 lv_conf.h 中设置为 LV_TXT_ENC_UTF8。 (默认值)
测试:
如果一切正常,应显示 ✓ 字符。
有几种不同大小的内置字体,可以在 lv_conf.h 中使用 LV_FONT_… 定义启用。
包含所有 ASCII 字符、度数符号 (U+00B0)、子弹符号 (U+2022) 和内置符号(见下文)。
内置字体是全局变量,名称如下 lv_font_montserrat_16 对于 16 px 高度的字体。 要在样式中使用它们,只需添加一个指向字体变量的指针,即字体名称。
这些符号可以单独使用:
或与字符串一起使用(编译时字符串连接):
或多个符号组合在一起:
大多数语言使用从左到右(简称 LTR)书写方向,但是某些语言(例如希伯来语、波斯语或阿拉伯语)使用从右到左(简称 RTL)方向。
LVGL 不仅支持 RTL 文本,还支持混合(又名双向,BiDi)文本渲染。 一些例子:
BiDi 支持由 lv_conf.h 中的 LV_USE_BIDI 启用
所有文本都有一个基本方向(LTR 或 RTL),它决定了一些渲染规则和文本的默认对齐方式(左或右)。 然而,在 LVGL 中,基本方向不仅适用于标签,同样可以为每个对象设置的通用属性。 如果未设置,则它将从父级继承,这意味着设置屏幕的基本方向就足够了,每个对象都会继承它。
屏幕的默认基本方向可以通过 lv_conf.h 中的 LV_BIDI_BASE_DIR_DEF 设置,其他对象从其父对象继承方向。
要设置对象的基本方向,请使用 lv_obj_set_base_dir(obj, base_dir)。 可能的基本方向是:
此列表总结了 RTL 基本方向对对象的影响:
There are some special rules to display Arabic and Persian characters: the form of a character depends on its position in the text. A different form of the same letter needs to be used if is isolated, at start, middle or end positions. Besides these, some conjunction rules should also be taken into account.
LVGL supports these rules if LV_USE_ARABIC_PERSIAN_CHARS is enabled.
However, there some limitations:
For subpixel rendering, the fonts need to be generated with special settings:
Subpixel rendering works only if the color channels of the pixels have a horizontal layout. That is the R, G, B channels are next each other and not above each other. The order of color channels also needs to match with the library settings. By default, LVGL assumes RGB order, however this can be swapped by setting LV_SUBPX_BGR 1 in lv_conf.h.
The bitmaps of fonts can be compressed by
Compression is more effective with larger fonts and higher bpp. However, it’s about 30% slower to render compressed fonts. Therefore it’s recommended to compress only the largest fonts of a user interface, because
有几种方法可以将新字体添加到项目中:
要使字体全局可用(如内置字体),请将它们添加到 lv_conf.h 中的LV_FONT_CUSTOM_DECLARE。
使用符号(Using the symbol)
Example
LVGL 的字体界面设计得非常灵活,但即便如此,同样也可以添加自己的字体引擎来代替 LVGL 的内部字体引擎。
为此,需要创建一个自定义的 lv_font_t 变量:
您可以在 lv_font_t 中指定 fallback 以提供字体的回退。 当字体找不到字母的字形时,它会尝试让字体从fallback 来处理。
fallback can be chained, so it will try to solve until there is no fallback set.