HarmonyOS 鸿蒙Next ArkTS语言教程入门学习第44天,刷新本地图片和网络图片。

发布于 1周前 作者 yibo5220 来自 鸿蒙OS

HarmonyOS 鸿蒙Next ArkTS语言教程入门学习第44天,刷新本地图片和网络图片。 1、刷新本地图片和网络图片

在卡片上通常需要展示本地图片或从网络上下载的图片,获取本地图片和网络图片需要通过FormExtensionAbility来实现,

如下示例代码介绍了如何在卡片上显示本地图片和网络图片。

  1. 下载网络图片需要使用到网络能力,需要申请ohos.permission.INTERNET权限,配置方式请参见配置文件权限声明。

  2. 在EntryFormAbility中的onAddForm生命周期回调中实现本地文件的刷新。

import formBindingData from '@ohos.app.form.formBindingData';
import formProvider from '@ohos.app.form.formProvider';
import { FormExtensionAbility } from '@ohos.app.form.FormExtensionAbility';
import request from '@ohos.request';
import fs from '@ohos.file.fs';

export default class EntryFormAbility extends FormExtensionAbility {
  ...
  // 在添加卡片时,打开一个本地图片并将图片内容传递给卡片页面显示
  onAddForm(want) {
    // 假设在当前卡片应用的tmp目录下有一个本地图片:head.PNG
    let tempDir = this.context.getApplicationContext().tempDir;
    // 打开本地图片并获取其打开后的fd
    let file;
    try {
      file = fs.openSync(tempDir + '/' + 'head.PNG');
    } catch (e) {
      console.error(`openSync failed: ${JSON.stringify(e)}`);
    }
    let formData = {
      'text': 'Image: Bear',
      'imgName': 'imgBear',
      'formImages': {
        'imgBear': file.fd
      },
      'loaded': true
    }
    // 将fd封装在formData中并返回至卡片页面
    return formBindingData.createFormBindingData(formData);
  }

  ...
}
  1. 在EntryFormAbility中的onFormEvent生命周期回调中实现网络文件的刷新。
import formBindingData from '@ohos.app.form.formBindingData';
import formProvider from '@ohos.app.form.formProvider';
import { FormExtensionAbility } from '@ohos.app.form.FormExtensionAbility';
import request from '@ohos.request';
import fs from '@ohos.file.fs';

export default class EntryFormAbility extends FormExtensionAbility {
  // 在卡片页面触发message事件时,下载一个网络图片,并将网络图片内容传递给卡片页面显示
  onFormEvent(formId, message) {
    let formInfo = formBindingData.createFormBindingData({
      'text': '刷新中...'
    })
    formProvider.updateForm(formId, formInfo)
    // 注意:FormExtensionAbility在触发生命周期回调时被拉起,仅能在后台存在5秒
    // 建议下载能快速下载完成的小文件,如在5秒内未下载完成,则此次网络图片无法刷新至卡片页面上
    let netFile = 'https://xxxx/xxxx.png'; // 需要在此处使用真实的网络图片下载链接
    let tempDir = this.context.getApplicationContext().tempDir;
    let tmpFile = tempDir + '/file' + Date.now();
    request.downloadFile(this.context, {
      url: netFile, filePath: tmpFile
    }).then((task) => {
      task.on('complete', function callback() {
        console.info('ArkTSCard download complete:' + tmpFile);
        let file;
        try {
          file = fs.openSync(tmpFile);
        } catch (e) {
          console.error(`openSync failed: ${JSON.stringify(e)}`);
        }
        let formData = {
          'text': 'Image: Https',
          'imgName': 'imgHttps',
          'formImages': {
            'imgHttps': file.fd
          },
          'loaded': true
        }
        let formInfo = formBindingData.createFormBindingData(formData)
        formProvider.updateForm(formId, formInfo).then((data) => {
          console.info('FormAbility updateForm success.' + JSON.stringify(data));
        }).catch((error) => {
          console.error('FormAbility updateForm failed: ' + JSON.stringify(error));
        })
      })
      task.on('fail', function callBack(err) {
        console.info('ArkTSCard download task failed. Cause:' + err);
        let formInfo = formBindingData.createFormBindingData({
          'text': '刷新失败'
        })
        formProvider.updateForm(formId, formInfo)
      });
    }).catch((err) => {
      console.error('Failed to request the download. Cause: ' + JSON.stringify(err));
    });
  }

