1:阿拉伯语与汉语的比较
阿拉伯语与汉语在书写方式上存在的一定差异,汉语是从左到右(LTR)的书写方式而阿拉伯语为从右到左(RTL)的书写方式,在LVGL中要想对文本方向进行设置我们需要打开lv_conf.h 中的 LV_USE_BIDI 将其置为1,然后再选择我们想要设置的文本方向,文本方向宏定义为LV_BIDI_BASE_DIR_DEF,其值有三种:
1:LV_BASE_DIR_LTR 从左到右
2:LV_BASE_DIR_RTL 从右到左
3: LV_BASE_DIR_AUTO 自动选择其文本方向
2:阿拉伯的unicode编码
2.1:什么是unicode编码
Unicode编码是一种字符编码标准,它为世界上几乎所有的字符和符号分配了唯一的数字标识符,以便在计算机系统中进行统一的表示和处理。
2.2:阿拉伯文字的unicode范围
( U+0600 – U+06FF) 阿拉伯字符
( U+FB50 – U+FDFF) 阿拉伯表达形式字符集 A
( U+FE70 – U+FEFF) 阿拉伯表达形式字符集 B
2.3:阿拉伯文字的unicode编码字符集的区别
阿拉伯字符(U+0600 – U+06FF):
这个字符集包含了阿拉伯语的基本字符集,包括字母、数字、标点符号和其他特殊字符。它涵盖了阿拉伯语的基本写作和书写所需的字符。
阿拉伯表达形式字符集 A(U+FB50 – U+FDFF):
这个字符集包含了阿拉伯语的表达形式字符,用于在特定上下文中表示阿拉伯语的字母和词汇。它包括了与阿拉伯语书写方式相关的字母变体、连接形式和调整形式等特殊字符。
阿拉伯表达形式字符集 B(U+FE70 – U+FEFF):
这个字符集也包含了阿拉伯语的表达形式字符,用于在特定上下文中表示阿拉伯语的字母和词汇。它包括了更多的字母变体、连接形式和其他特殊字符,用于在不同书写环境中正确呈现阿拉伯语文本。
3:阿拉伯语连笔
"مفاتيح الاختصار"对这个观察可以看出其中存在着多个字符连接在一起的情况,这就是阿拉伯语中的连笔写法,连笔(Ligature)是一种书写特性,它涉及将相邻的字母以一种特定的方式连接在一起形成一个字形。连笔在阿拉伯语中广泛使用,旨在改善字母之间的连续性和整体美感。如果要想我们LVGL显示出来的文本也具有这种连笔效果效果的话,我们就需要使能开启lv_conf.h中的LV_USE_ARABIC_PERSIAN_CHARS 置为1,使能这个宏定义的作用在于/*启用阿拉伯语/波斯语处理在这些语言中,字符应根据它们在文本中的位置被替换为其他形式。
#define LV_USE_ARABIC_PERSIAN_CHARS 0
#define LV_USE_ARABIC_PERSIAN_CHARS 1
4:直接使用LVGL里面的自定义字体
在lvgl中阿拉伯的相关字体是LV_FONT_DEJAVU_16_PERSIAN_HEBREW
16 px 字体,正常范围 + 希伯来语、阿拉伯语、波斯语字母及其所有形式,我们想要使用的话就想要打开 将LV_FONT_DEJAVU_16_PERSIAN_HEBREW
使能置1,然后再设置lable字体的时候设置为该字体
lv_obj_t *mylable=lv_label_creat(lv_scr_act());
lv_obj_set_style_text_font(mylable,&&lv_font_dejavu_16_persian_hebrew,0);
lv_obj_align(mylable,LV_ALIGN_CENTER,0,0);
lv_obj_set_size(mylable,LV_PCT(50),LV_PCT(50));
LV_label_set_text(mylable,"مفاتيح الاختصار");
5:结合freetype进行渲染
5.1:什么是ttf文件
ttf(True Type Font)是一种字库名称,ttf文件就是字体文件;
5.2:freetype
freetypeFreeType是一个完全开源的、可扩展、可定制且可移植的字体引擎,它提供TrueType字体驱动的实现统一的接口来访问多种字体格式文件,包括点阵字、TrueType、OpenType、Type1
5.3:获取字体的ttf文件
为了达到连笔的效果ttf文件一定要包含( U+0600 – U+06FF) 阿拉伯字符( U+FB50 – U+FDFF) 阿拉伯表达形式字符集 A ( U+FE70 – U+FEFF) 阿拉伯表达形式字符集 B,此处我推荐下载DejaVu Sans 字体 | Fonts2u.com 的阿拉伯字体库(因为我下载了其他的阿拉伯字体库里面没有包含字符集A和B,造成显示的阿拉伯字体一直没有连笔的效果,在这里就卡了很长的时间)。
5.3:初始化字体
//字体信息,ttf文件名,字体大小
bool _InitFont(lv_ft_info_t* pftinfo, const char* ttfname, int size)
{
pftinfo->name = ttfname;
pftinfo->weight = size;
pftinfo->style = FT_FONT_STYLE_NORMAL;
pftinfo->mem = NULL;
if (!lv_ft_font_init(pftinfo))
{
xlog_error("init font error! font:%s, size:%d", ttfname, size);
return false;
}
pftinfo->font->fallback = LV_FONT_DEFAULT;
return true;
}
/*lv_ft_info_t*/
typedef struct {
const char * name; /* The name of the font file */
const void * mem; /* The pointer of the font file */
size_t mem_size; /* The size of the memory */
lv_font_t * font; /* point to lvgl font */
uint16_t weight; /* font size */
uint16_t style; /* font style */
} lv_ft_info_t;
5.4:使用通过freetype渲染出来的字体
lv_obj_t *mylable=lv_label_creat(lv_scr_act());
lv_obj_set_style_text_font(mylable,pftinfo.font,0);
lv_obj_align(mylable,LV_ALIGN_CENTER,0,0);
lv_obj_set_size(mylable,LV_PCT(50),LV_PCT(50));
LV_label_set_text(mylable,"مفاتيح الاختصار");