硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1180|回复: 24
收起左侧

[LVGL] 请教下使用 lvgl 显示中文字符, label 控件有些不需要转换utf8 , 有些又需要转换 有些搞迷糊了 ?

[复制链接]

677

主题

3460

回帖

5516

积分

论坛元老

积分
5516
发表于 2024-11-11 20:40:05 | 显示全部楼层 |阅读模式
本帖最后由 hpdell 于 2024-11-12 14:30 编辑



请教下使用 lvgl 显示中文字符, label 控件有些不需要转换utf8 , 有些又需要转换 有些搞迷糊了 ?

而且有些转换 utf8 后 显示正常,但是会出现提示信息如下:
utf8.png

字库里面对应的汉字编码
4e86.png

5fc3.png

6ca1.png

7684.png









回复

使用道具 举报

2

主题

32

回帖

38

积分

新手上路

积分
38
发表于 2024-11-12 08:23:30 | 显示全部楼层
显示正常确实很奇怪。我遇到的情况是我给的字库里没有相应的字,所以lvgl显示不出来,会显示一个框框。因为推荐使用lvgl官方字体转换网页进行字体转换和字库生成https://lvgl.io/tools/fontconverter,或者在guiguider里面把你想要的字都打一遍,设置好相应的字体,大小等其他属性,生成c文件再导入到你需要的地方。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115434
QQ
发表于 2024-11-12 10:08:08 | 显示全部楼层
帮顶。
回复

使用道具 举报

677

主题

3460

回帖

5516

积分

论坛元老

积分
5516
 楼主| 发表于 2024-11-12 14:20:23 | 显示全部楼层
本帖最后由 hpdell 于 2024-11-12 14:22 编辑
浅末哈哈 发表于 2024-11-12 08:23
显示正常确实很奇怪。我遇到的情况是我给的字库里没有相应的字,所以lvgl显示不出来,会显示一个框框。因为 ...

字库我也是使用 网页转换出来的,而且我显示的字符在字库里面是可以找到的,
而且我显示的中文有些是需要读取 sd 卡里面的文件进行显示的,所以没有办法在 gui guider 里面都打一遍呀,因为显示的中文是不固定的

我使用 lvgl 提供的字库转换工具也试过,貌似也不行,

感觉 lvgl 显示中文 没有 guix, emwin 好用啊
回复

使用道具 举报

677

主题

3460

回帖

5516

积分

论坛元老

积分
5516
 楼主| 发表于 2024-11-12 14:22:45 | 显示全部楼层
回复

使用道具 举报

2

主题

32

回帖

38

积分

新手上路

积分
38
发表于 2024-11-12 14:52:47 | 显示全部楼层
hpdell 发表于 2024-11-12 14:20
字库我也是使用 网页转换出来的,而且我显示的字符在字库里面是可以找到的,
而且我显示的中文有些是需 ...

那看看你出问题的那一个label的设置:
先声明字体(*.c)

再在创建label的时候进行调用



大概顺序就是这样,有些情况下,这一部分的头文件需要更改,怕找不到路径

这样就能正常调用了。
回复

使用道具 举报

677

主题

3460

回帖

5516

积分

论坛元老

积分
5516
 楼主| 发表于 2024-11-12 16:21:30 | 显示全部楼层
浅末哈哈 发表于 2024-11-12 14:52
那看看你出问题的那一个label的设置:
先声明字体(*.c)

我同样的 label 控件, 只是他们在不同的页面,

有些页面 不需要转换为 utf8 显示中文是正常的,

有些页面需要转换为 utf8 显示是正常的,

有些页面转换为 utf8 显示时正常,但是有警告提示, 操作顺序也都是你说的那个流程搞下来的

现在灰常的懵逼呀

回复

使用道具 举报

677

主题

3460

回帖

5516

积分

论坛元老

积分
5516
 楼主| 发表于 2024-11-12 16:37:56 | 显示全部楼层
浅末哈哈 发表于 2024-11-12 14:52
那看看你出问题的那一个label的设置:
先声明字体(*.c)