  ...
};
  1. 在卡片页面通过Image组件展示EntryFormAbility传递过来的卡片内容。
let storage = new LocalStorage();

@Entry(storage)
@Component
struct WidgetCard {
  @LocalStorageProp('text') text: string = '加载中...';
  @LocalStorageProp('loaded') loaded: boolean = false;
  @LocalStorageProp('imgName') imgName: string = 'name';

  build() {
    Column() {
      Text(this.text)
        .fontSize('12vp')
        .textAlign(TextAlign.Center)
        .width('100%')
        .height('15%')

      Row() {
        if (this.loaded) {
          Image('memory://' + this.imgName)
            .width('50%')
            .height('50%')
            .margin('5%')
        } else {
          Image('common/start.PNG')
            .width('50%')
            .height('50%')
            .margin('5%')
        }
      }.alignItems(VerticalAlign.Center)
      .justifyContent(FlexAlign.Center)

      Button('刷新')
        .height('15%')
        .onClick(() => {
          postCardAction(this, {
            'action': 'message',
            'params': {
              'info': 'refreshImage'
            }
          });
        })
    }
    .width('100%').height('100%')
    .alignItems(HorizontalAlign.Center)
    .padding('5%')
  }
}

更多关于HarmonyOS 鸿蒙Next ArkTS语言教程入门学习第44天,刷新本地图片和网络图片。的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

在HarmonyOS鸿蒙Next中,使用ArkTS语言刷新本地图片和网络图片可以通过以下方式实现。

  1. 刷新本地图片:

    • 使用Image组件加载本地图片,路径为resource://开头。
    • 通过[@State](/user/State)装饰器管理图片路径,修改路径即可刷新图片。
    [@State](/user/State) imagePath: string = 'resource://rawfile/local_image.png';
    
    build() {
      Image(this.imagePath)
        .onClick(() => {
          this.imagePath = 'resource://rawfile/new_local_image.png';
        })
    }
  2. 刷新网络图片:

    • 使用Image组件加载网络图片,路径为http://https://开头。
    • 通过[@State](/user/State)装饰器管理图片URL,修改URL即可刷新图片。
    [@State](/user/State) imageUrl: string = 'https://example.com/image.png';
    
    build() {
      Image(this.imageUrl)
        .onClick(() => {
          this.imageUrl = 'https://example.com/new_image.png';
        })
    }
  3. 注意事项:

    • 确保网络图片URL有效,且设备网络连接正常。
    • 本地图片路径需正确,图片文件需存在于resources/rawfile目录下。

通过上述方法,可以在ArkTS中实现本地和网络图片的刷新。

更多关于HarmonyOS 鸿蒙Next ArkTS语言教程入门学习第44天,刷新本地图片和网络图片。的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next的ArkTS语言中,刷新本地图片和网络图片可以通过以下步骤实现:

  1. 本地图片刷新:使用Image组件加载本地图片,通过更新src属性来刷新图片。例如:

    [@State](/user/State) imageSrc: Resource = $r('app.media.local_image');
    // 刷新图片
    this.imageSrc = $r('app.media.new_local_image');
  2. 网络图片刷新:使用Image组件加载网络图片,通过更新src属性并添加时间戳或随机参数来强制刷新。例如:

    [@State](/user/State) imageUrl: string = 'https://example.com/image.jpg';
    // 刷新图片
    this.imageUrl = `https://example.com/image.jpg?timestamp=${new Date().getTime()}`;

通过以上方法,可以轻松实现本地和网络图片的刷新。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!