在有文件系统时若想加载非AWTK默认目录结构的图片资源,可以使用:file:// + 图片所在路径的形式来加载图片,并且可以使用C代码或者xml形式来加载。
1.1 C代码方式:
widget_t* image = widget_lookup(win, "image", TRUE);
image_set_image(image, "file:///media/sda1/AWTK.png");
1.2 XML方式:
<window name="home_page ">
<image name="image" x="0" y="0" w="50" h="50" draw_type="default" image="file:///media/sda1/AWTK.png"/>
window>
若是在没有文件系统的设备中加载外部图片,可以先读取图片文件数据,再将数据作为参数传给 assets_manager_add_data() 函数。该函数会将数据添加到AWTK资源管理器中,添加后就可以通过文件名的形式来显示图片了。
uint8_t read_buffer[512];
int sdcard_status = HAL_SD_ReadBlocks(&sd_handle, (uint8_t*) read_buffer, 0, 1, 0xffff);
if (sdcard_status == HAL_OK) {
assets_manager_add_data(assets_manager(),"AWTK",ASSET_TYPE_IMAGE,ASSET_TYPE_IMAGE_PNG, read_buffer, size);
image_set_image(image, "AWTK");
}
AWTK在加载一张图片时,会先将图片缓存到assets_manager资源管理器当中,接着再解码放到image_manager图片管理器,最后显示的图片来自图片管理器解码好的图片,因此对于上面的需求就要手动卸载与重新加载图片缓存。下图为ZTP800示教器上的示例程序重新加载图片前后效果图:
图2 示例程序的初始图
图2 示例程序的初始图
static ret_t on_unload_button_click(void* ctx, event_t* e) { // 点击卸载图片按钮卸载图片缓存
bitmap_t bitmap = {0};
widget_t* win = WIDGET(ctx);
widget_t* image = widget_lookup(win, "image", TRUE);
// 卸载图片管理器缓存
image_manager_get_bitmap(image_manager(), IMAGE_NAME, &bitmap);
image_manager_unload_bitmap(image_manager(), &bitmap);
// 卸载资源管理器缓存
assets_manager_clear_cache_ex(assets_manager(), ASSET_TYPE_IMAGE, IMAGE_NAME);
widget_invalidate(image, NULL);
return RET_OK;
}
static ret_t on_load_button_click(void* ctx, event_t* e) { // 点击加载图片按钮重新加载图片缓存
widget_t* win = WIDGET(ctx);
widget_t* image = widget_lookup(win, "image", TRUE);
// 将新的图片数据添加到资源管理器缓存中
asset_info_t* img = assets_manager_load_file(assets_manager(), ASSET_TYPE_IMAGE, IMAGE_NAME);
assets_manager_add(assets_manager(), img);
image_set_image(image, IMAGE_NAME);
widget_invalidate(image, NULL);
return RET_OK;
}
上面代码调用assets_manager_load_file与assets_manager_add重新加载了一次图片数据到AWTK资源管理器的缓存,此时加载的数据是新的图片数据。
后续在调用image_set_image以及widget_invalidate刷新图片控件时会自动将位于资源管理器的缓存解码并放到图片管理器当中,最后显示新的图片数据。
更多往期文章,请点击“ 阅读原文 ”。