mirror of
https://gitee.com/zlgopen/awtk.git
synced 2024-11-30 02:58:26 +08:00
184 lines
7.3 KiB
Markdown
184 lines
7.3 KiB
Markdown
|
# 如何加载外部图片和字库
|
|||
|
|
|||
|
在嵌入式平台下,有些开发板的 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
|
|||
|
<window name="home_page ">
|
|||
|
<image name="image1" x="0" y="0" w="50" h="50" draw_type="default" image="file://E:/designer.png"/>
|
|||
|
<image name="image" x="0" y="60" w="50" h="50" draw_type="default" image="file://my-res/awtk.png"/>
|
|||
|
</window>
|
|||
|
```
|
|||
|
|
|||
|
(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
|
|||
|
<window name="home_page ">
|
|||
|
<image name="image" x="0" y="60" w="50" h="50" draw_type="default" image="awtk"/>
|
|||
|
</window>
|
|||
|
```
|
|||
|
|
|||
|
### 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");
|
|||
|
}
|
|||
|
}
|
|||
|
```
|