LVGL图标显示问题全排查:从问号到正常显示的实战记录
在嵌入式GUI开发中,LVGL(Light and Versatile Graphics Library)是非常流行的轻量级图形库,但新手在使用自定义图标时,很容易遇到“图标不显示”“显示问号”等问题。最近我帮一位开发者排查了LVGL图标显示异常的问题,从最初的“图标完全不显示”到“显示问号”,再到最终通过间接引用+显式类型转换解决,整个过程踩了不少嵌入式开发的“底层细节坑”。本文将完整复盘排查步骤和方法论,希望能帮到更多LVGL开发者。
一、背景:问题初现与基础环境
1. 开发场景
- LVGL版本:V8.2(注意:不同版本的颜色格式常量、结构体细节有差异)
- 需求:在40×40的圆形按钮上显示32×32的自定义设置图标
- 初始问题:
- 按钮背景(灰色)能正常显示,但图标完全不显示;
- 后来调整图像描述符后,图标变成“问号”(LVGL无法解析图像的典型表现);
- 直接引用
lv_img_dsc_t变量(&setting)能正常显示,但通过自定义AppIcon结构体间接引用(icon_setting.img_dsc)时失败。
2. 核心代码初始版本
// 自定义图标结构体(用于统一管理图标描述符和尺寸)
typedef struct {
const lv_img_dsc_t *img_dsc; // 图像描述符指针
uint16_t width; // 图标宽度
uint16_t height; // 图标高度
} AppIcon;
// 图像描述符定义(32×32,4位索引色)
const lv_img_dsc_t setting = {
.header.cf = LV_IMG_CF_INDEXED_4BIT,
.header.always_zero = 0,
.header.reserved = 0,
.header.w = 32,
.header.h = 32,
.data_size = 576, // 调色板(16×4) + 像素数据(32×32/2) = 64+512=576
.data = setting_map, // 像素数据数组
};
// 间接引用:初始化AppIcon实例
const AppIcon icon_setting = {
.img_dsc = &setting,
.width = 32,
.height = 32
};
// 创建设置按钮(初始版本:间接引用失败)
lv_obj_t *ui_create_settings_button(lv_obj_t *parent) {
lv_obj_t *settings_btn = lv_btn_create(parent);
lv_obj_set_size(settings_btn, 40, 40);
lv_obj_set_style_bg_color(settings_btn, lv_color_hex(0xCCCCCC), 0); // 背景正常显示

427

被折叠的 条评论
为什么被折叠?