如果找不到路径,编译应该会报错吧 ?
貌似图片没有显示出来呀
回复

使用道具 举报

2

主题

32

回帖

38

积分

新手上路

积分
38
发表于 2024-11-12 16:49:49 | 显示全部楼层
hpdell 发表于 2024-11-12 16:21
我同样的 label 控件, 只是他们在不同的页面,

有些页面 不需要转换为 utf8 显示中文是正常的,

不太科学,https://lvgl.100ask.net/8.1/overview/font.html查看一下这一部分,可能是有些conf没配置好,默认是文本以utf-8进行的。不需要转换成utf-8就能显示这一部分就有问题了。
回复

使用道具 举报

677

主题

3460

回帖

5516

积分

论坛元老

积分
5516
 楼主| 发表于 2024-11-12 19:55:36 | 显示全部楼层
本帖最后由 hpdell 于 2024-11-12 20:38 编辑
浅末哈哈 发表于 2024-11-12 16:49
不太科学,https://lvgl.100ask.net/8.1/overview/font.html查看一下这一部分,可能是有些conf没配置好, ...

我 目前也没有发现 有哪里有配置不对的地方,  哎, 就这样凑合着用吧, 虽说有警告出现, 但是 字符显示都是没有问题的

看看以后有没有什么好的方法可以解决了呀
回复

使用道具 举报

5

主题

144

回帖

159

积分

初级会员

积分
159
发表于 2024-11-13 08:37:04 | 显示全部楼层
hpdell 发表于 2024-11-12 19:55
我 目前也没有发现 有哪里有配置不对的地方,  哎, 就这样凑合着用吧, 虽说有警告出现, 但是 字符显示都是 ...

有可能是文件格式问题,看看是不是有些文件格式不是utf8
回复

使用道具 举报

677

主题

3460

回帖

5516

积分

论坛元老

积分
5516
 楼主| 发表于 2024-11-13 10:07:20 | 显示全部楼层
浅末哈哈 发表于 2024-11-12 16:49
不太科学,https://lvgl.100ask.net/8.1/overview/font.html查看一下这一部分,可能是有些conf没配置好, ...





折腾了好久终于摆平了, 在 界面初始化时 全部替换为自己的 字库(不使用 gui guider 产生代码时的字库),

之前是 进入界面时使用的是 gui guider 产生代码时自带的字库,后来在进入某界面时需要显示中文时进行初始化一次设置为自己的中文字库,貌似这样就造成了警告

解决方法是在 需要显示的地方重新设置为自己的字库也可以, 为了一劳永逸还是在界面创建时就全部替换为自己的字库可以完美解决了

非常感谢感谢各位大佬了啊
回复

使用道具 举报

677

主题

3460

回帖

5516

积分

论坛元老

积分
5516
 楼主| 发表于 2024-11-13 10:09:21 | 显示全部楼层
无关风月 发表于 2024-11-13 08:37
有可能是文件格式问题,看看是不是有些文件格式不是utf8





不是格式的问题,因为我使用好多个 自负转换工具都试过了,包括 gui guider 产生的字库, 目前感觉还是使用 gui guider 产生的字库比较好,因为使用 gui guider 产生的字库搞定是自己设定的值,

其他的工具产生的字库字符高度 不好控制

现在这个问题已经解决了,如下:


折腾了好久终于摆平了, 在 界面初始化时 全部替换为自己的 字库(不使用 gui guider 产生代码时的字库),

之前是 进入界面时使用的是 gui guider 产生代码时自带的字库,后来在进入某界面时需要显示中文时进行初始化一次设置为自己的中文字库,貌似这样就造成了警告

解决方法是在 需要显示的地方重新设置为自己的字库也可以, 为了一劳永逸还是在界面创建时就全部替换为自己的字库可以完美解决了

非常感谢感谢各位大佬了啊




回复

使用道具 举报

2

主题

32

回帖

38

积分

新手上路

