AI语音智能体开发日记(十)LVGL 图标字体实战——从 FontAwesome 到屏幕显示

   相关链接:
AI语音智能体开发日记(一)如何为“小智”服务器启用并调试 License 功能-CSDN博客

AI语音智能体开发日记(二)解决 Wi-Fi 配网小程序的兼容性问题-CSDN博客

AI语音智能体开发日记(三)解决小程序配网中的蓝牙命名与MAC地址获取问题-CSDN博客

AI语音智能体开发日记(四)在FreeRTOS中构建线程安全的UART2通信模块-CSDN博客

AI语音智能体开发日记(五)为智能设备注入“灵魂”——详解MCP工具的注册与使用-CSDN博客

AI语音智能体开发日记(六)为智能体注入旋律——七牛云音乐服务的接入与避坑指南-CSDN博客

AI语音智能体开发日记(七)搞定功放控制——详解GX8006平台Mute电平配置-CSDN博客

AI语音智能体开发日记(八)LVGL 8.4.0 移植实战——从零构建嵌入式GUI-CSDN博客

AI语音智能体开发日记(九)LVGL 8.4.0 中文字体配置全攻略-CSDN博客

AI语音智能体开发日记(十)LVGL 图标字体实战——从 FontAwesome 到屏幕显示-CSDN博客

AI语音智能体开发日记(十一)为智能设备“声”临其境——详解音频资源自动化生成流程-CSDN博客

AI语音智能体开发日记(十二)GX8006 固件定制指南——从双唤醒词到 UART 音频传输-CSDN博客

AI语音智能体开发日记(十三)一次由寄存器溢出引发的串口波特率“玄学”问题排查-CSDN博客

推荐链接:

AI语音智能体架构解析(一)系统架构全景图-CSDN博客

AI语音智能体架构解析(二)大模型(AI 的大脑)-CSDN博客

AI语音智能体架构解析(三)智控台(指挥中心)-CSDN博客

AI语音智能体架构解析(四)AI 语音终端(执行器官)-CSDN博客

AI语音智能体架构解析(五)小程序/APP(遥控器)-CSDN博客

推荐链接:
AI 应用 图文 解说 (一) -- 百度智能云 实现 语音 聊天-CSDN博客
AI 应用 图文 解说 (二) -- 百度智能云 ASR LIM TTS 语音AI助手程序 -CSDN博客

开发手记:LVGL 图标字体实战——从 FontAwesome 到屏幕显示

在嵌入式GUI开发中,图标是提升界面美观度和信息传达效率的关键元素。相比于使用多张独立的图片,使用图标字体(Icon Font)具有体积小、易于缩放、颜色可变等显著优势。

今天这篇博客,我将详细记录在 LVGL 8.4.0 项目中,集成 FontAwesome 图标字体的完整流程。我们将以显示一个 WiFi 图标为例,解决从字体选择、转换到代码调用的所有问题。

第一步:选择合适的图标字体库

首先,我们需要选择一个免费且可商用的图标字体库。市面上有许多优秀的选择,例如:

图标库免费商用说明
FontAwesome Free✅ 完全免费包含 Solid/Regular/Brands 三种风格,足够日常使用
Material Icons✅ 完全免费Google 开源,Apache 2.0 协议
Remix Icon✅ 完全免费国内开源,可商用
Bootstrap Icons✅ 完全免费MIT 协议

本次实战,我们选择最流行的 FontAwesome Free

https://github.com/FortAwesome/Font-Awesome/releases/tag/6.5.2,fontawesome-free-6.5.2-web.zip

第二步:下载与转换字体文件

LVGL 无法直接使用 .ttf 格式的字体文件,我们需要将其转换为 C 语言数组。

  1. 下载字体文件
    前往 FontAwesome 的 GitHub Release 页面,下载 fontawesome-free-6.5.2-web.zip。解压后,我们需要的字体文件位于 webfonts 文件夹内,本次我们使用 fa-solid-900.ttf

  2. 在线转换字体
    使用 LVGL 官方提供的在线字体转换工具:https://lvgl.io/tools/fontconverter

    • Name: 给字体起个名字,例如 weather
    • Size: 设置字体大小,例如 16
    • Bpp: 设置为 4 bit-per-pixel,在清晰度和内存占用间取得平衡。
    • TTF/WOFF font: 上传我们刚刚找到的 fa-solid-900.ttf 文件。
    • Range: 这是最关键的一步。我们需要输入想要转换的图标的 Unicode 编码。例如,我们想显示一个 "x" 图标,其 Unicode 为 0x0078。因此,在这里填入 0x0078
    • 点击“Submit”按钮,下载生成好的 weather.c 文件。​可以用http://blog.luckly-mjw.cn/tool-show/iconfont-preview/index.html进行字体验证
第三步:将字体文件集成到工程
  1. 放置文件
    将生成的 weather.c 文件复制到 LVGL 的字体目录下:project/ln_model_public/components/gui/lvgl-8.4.0/src/font/

  2. 理解生成的代码
    打开 weather.c 文件,我们可以看到图标数据被存储在 glyph_bitmap 数组中。

    1/* U+0078 "x" */
    20x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc,
    3// ... (图标位图数据)

    这段注释 /* U+0078 "x" */ 告诉我们,这个位图数据对应的就是 Unicode 0x0078,也就是字符 "x"。

