AWTK是基于C語言開發的跨平臺GUI框架。《AWTK使用經驗》系列文章將介紹開發AWTK過程中一些常見問題與解決方案,例如:如何加載外部資源?如何設計自定義進度條?這些都會在系列文章進行解答。
加載指定路徑的圖片資源
AWTK默認加載資源方式有兩種,一種是將資源打包到程序中放入Flash,另一種是放在res資源目錄中。假設現在需要實現一個圖片瀏覽器并移植到 ZTP800示教器 設備上,該圖片瀏覽器需要加載U盤圖片,此時就要用到AWTK加載外部資源的功能來實現該需求。下面將分為有文件系統和無文件系統兩種情況來介紹此功能。圖1ZTP800示教器加載U盤圖片效果
1. 有文件系統
在有文件系統時若想加載非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方式:
2. 無文件系統
若是在沒有文件系統的設備中加載外部圖片,可以先讀取圖片文件數據,再將數據作為參數傳給 assets_manager_add_data()函數。該函數會將數據添加到AWTK資源管理器中,添加后就可以通過文件名的形式來顯示圖片了。
下面是一段STM32平臺加載SD卡圖片的示例代碼:
uint8_tread_buffer[512];intsdcard_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");}
釋放圖片資源并重新加載
假設目前實現了圖片瀏覽器并移植到了ZTP800示教器上,但是需要圖片瀏覽器加載的圖片名稱固定不變,而本地圖片數據會經常發生改變,這時候就需要在AWTK重新加載并更新圖片到畫面中。
AWTK在加載一張圖片時,會先將圖片緩存到assets_manager資源管理器當中,接著再解碼放到image_manager圖片管理器,最后顯示的圖片來自圖片管理器解碼好的圖片,因此對于上面的需求就要手動卸載與重新加載圖片緩存。下圖為ZTP800示教器上的示例程序重新加載圖片前后效果圖:
圖2示例程序的初始圖
圖2示例程序的初始圖
1. 卸載圖片緩存
假設在示例程序中已經加載并顯示了一張圖片,并且此時本地圖片文件數據發生了改變,可以按照以下步驟卸載圖片管理器和資源管理器上的圖片緩存。
#defineIMAGE_NAME"/media/sda1/AWTK.png"http://圖片名默認為assets_manager_load_file加載的路徑
staticret_ton_unload_button_click(void*ctx,event_t*e){//點擊卸載圖片按鈕卸載圖片緩存 bitmap_tbitmap={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);
returnRET_OK;}
上面代碼中image_manager_unload_bitmap是用于卸載圖片在圖片管理器的緩存卸載緩存成功后會輸出“unload image xxx”的debug信息;assets_manager_clear_cache_ex是用于卸載資源管理器的該圖片緩存。
2. 重新加載圖片緩存
卸載圖片緩存后,可以通過以下步驟再次加載圖片到資源管理器中:
staticret_ton_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);
returnRET_OK;}
上面代碼調用assets_manager_load_file與assets_manager_add重新加載了一次圖片數據到AWTK資源管理器的緩存,此時加載的數據是新的圖片數據。
后續在調用image_set_image以及widget_invalidate刷新圖片控件時會自動將位于資源管理器的緩存解碼并放到圖片管理器當中,最后顯示新的圖片數據。
-
GUI
+關注
關注
3文章
670瀏覽量
40454 -
示教器
+關注
關注
2文章
30瀏覽量
3876 -
awtk
+關注
關注
0文章
48瀏覽量
323
發布評論請先 登錄
相關推薦
【AWTK使用經驗】如何更換AWTK SDK與渲染模式

AWTK主要特色
基于openharmony適配移植的圖片加載器
【AWTK使用經驗】如何在AWTK顯示阿拉伯文本

【AWTK使用經驗】如何使用系統輸入法與開啟最大化窗口功能

評論