积分
38
发表于 2024-11-13 11:00:11 | 显示全部楼层
hpdell 发表于 2024-11-13 10:07
折腾了好久终于摆平了, 在 界面初始化时 全部替换为自己的 字库(不使用 gui guider 产生代码时 ...

[C] 纯文本查看 复制代码
 
 lv_obj_t *title = lv_label_create(cont);

        lv_label_set_text(title, Gp[i].titleStr);
        lv_label_set_long_mode(title, LV_LABEL_LONG_WRAP);

        // pos = 90, first add = (0, 100)
        lv_obj_set_pos(title, 0, (100 + (LABEL_POS * i)));
        lv_obj_set_size(title, LABEL_WIDTH, LABEL_HEIGHT);

        // Write style for screen_info_label_5, Part: LV_PART_MAIN, State: LV_STATE_DEFAULT.
        lv_obj_set_style_border_width(title, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
        lv_obj_set_style_radius(title, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
        lv_obj_set_style_text_color(title, lv_color_hex(0x000000), LV_PART_MAIN | LV_STATE_DEFAULT);
        lv_obj_set_style_text_font(title, &lv_font_OPPOSans_Regular_24, LV_PART_MAIN | LV_STATE_DEFAULT);
        lv_obj_set_style_text_opa(title, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
        lv_obj_set_style_text_letter_space(title, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
        lv_obj_set_style_text_line_space(title, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
        lv_obj_set_style_text_align(title, LV_TEXT_ALIGN_CENTER, LV_PART_MAIN | LV_STATE_DEFAULT);
        lv_obj_set_style_bg_opa(title, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
        lv_obj_set_style_pad_top(title, 5, LV_PART_MAIN | LV_STATE_DEFAULT);
        lv_obj_set_style_pad_right(title, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
        lv_obj_set_style_pad_bottom(title, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
        lv_obj_set_style_pad_left(title, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
        lv_obj_set_style_shadow_width(title, 0, LV_PART_MAIN | LV_STATE_DEFAULT);

对于guiguider生成的代码部分,设置应该是最全的呀。就是在设置字体的位置,需要指定你需要的字体,如果没有进行指定的话,就会调用默认的值
[C] 纯文本查看 复制代码
lv_obj_set_style_text_font(title, &lv_font_OPPOSans_Regular_24, LV_PART_MAIN | LV_STATE_DEFAULT);

这里的lv_font_OPPOSans_Regular_24就是你需要修改成你的字库的地方。
那这样看起来是对label设置出错了的问题。
回复

使用道具 举报

677

主题

3460

回帖

5516

积分

论坛元老

积分
5516
 楼主| 发表于 2024-11-14 09:04:54 | 显示全部楼层
浅末哈哈 发表于 2024-11-13 11:00
[mw_shl_code=c,true]
lv_obj_t *title = lv_label_create(cont);


是的, 就是这句 lv_obj_set_style_text_font(title, &lv_font_OPPOSans_Regular_24, LV_PART_MAIN | LV_STATE_DEFAULT);

我使用了一个宏重新定义来替换成我自己的字库就好了,这样 guider 产生的代码基本上就不需要修改了
回复

使用道具 举报

677

主题

3460

回帖

5516

积分

论坛元老

积分
5516
 楼主| 发表于 2024-11-14 09:06:04 | 显示全部楼层
浅末哈哈 发表于 2024-11-13 11:00
[mw_shl_code=c,true]
lv_obj_t *title = lv_label_create(cont);

请教下,有没有什么办法可以给 label 控件增加滚动条啊 ?
回复

使用道具 举报

5

主题

80

回帖

95

积分

初级会员

积分
95
发表于 2024-11-14 09:15:13 | 显示全部楼层
hpdell 发表于 2024-11-14 09:06
请教下,有没有什么办法可以给 label 控件增加滚动条啊 ?

你用一个obj包住label,obj的宽度比label短就可以吧
回复

使用道具 举报

677

主题

3460

回帖

5516

积分

论坛元老

积分
5516
 楼主| 发表于 2024-11-14 11:13:13 | 显示全部楼层
lizhaoming 发表于 2024-11-14 09:15
你用一个obj包住label,obj的宽度比label短就可以吧





在 官方的 demo 里面找到了 示例

示例名称:  lv_example_scroll_4




回复

使用道具 举报

2

主题

32

回帖

38

积分

新手上路

积分
38
发表于 2024-11-14 11:39:00 | 显示全部楼层
hpdell 发表于 2024-11-14 09:06
请教下,有没有什么办法可以给 label 控件增加滚动条啊 ?

不太清除你的需求,label只适合显示少量文本,只能进行水平之类的操作https://blog.csdn.net/pq113_6/article/details/125673098
要是需要显示大量文本,和富文本,就可以进行滚动。
滚动条使用:
https://lvgl.100ask.net/8.4/overview/scroll.html

在guiguider里也可以增加滚动条,控制滚动条的情况是子类的大小超过了父类。
回复

使用道具 举报

677

主题

3460

回帖

5516

积分

论坛元老

积分
5516
 楼主| 发表于 2024-11-14 15:09:45 | 显示全部楼层
本帖最后由 hpdell 于 2024-11-14 15:18 编辑
浅末哈哈 发表于 2024-11-14 11:39
不太清除你的需求,label只适合显示少量文本,只能进行水平之类的操作https://blog.csdn.net/pq113_6/art ...

好的,我去看看 研究研究

我 使用 label 显示的文本应该是有点大的,

lvgl 有没有 哪个控件可以比较大的 文本呀 ?


lvgl  官方提供的例程效果:

label-scroll-1.png

label-scroll-2.png

回复

使用道具 举报

2

主题

32

回帖

38

积分

新手上路

积分
38
发表于 2024-11-14 16:12:00 | 显示全部楼层
hpdell 发表于 2024-11-14 15:09
好的,我去看看 研究研究

我 使用 label 显示的文本应该是有点大的,

用label吧,spangroup适合富文本。
回复

使用道具 举报

677

主题

3460

回帖

5516

积分

论坛元老

积分
5516
 楼主| 发表于 2024-11-14 16:34:06 | 显示全部楼层
浅末哈哈 发表于 2024-11-14 16:12
用label吧,spangroup适合富文本。

好的  
回复

使用道具 举报

677

主题

3460

回帖

5516

积分

论坛元老

积分
5516
 楼主| 发表于 2024-11-19 10:42:55 | 显示全部楼层
浅末哈哈 发表于 2024-11-14 16:12
用label吧,spangroup适合富文本。




你好, 捣鼓 label 显示文本,自动换行,滚动条 貌似都基本成功了,

现在有个问题请教下,就是 label 显示文本自动换行时的高度在哪里可以设置呀 ?
book_label_ccc.png

如上显示,自动换行后貌似 高度的间隔不够造成了显示重叠的现象

回复

使用道具 举报

2

主题

32

回帖

38

积分

新手上路

积分
38
发表于 2024-11-19 13:50:17 | 显示全部楼层
hpdell 发表于 2024-11-19 10:42
你好, 捣鼓 label 显示文本,自动换行,滚动条 貌似都基本成功了,

现在有个问题请教下,就是 ...

这个是在
[C] 纯文本查看 复制代码
                
lv_obj_set_style_text_letter_space(obj, 4, LV_PART_MAIN | LV_STATE_DEFAULT); //文本字体间距
lv_obj_set_style_text_line_space(obj, 12, LV_PART_MAIN | LV_STATE_DEFAULT); //文本行间距

回复

使用道具 举报

677

主题

3460

回帖

5516

积分

论坛元老

积分
5516
 楼主| 发表于 2024-11-19 15:49:16 | 显示全部楼层
浅末哈哈 发表于 2024-11-19 13:50
这个是在
[mw_shl_code=c,true]               
lv_obj_set_style_text_letter_space(obj, 4, LV_PART ...

大神牛啊, 果然如此
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-4-25 21:57 , Processed in 0.634260 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表