第四步:在 LVGL 中注册并使用图标

文件就位后,我们需要在 LVGL 的配置文件中声明它,并编写代码来显示。

  1. 在 lv_conf.h 中声明字体
    打开 lv_conf.h 文件,找到 LV_FONT_CUSTOM_DECLARE 宏,添加我们的字体声明:

    1#define LV_FONT_CUSTOM_DECLARE \
    2    LV_FONT_DECLARE(alFont12) \
    3    LV_FONT_DECLARE(alFont18) \
    4    LV_FONT_DECLARE(alFont24) \
    5    LV_FONT_DECLARE(weather)  // 添加这一行
  2. 编写代码显示图标
    在我们的应用代码 usr_app.c 中,创建一个标签(Label)来显示图标。

    #define ICON_WIFI    "\x78"  // WiFi图标
    
    
    void create_ui(void)
    {
        // WiFi 图标 - 白色
        lv_obj_t *wifi = lv_label_create(lv_scr_act());
        lv_obj_set_style_text_font(wifi, &weather, 0);
        lv_label_set_text(wifi, ICON_WIFI);
        lv_obj_set_style_text_color(wifi, lv_color_hex(0xFFFFFF), 0);
        lv_obj_set_pos(wifi, 10, 5);
    
    
    }
    
    lv_ui guider_ui;
    
    
    static void usr_app_task_entry(void *params)
    {
        
        //初始化LVGL
        lv_init();
        
        //初始化显示驱动
        lv_port_disp_init();
    
        
      
    
    
        // 创建新屏幕并加载
        lv_obj_t *screen = lv_obj_create(NULL);
        lv_scr_load(screen);
    
        // 设置屏幕背景颜色为黑色,且不透明
        lv_obj_set_style_bg_color(screen, lv_color_hex(0x000000), LV_PART_MAIN);
        lv_obj_set_style_bg_opa(screen, LV_OPA_COVER, LV_PART_MAIN);
    
        create_ui();
    
    
        /*
        // 1. 左上角显示 "2026"
        lv_obj_t *label_year = lv_label_create(screen);
        lv_label_set_text(label_year, "2026");
        lv_obj_set_style_text_font(label_year, &alFont12, LV_PART_MAIN | LV_STATE_DEFAULT);
        lv_obj_set_style_text_color(label_year, lv_color_hex(0xFFFFFF), 0);
        lv_obj_align(label_year, LV_ALIGN_TOP_LEFT, 10, 10);  // 距离左边10px,顶部10px
    
        
        // 2. 左上第二排显示 "重庆"
        lv_obj_t *label_city = lv_label_create(screen);
        lv_label_set_text(label_city, "17:17");
        lv_obj_set_style_text_font(label_city, &alFont24, LV_PART_MAIN | LV_STATE_DEFAULT);
        lv_obj_set_style_text_color(label_city, lv_color_hex(0xFFFFFF), 0);
        lv_obj_align(label_city, LV_ALIGN_TOP_LEFT, 10, 40);  // 距离左边10px,顶部40px
        
    
    
        // 3. 左下角显示 "7月6日"
        lv_obj_t *label_date = lv_label_create(screen);
        lv_label_set_text(label_date, "7月6日");
        lv_obj_set_style_text_font(label_date, &alFont12, LV_PART_MAIN | LV_STATE_DEFAULT);
        lv_obj_set_style_text_color(label_date, lv_color_hex(0xFFFFFF), 0);
        lv_obj_align(label_date, LV_ALIGN_BOTTOM_LEFT, 10, -10);  // 距离左边10px,底部10px
    
        // 4. 右下角显示 "星期一"
        lv_obj_t *label_week = lv_label_create(screen);
        lv_label_set_text(label_week, "星期一");
        lv_obj_set_style_text_font(label_week, &alFont12, LV_PART_MAIN | LV_STATE_DEFAULT);
        lv_obj_set_style_text_color(label_week, lv_color_hex(0xFFFFFF), 0);
        lv_obj_align(label_week, LV_ALIGN_BOTTOM_RIGHT, -10, -10);  // 距离右边10px,底部10px
        */
    
        //setup_ui(&guider_ui);
        while(1) {
    
            lv_tick_inc(100);
            lv_task_handler();
            OS_MsDelay(100);
        }
    }

这里需要注意

#define ICON_WIFI    "\x78"  

这个定义来自

库中包含的字的UNICODE编码为:0X78,将0XE911转换为UTF8格式为:"\x78"

显示的是

总结

通过以上四个步骤,我们成功地在 LVGL 项目中集成并显示了一个 FontAwesome 图标。核心流程可以概括为:

  1. 选库下载:选择 FontAwesome 等免费图标库并下载 .ttf 文件。
  2. 在线转换:使用 LVGL 工具将 .ttf 转为 .c 文件,关键是填入正确的 Unicode Range
  3. 工程集成:将 .c 文件放入工程,并在 lv_conf.h 中声明。
  4. 代码调用:创建 lv_label,设置其字体为自定义字体,文本为对应的 Unicode 字符(如 "\x78")。

这种方法极大地丰富了嵌入式界面的表现力,是 GUI 开发中非常实用的技巧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值