刷新本地圖片和網(wǎng)絡(luò)圖片

2024-01-25 12:22 更新

在卡片上通常需要展示本地圖片或從網(wǎng)絡(luò)上下載的圖片,獲取本地圖片和網(wǎng)絡(luò)圖片需要通過FormExtensionAbility來實(shí)現(xiàn),如下示例代碼介紹了如何在卡片上顯示本地圖片和網(wǎng)絡(luò)圖片。

  1. 下載網(wǎng)絡(luò)圖片需要使用到網(wǎng)絡(luò)能力,需要申請(qǐng)ohos.permission.INTERNET權(quán)限,配置方式請(qǐng)參見配置文件權(quán)限聲明
  2. 在EntryFormAbility中的onAddForm生命周期回調(diào)中實(shí)現(xiàn)本地文件的刷新。
    1. import formBindingData from '@ohos.app.form.formBindingData';
    2. import formProvider from '@ohos.app.form.formProvider';
    3. import FormExtensionAbility from '@ohos.app.form.FormExtensionAbility';
    4. import request from '@ohos.request';
    5. import fs from '@ohos.file.fs';
    6. export default class EntryFormAbility extends FormExtensionAbility {
    7. ...
    8. // 在添加卡片時(shí),打開一個(gè)本地圖片并將圖片內(nèi)容傳遞給卡片頁面顯示
    9. onAddForm(want) {
    10. // 假設(shè)在當(dāng)前卡片應(yīng)用的tmp目錄下有一個(gè)本地圖片:head.PNG
    11. let tempDir = this.context.getApplicationContext().tempDir;
    12. // 打開本地圖片并獲取其打開后的fd
    13. let file;
    14. try {
    15. file = fs.openSync(tempDir + '/' + 'head.PNG');
    16. } catch (e) {
    17. console.error(`openSync failed: ${JSON.stringify(e)}`);
    18. }
    19. let formData = {
    20. 'text': 'Image: Bear',
    21. 'imgName': 'imgBear',
    22. 'formImages': {
    23. 'imgBear': file.fd
    24. },
    25. 'loaded': true
    26. }
    27. // 將fd封裝在formData中并返回至卡片頁面
    28. return formBindingData.createFormBindingData(formData);
    29. }
    30. ...
    31. }
  3. 在EntryFormAbility中的onFormEvent生命周期回調(diào)中實(shí)現(xiàn)網(wǎng)絡(luò)文件的刷新。
    1. import formBindingData from '@ohos.app.form.formBindingData';
    2. import formProvider from '@ohos.app.form.formProvider';
    3. import FormExtensionAbility from '@ohos.app.form.FormExtensionAbility';
    4. import request from '@ohos.request';
    5. import fs from '@ohos.file.fs';
    6. export default class EntryFormAbility extends FormExtensionAbility {
    7. // 在卡片頁面觸發(fā)message事件時(shí),下載一個(gè)網(wǎng)絡(luò)圖片,并將網(wǎng)絡(luò)圖片內(nèi)容傳遞給卡片頁面顯示
    8. onFormEvent(formId, message) {
    9. let formInfo = formBindingData.createFormBindingData({
    10. 'text': '刷新中...'
    11. })
    12. formProvider.updateForm(formId, formInfo)
    13. // 注意:FormExtensionAbility在觸發(fā)生命周期回調(diào)時(shí)被拉起,僅能在后臺(tái)存在5秒
    14. // 建議下載能快速下載完成的小文件,如在5秒內(nèi)未下載完成,則此次網(wǎng)絡(luò)圖片無法刷新至卡片頁面上
    15. let netFile = 'https://xxxx/xxxx.png'; // 需要在此處使用真實(shí)的網(wǎng)絡(luò)圖片下載鏈接
    16. let tempDir = this.context.getApplicationContext().tempDir;
    17. let tmpFile = tempDir + '/file' + Date.now();
    18. request.downloadFile(this.context, {
    19. url: netFile, filePath: tmpFile
    20. }).then((task) => {
    21. task.on('complete', function callback() {
    22. console.info('ArkTSCard download complete:' + tmpFile);
    23. let file;
    24. try {
    25. file = fs.openSync(tmpFile);
    26. } catch (e) {
    27. console.error(`openSync failed: ${JSON.stringify(e)}`);
    28. }
    29. let formData = {
    30. 'text': 'Image: Https',
    31. 'imgName': 'imgHttps',
    32. 'formImages': {
    33. 'imgHttps': file.fd
    34. },
    35. 'loaded': true
    36. }
    37. let formInfo = formBindingData.createFormBindingData(formData)
    38. formProvider.updateForm(formId, formInfo).then((data) => {
    39. console.info('FormAbility updateForm success.' + JSON.stringify(data));
    40. }).catch((error) => {
    41. console.error('FormAbility updateForm failed: ' + JSON.stringify(error));
    42. })
    43. })
    44. task.on('fail', function callBack(err) {
    45. console.info('ArkTSCard download task failed. Cause:' + err);
    46. let formInfo = formBindingData.createFormBindingData({
    47. 'text': '刷新失敗'
    48. })
    49. formProvider.updateForm(formId, formInfo)
    50. });
    51. }).catch((err) => {
    52. console.error('Failed to request the download. Cause: ' + JSON.stringify(err));
    53. });
    54. }
    55. ...
    56. };
  4. 在卡片頁面通過Image組件展示EntryFormAbility傳遞過來的卡片內(nèi)容。
    1. let storage = new LocalStorage();
    2. @Entry(storage)
    3. @Component
    4. struct WidgetCard {
    5. @LocalStorageProp('text') text: string = '加載中...';
    6. @LocalStorageProp('loaded') loaded: boolean = false;
    7. @LocalStorageProp('imgName') imgName: string = 'name';
    8. build() {
    9. Column() {
    10. Text(this.text)
    11. .fontSize('12vp')
    12. .textAlign(TextAlign.Center)
    13. .width('100%')
    14. .height('15%')
    15. Row() {
    16. if (this.loaded) {
    17. Image('memory://' + this.imgName)
    18. .width('50%')
    19. .height('50%')
    20. .margin('5%')
    21. } else {
    22. Image('common/start.PNG')
    23. .width('50%')
    24. .height('50%')
    25. .margin('5%')
    26. }
    27. }.alignItems(VerticalAlign.Center)
    28. .justifyContent(FlexAlign.Center)
    29. Button('刷新')
    30. .height('15%')
    31. .onClick(() => {
    32. postCardAction(this, {
    33. 'action': 'message',
    34. 'params': {
    35. 'info': 'refreshImage'
    36. }
    37. });
    38. })
    39. }
    40. .width('100%').height('100%')
    41. .alignItems(HorizontalAlign.Center)
    42. .padding('5%')
    43. }
    44. }
說明
  • Image組件通過入?yún)?memory://fileName)中的memory://標(biāo)識(shí)來進(jìn)行遠(yuǎn)端內(nèi)存圖片顯示,其中fileName需要和EntryFormAbility傳遞對(duì)象('formImages': {key: fd})中的key相對(duì)應(yīng)。
  • Image組件通過傳入的參數(shù)是否有變化來決定是否刷新圖片,因此EntryFormAbility每次傳遞過來的imgName都需要不同,連續(xù)傳遞兩個(gè)相同的imgName時(shí),圖片不會(huì)刷新。
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)