anyuianyui
首页
快速开始
文档
下载
  • English
  • 简体中文
首页
快速开始
文档
下载
  • English
  • 简体中文
  • 安装

    • 安装
  • 核心概念

    • 介绍
    • 设计
    • 隐藏和锁定
    • 资源管理
  • 高阶组件

    • 状态按钮
    • 标签滑块
    • 数值滑块
    • 复选框组和单选框组
    • 状态栏
    • 导航栏
    • 抽屉
  • 高级功能

    • 使用外部图像文件作为源
    • GIF动画图像
    • 模板组件
    • 全局组件
    • 屏幕管理
    • 通信命令和事件
    • Lottie动画
  • 开发

    • 构建模式
    • 构建工具链配置
    • 代码移植
  • 技术支持

    • 常见问题

概述

图像可以作为变量嵌入到应用程序中。除此之外,它们还可以从外部存储中加载。这允许更大的灵活性,例如在不重新构建应用程序的情况下更新图像。

从v0.28.0开始,已实现外部图像文件支持。

配置

启用外部图像支持

  1. 导航到项目 → 项目配置...
  2. 启用使用外部图像文件
  3. 配置路径前缀
  4. 在lv_conf.h中定义解码器支持:
#define LV_USE_FS_STDIO 1 // 启用文件系统支持

#define LV_USE_PNG 1      // 启用PNG解码器
#define LV_USE_JPEG 1     // 启用JPEG解码器
#define LV_USE_BMP 1      // 启用BMP解码器

文件系统驱动程序实现

实现并注册文件系统驱动程序用于文件I/O操作。

为模拟器提供了参考实现,可以针对自定义实现进行调整:

/* LVGL的文件系统回调 */
static void *fs_open(lv_fs_drv_t *drv, const char *path, lv_fs_mode_t mode) {
  LV_UNUSED(drv);
  const char *flags = (mode == LV_FS_MODE_WR) ? "wb" : "rb";
  return fopen(path, flags);
}

static lv_fs_res_t fs_close(lv_fs_drv_t *drv, void *file) {
  LV_UNUSED(drv);
  fclose((FILE *)file);
  return LV_FS_RES_OK;
}

static lv_fs_res_t fs_read(lv_fs_drv_t *drv, void *file, void *buf,
                           uint32_t btr, uint32_t *br) {
  LV_UNUSED(drv);
  *br = fread(buf, 1, btr, (FILE *)file);
  return (*br > 0) ? LV_FS_RES_OK : LV_FS_RES_UNKNOWN;
}

static lv_fs_res_t fs_seek(lv_fs_drv_t *drv, void *file, uint32_t pos,
                           lv_fs_whence_t whence) {
  LV_UNUSED(drv);
  int origin = (whence == LV_FS_SEEK_SET)   ? SEEK_SET
               : (whence == LV_FS_SEEK_CUR) ? SEEK_CUR
                                            : SEEK_END;
  fseek((FILE *)file, pos, origin);
  return LV_FS_RES_OK;
}

static lv_fs_res_t fs_tell(lv_fs_drv_t *drv, void *file, uint32_t *pos) {
  LV_UNUSED(drv);
  *pos = ftell((FILE *)file);
  return LV_FS_RES_OK;
}

/* 注册文件系统 */
void register_fs() {
  static lv_fs_drv_t fs_drv;
  lv_fs_drv_init(&fs_drv);
  fs_drv.letter = 'S'; // 驱动器字母
  fs_drv.open_cb = fs_open;
  fs_drv.close_cb = fs_close;
  fs_drv.read_cb = fs_read;
  fs_drv.seek_cb = fs_seek;
  fs_drv.tell_cb = fs_tell;
  lv_fs_drv_register(&fs_drv);
}

通过在main()中调用register_fs()来注册文件系统:

int main() {
  ...
  register_fs();
  ...
}

通过在simulator文件夹中的lv_conf.h中定义USE_SIMULATOR来启用模拟:

#define USE_SIMULATOR

重要注意事项

相关信息

如果由于内存分配问题导致图像加载失败,请增加lv_conf.h中的LV_MEM_SIZE:

#  define LV_MEM_SIZE    (? * 1024U * 1024U)          /*[bytes]*/

注意

  • 所有图像必须位于目标设备上配置的路径前缀目录中
  • 图像组件尺寸必须与源图像尺寸匹配,因为原始图像将不进行缩放显示
Next
GIF动画图像