HarmonyOS NEXT实战:网络图片加载和失败占位图

举报
鸿蒙开发工程师 发表于 2025/06/25 12:17:11 2025/06/25
【摘要】 ##HarmonyOS Next实战##HarmonyOS应用开发##教育##目标:网络图片加载时,显示加载图,加载完毕后显示网络图片,加载失败则显示加载失败的占位图。前提:需要申请权限ohos.permission.INTERNET。实现思路:通过Image显示图片。通过Image的alt设置加载图。通过Image的onError事件获取加载失败的状态。根据加载状态显示对应的占位图。接口说...

##HarmonyOS Next实战##HarmonyOS应用开发##教育##

目标:网络图片加载时,显示加载图,加载完毕后显示网络图片,加载失败则显示加载失败的占位图。

前提:需要申请权限ohos.permission.INTERNET。

实现思路:

  1. 通过Image显示图片。
  2. 通过Image的alt设置加载图。
  3. 通过Image的onError事件获取加载失败的状态。
  4. 根据加载状态显示对应的占位图。

接口说明

alt(value: string | Resource | PixelMap)

设置图片加载时显示的占位图。当组件的参数类型为AnimatedDrawableDescriptor时设置该属性不生效。
说明:加载时显示的占位图,支持本地图片(png、jpg、bmp、svg、gif和heif类型),支持PixelMap类型图片,不支持网络图片。(默认值:null)

onComplete事件

onComplete(callback: (event?: { width: number, height: number, componentWidth: number, componentHeight: number, loadingStatus: number,contentWidth: number, contentHeight: number, contentOffsetX: number, contentOffsetY: number }) => void)

图片数据加载成功和解码成功时均触发该回调,返回成功加载的图片尺寸。
当组件的参数类型为AnimatedDrawableDescriptor时该事件不触发。

onError事件

onError(callback: ImageErrorCallback)

图片加载异常时触发该回调。
当组件的参数类型为AnimatedDrawableDescriptor时该事件不触发。
说明:图片加载异常时触发的回调。建议开发者使用此回调,可快速确认图片加载失败时的具体原因。

ImageErrorCallback:
图片加载异常时触发的回调。
当组件的参数类型为AnimatedDrawableDescriptor时该事件不触发。

onFinish事件

onFinish(event: () => void)

当加载的源文件为带动效的svg格式图片时,svg动效播放完成时会触发这个回调。如果动效为无限循环动效,则不会触发这个回调。
仅支持svg格式的图片。当组件的参数类型为AnimatedDrawableDescriptor时该事件不触发。

aspectRatio接口

aspectRatio(value: number)

指定当前组件的宽高比,aspectRatio=width/height。
仅设置width、aspectRatio时,height=width/aspectRatio。
仅设置height、aspectRatio时,width=height*aspectRatio。
同时设置width、height和aspectRatio时,height不生效,height=width/aspectRatio。
设置aspectRatio属性后,组件宽高会受父组件内容区大小限制。

实战代码:

@Entry
@Component
struct ImagePlaceholderPage {
  imageSrc: string = 'https://c-ssl.dtstatic.com/uploads/blog/202311/27/0GSZv1oh0ePwpE.thumb.400_0.jpeg'
  @State loadingSuccess: boolean = true

  build() {
    Column({ space: 10 }) {
      Text('图片占位符')
      this.buildImage(this.imageSrc)
    }
    .width('100%')
    .height('100%')
    .padding(20)
  }

  @Builder
  buildImage(src: string) {
    Row() {
      if (this.loadingSuccess) {
        Image(src)
          .width('100%')// .alt($r('app.media.rays'))
          .onComplete(() => {
            //图片数据加载成功和解码成功时均触发该回调
            this.loadingSuccess = true
          })
          .onError(() => {
            //图片加载异常时触发该回调。
            this.loadingSuccess = false
          })
          .onFinish(() => {
            //当加载的源文件为带动效的svg格式图片时,svg动效播放完成时会触发这个回调。如果动效为无限循环动效,则不会触发这个回调。
          })
      } else {
        //图片加载失败的占位图
        Column({ space: 10 }) {
          SymbolGlyph($r('sys.symbol.exclamationmark_circle'))
            .fontSize(30)
            .renderingStrategy(SymbolRenderingStrategy.SINGLE)
            .fontColor([Color.Gray])
          Text('图片加载失败')
            .fontColor(Color.Gray)
        }
      }
    }
    .width('100%')
    .justifyContent(FlexAlign.Center)
    .borderRadius(6)
    .backgroundColor('#EEEEEE')
    .aspectRatio(1)
    .clip(true)
  }
}
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。