# 如何加载外部图片和字库 在嵌入式平台下,有些开发板的 Flash 空间比较紧张,运行 AWTK 应用程序的时候,可能会出现 Flash 不够用的情况。此时可以将占用空间比较大的图片和字体资源,放到其他存储介质上(如:SD卡)。 在 AWTK 中,存放图片或者字体都有默认的目录结构,如:图片存放在 default/images/xx 目录下,字体存放在 default/fonts 目录下。如果需要加载其他目录的图片或者字体,AWTK 也提供了相应的方法,下面介绍如何在有文件系统和无文件系统时,加载外部图片和字体。 ## 1 有文件系统 有文件系统时,如果需要加载非 AWTK 默认目录结构中的图片或字体,可采用"file:// + 图片或字体所在路径"的形式,具体内容请看下文。 ### 1.1 加载外部图片 例如,要在 home_page 页面显示 E:/designer.png 和 awtk.png(目录结构如下)两张图片。 ```bash Demo |-- design/ |-- res/ |-- my-res/awtk.png ``` 有下面两种实现方式: (1)XML文件方式,修改XML文件内容如下: ```xml ``` (2)C代码方式,在C代码中可通过调用 image_set_image() 函数实现,代码如下: ```c widget_t* image = widget_lookup(win, "image1", TRUE); image_set_image(image, "file://my-res/awtk.png"); ``` ### 1.2 加载外部字体 要实现加载外部字体 E:/default.ttf,步骤如下: 步骤一:修改 res/assets/__assets_default.inc 资源文件,将: ```c assets_manager_preload(am, ASSET_TYPE_FONT, "default"); ``` 修改为: ```c assets_manager_preload(am, ASSET_TYPE_FONT, "file://E:/default.ttf"); ``` 步骤二:调用 system_info_set_default_font 函数设置缺省字体,代码如下: ```c system_info_set_default_font(system_info(), "file://E:/default.ttf"); ``` ## 2 无文件系统 在无文件系统中,如果需要加载非 AWTK 默认目录结构中的图片或字体,可以将图片或字体数据作为参数传给 assets_manager_add_data() 函数,该函数将这些数据添加到 AWTK 资源管理器中,然后就可以通过文件名的方式使用图片或字体了。 ### 2.1 相关函数 assets_manager_add_data() 函数说明: - 函数原型: ```c /** * @method assets_manager_add_data * 向资源管理器中增加一个资源data。 * 备注:同一份资源多次调用会出现缓存叠加的问题,导致内存泄露 * @param {assets_manager_t*} am asset manager对象。 * @param {const char*} name 待增加的资源的名字。 * @param {uint16_t} type 待增加的资源的主类型枚举。 * @param {uint16_t} subtype 待增加的资源的子类型枚举。 * @param {uint8_t*} buff 待增加的资源的data数据。 * @param {uint32_t} size 待增加的资源的data数据长度。 * * @return {ret_t} 返回RET_OK表示成功,否则表示失败。 */ ret_t assets_manager_add_data(assets_manager_t* am, const char* name, uint16_t type, uint16_t subtype, uint8_t* buff, uint32_t size); ``` type参数资源主类型取值详见下表: | 资源主类型 | 说明 | | -------------------- | -------------- | | ASSET_TYPE_NONE | 无效资源 | | **ASSET_TYPE_FONT** | **字体资源** | | **ASSET_TYPE_IMAGE** | **图片资源** | | ASSET_TYPE_STYLE | 窗体样式资源 | | ASSET_TYPE_UI | UI数据资源 | | ASSET_TYPE_XML | XML数据资源 | | ASSET_TYPE_STRINGS | 字符串数据资源 | | ASSET_TYPE_SCRIPT | JS等脚本资源 | | ASSET_TYPE_DATA | 其它数据资源 | subtype 参数字体资源子类型详见下表: | 资源的主类型枚举 | 说明 | | -------------------- | -------- | | ASSET_TYPE_FONT_NONE | 无效字体 | | ASSET_TYPE_FONT_TTF | TTF字体 | | ASSET_TYPE_FONT_BMP | 位图字体 | subtype参数图片资源子类型详见下表: | 图片资源子类型 | 说明 | | ------------------------ | ----------------- | | ASSET_TYPE_IMAGE_NONE | 未知图片类型 | | ASSET_TYPE_IMAGE_RAW | Raw图片类型 | | **ASSET_TYPE_IMAGE_BMP** | **位图图片类型** | | **ASSET_TYPE_IMAGE_PNG** | **PNG图片类型** | | **ASSET_TYPE_IMAGE_JPG** | **JPG图片类型** | | ASSET_TYPE_IMAGE_BSVG | BSVG图片类型 | | ASSET_TYPE_IMAGE_GIF | GIF图片类型 | | ASSET_TYPE_IMAGE_WEBP | WEBP图片类型 | | ASSET_TYPE_IMAGE_LZ4 | LZ4压缩的图片类型 | | ASSET_TYPE_IMAGE_OTHER | 其它图片类型 | ### 2.2 加载外部图片 例如,要在 home_page 页面显示 E:/awtk.png 这张图片,实现步骤如下: (1)添加图片。调用函数 assets_manager_add_data() 向资源管理中添加图片资源,代码如下: > 注:由于此处是在 PC 上演示,所以调用了 file_read() 函数读取图片数据,在实际的嵌入式应用场景中,需要通过其他方式读取图片数据。 ```c uint32_t size = 0; uint8_t* data = (uint8_t*)file_read("E:/awtk.png", &size); assets_manager_add_data(assets_manager(), "awtk", ASSET_TYPE_IMAGE,ASSET_TYPE_IMAGE_PNG, data, size); ``` (2)使用图片。在上面的步骤(1)中,已经向 AWTK 资源管理器中添加好了 awtk.png 图片,在 XML 文件或者 C 代码中可以通过指定图片文件名的方式使用图片。 例如,要在 XML 文件中使用 awtk.png 这张图,代码如下: ```xml ``` ### 2.3 加载外部字体 例如,要将 E:/default_full.ttf 字体加载到应用程序中,代码如下,实现步骤如下: 步骤一:获取字体数据。(此处为了方便演示调用 file_read() 函数读取字体,也可以用其他方式读取字体)。 步骤二:调用函数 assets_manager_add_data() 函数向资源管理中添加字体资源。 步骤三:调用 font_manager_add_font() 函数向字体管理器中添加字体。 步骤四:使用字体。调用 system_info_set_default_font() 函数设置默认字体为 default_full,应用程序将使用该字体。 ```c #include "font_loader/font_loader_truetype.h" uint32_t size = 0; uint8_t* data = (uint8_t*)file_read("E:/default_full.ttf", &size); assets_manager_add_data(assets_manager(), "default_full", ASSET_TYPE_FONT, ASSET_TYPE_FONT_TTF,data, size); uint32_t i = 0; uint32_t nr = assets_manager()->assets.size; const asset_info_t** all = (const asset_info_t**)(assets_manager()->assets.elms); for (i = 0; i < nr; i++) { const asset_info_t* res = all[i]; if (res->subtype == ASSET_TYPE_FONT_TTF && tk_str_eq(res->name, "default_full")) { font_manager_add_font(font_manager(), font_truetype_create(res->name, res->data, res->size)); system_info_set_default_font(system_info(), "default_full"); } } ```