天天看點

OpenHarmony應用開發之ETS開發方式中的Image元件詳解

今天帶大家了解ETS開發方式中的Image元件

作者:堅果

公衆号:"大前端之旅"

OpenHarmony布道師,InfoQ簽約作者,部落格專家,華為雲享專家,阿裡雲專家部落客,51CTO部落格首席體驗官,開源項目GVA成員之一,專注于大前端技術的分享,包括Flutter,鴻蒙,小程式,安卓,VUE,JavaScript。

Image

圖檔元件,支援本地圖檔和網絡圖檔的渲染展示。

我們可以看一下他的接口都有哪些内容

(src: string | PixelMap | Resource): ImageAttribute;      

src:string|PixelMap 圖檔的URI,支援本地圖檔和網絡路徑,支援使用媒體PixelMap對象。

PixelMap:圖像像素類,用于讀取或寫入圖像資料以及擷取圖像資訊。在調用PixelMap的方法前,需要先通過createPixelMap建立一個PixelMap執行個體。這裡我隻說前面的一個參數。

引用App本地圖檔

這裡先示範如何通過接口引用App本地圖檔。圖檔格式支援“png/jpg/gif/svg”,圖檔檔案可以存放在media媒體目錄、或自己建立的“/common/images”目錄

我在項目裡放了兩張鴻蒙相關的圖檔,都是不同的,便于區分,接下來,我們就在項目裡使用他們。

@Entry
@Component
struct Index {
  @State message: string = 'Hello World'

  build() {
    Row() {
      Column() {
        Text("media目錄下的媒體資源").fontSize(32).fontColor(Color.Orange)
        Image($r("app.media.HarmonyOS")) // media目錄下的媒體資源
          .width("100%")
          .aspectRatio(1.5)
        Text("/common/images目錄下的圖檔").fontSize(32).fontColor(Color.Orange).textAlign(TextAlign.Center)
        Image("/common/images/HarmonyOS.jpg") // /common/images目錄下的圖檔
          .width("100%")
          .aspectRatio(1.5)
      }
      .width('100%')
    }
    .height('100%')
  }
}      

我們點選右側的預覽,來看一下

OpenHarmony應用開發之ETS開發方式中的Image元件詳解

以上就是本地圖檔的簡單使用,接下來我們對網絡圖檔進行同樣的操作,

引用網絡圖檔時記得添權重限

引用網絡圖檔時記得添權重限。 方法: 需要在config.json(FA模型)或者module.json5(Stage模型)對應的"abilities"中添加網絡使用權限ohos.permission.INTERNET。

"abilities": [
  {
    ...
    "permissions": ["ohos.permission.INTERNET"],
    ...
  }
]      
@Entry
@Component
struct Index {
  @State message: string = 'Hello World'

  build() {
    Row() {
      Column() {
        Text("media目錄下的媒體資源").fontSize(32).fontColor(Color.Orange)
        Image($r("app.media.HarmonyOS")) // media目錄下的媒體資源
          .width("100%")
          .aspectRatio(2.6)
        Text("/common/images目錄下的圖檔").fontSize(32).fontColor(Color.Orange).textAlign(TextAlign.Center)
        Image("/common/images/HarmonyOS.jpg") // /common/images目錄下的圖檔
          .width("100%")
          .aspectRatio(2.6)
        Text("網絡圖檔,jpg格式").fontSize(32).fontColor(Color.Orange).textAlign(TextAlign.Center)
        Image("https://img95.699pic.com/photo/50080/9588.jpg_wh300.jpg") // /common/images目錄下的圖檔
          .width("100%")
          .aspectRatio(2.6)
      }
      .width('100%')
    }
    .height('100%')
  }
}      
OpenHarmony應用開發之ETS開發方式中的Image元件詳解

接下來我們繼續接着對通用屬性之外的其他特有屬性來進行學習

首先來個預覽:

OpenHarmony應用開發之ETS開發方式中的Image元件詳解

接下來,我将對其中的屬性一一了解

.alt(string | PixelMap):

加載時顯示的占位圖。支援本地圖檔和網絡路徑,支援使用媒體PixelMap對象。

示例代碼:

@Entry
@Component
struct Index {
  @State message: string = 'Hello World'

  build() {
    Row() {
      Column() {
//        Text("media目錄下的媒體資源").fontSize(32).fontColor(Color.Orange)
//        Image($r("app.media.HarmonyOS")) // media目錄下的媒體資源
//          .width("100%")

//        Text("/common/images目錄下的圖檔").fontSize(32).fontColor(Color.Orange).textAlign(TextAlign.Center)
//        Image("/common/images/HarmonyOS.jpg") // /common/images目錄下的圖檔
//          .width("100%")
//          .aspectRatio(2.6)
//        Text("網絡圖檔,jpg格式").fontSize(32).fontColor(Color.Orange).textAlign(TextAlign.Center)
//        Image("https://img95.699pic.com/photo/50080/9588.jpg_wh300.jpg") // /common/images目錄下的圖檔
//          .width("100%")
//          .aspectRatio(2.6)
        Text("alt屬性").fontSize(32).fontColor(Color.Orange)
        Image($r("app.media.HarmonyOS")) // media目錄下的媒體資源
          .width("100%")
          .aspectRatio(2.6).alt("/common/images/HarmonyOS.jpg")
      }
      .width('100%')
    }
    .height('100%')
  }
}      

大家可以看到的就是/common/images/HarmonyOS.jpg為加載時顯示的占位圖

. objectFit (ImageFit): 設定圖檔的縮放類型。

/**
           * .objectFit(ImageFit) 設定圖檔的縮放類型,預設值Cover。
           *    ImageFit.Cover 保持寬高比進行縮小或者放大,使得圖檔兩邊都大于或等于顯示邊界。
           *    ImageFit.Contain 保持寬高比進行縮小或者放大,使得圖檔完全顯示在顯示邊界内。
           *    ImageFit.Fill 不保持寬高比進行放大縮小,使得圖檔填充滿顯示邊界。
           *    ImageFit.None 保持原有尺寸顯示。通常配合objectRepeat屬性一起使用。
           *    ImageFit.ScaleDown 保持寬高比顯示,圖檔縮小或者保持不變。
           */      
@Entry
@Component
struct Index {
  @State message: string = 'Hello World'

  build() {
    Row() {
      Column() {
//        Text("media目錄下的媒體資源").fontSize(32).fontColor(Color.Orange)
//        Image($r("app.media.HarmonyOS")) // media目錄下的媒體資源
//          .width("100%")

//        Text("/common/images目錄下的圖檔").fontSize(32).fontColor(Color.Orange).textAlign(TextAlign.Center)
//        Image("/common/images/HarmonyOS.jpg") // /common/images目錄下的圖檔
//          .width("100%")
//          .aspectRatio(2.6)
//        Text("網絡圖檔,jpg格式").fontSize(32).fontColor(Color.Orange).textAlign(TextAlign.Center)
//        Image("https://img95.699pic.com/photo/50080/9588.jpg_wh300.jpg") // /common/images目錄下的圖檔
//          .width("100%")
//          .aspectRatio(2.6)
//        Text("alt屬性").fontSize(32).fontColor(Color.Orange)
//        Image($r("app.media.HarmonyOS")) // media目錄下的媒體資源
//          .width("100%")
//          .aspectRatio(2.6).alt("/common/images/HarmonyOS.jpg").objectFit(ImageFit.Cover)
        Text("ImageFit.Cover").fontSize(32).fontColor(Color.Orange)
        Image($r("app.media.HarmonyOS")) // media目錄下的媒體資源
          .width("100%").aspectRatio(2.6)
         .objectFit(ImageFit.Cover)
        Text("ImageFit.Contain").fontSize(32).fontColor(Color.Orange)
        Image($r("app.media.HarmonyOS")) // media目錄下的媒體資源
          .width("100%").aspectRatio(2.6)
          .objectFit(ImageFit.Contain)
        Text("ImageFit.ScaleDown").fontSize(32).fontColor(Color.Orange)
        Image($r("app.media.HarmonyOS")) // media目錄下的媒體資源
          .width("100%").aspectRatio(2.6)
          .objectFit(ImageFit.ScaleDown)
        Text("ImageFit.Fill").fontSize(32).fontColor(Color.Orange)
        Image($r("app.media.HarmonyOS")) // media目錄下的媒體資源
          .width("100%").aspectRatio(2.6)
          .objectFit(ImageFit.Fill)
      }
      .width('100%')


    }
    .height('100%')
  }
}      
OpenHarmony應用開發之ETS開發方式中的Image元件詳解

. objectRepeat (ImageRepeat): 設定圖檔的重複樣式。

ImageRepeat枚舉說明

名稱 描述
X 隻在水準軸上重複繪制圖檔。
Y 隻在豎直軸上重複繪制圖檔。
XY 在兩個軸上重複繪制圖檔。
NoRepeat 不重複繪制圖檔。

. interpolation (ImageInterpolation): 設定圖檔的插值效果,僅針對圖檔放大插值。

對于一些較小的圖檔,或老照片,插值計算有助于提升畫質。下面是它的一些參數

ImageInterpolation

名稱 描述
None 不使用插值圖檔資料。
High 插值圖檔資料的使用率高,可能會影響圖檔渲染的速度。
Medium 插值圖檔資料的使用率中。
Low 插值圖檔資料的使用率低。

. renderMode (ImageRenderMode): 設定圖檔渲染的模式。 相當于PS中對圖檔做去色處理,可将彩色圖檔變為灰階圖檔。

ImageRenderMode

名稱 描述
Original 按照原圖進行渲染,包括顔色。
Template 将圖檔渲染為模闆圖檔,忽略圖檔的顔色資訊
@Entry
@Component
struct Index {
  @State message: string = 'Hello World'

  build() {
    Row() {
      Column() {
//        Text("media目錄下的媒體資源").fontSize(32).fontColor(Color.Orange)
//        Image($r("app.media.HarmonyOS")) // media目錄下的媒體資源
//          .width("100%")

//        Text("/common/images目錄下的圖檔").fontSize(32).fontColor(Color.Orange).textAlign(TextAlign.Center)
//        Image("/common/images/HarmonyOS.jpg") // /common/images目錄下的圖檔
//          .width("100%")
//          .aspectRatio(2.6)
//        Text("網絡圖檔,jpg格式").fontSize(32).fontColor(Color.Orange).textAlign(TextAlign.Center)
//        Image("https://img95.699pic.com/photo/50080/9588.jpg_wh300.jpg") // /common/images目錄下的圖檔
//          .width("100%")
//          .aspectRatio(2.6)
//        Text("alt屬性").fontSize(32).fontColor(Color.Orange)
//        Image($r("app.media.HarmonyOS")) // media目錄下的媒體資源
//          .width("100%")
//          .aspectRatio(2.6).alt("/common/images/HarmonyOS.jpg").objectFit(ImageFit.Cover)
//        Text("ImageFit.Cover").fontSize(32).fontColor(Color.Orange)
//        Image($r("app.media.HarmonyOS")) // media目錄下的媒體資源
//          .width("100%").aspectRatio(2.6)
//         .objectFit(ImageFit.Cover)
//        Text("ImageFit.Contain").fontSize(32).fontColor(Color.Orange)
//        Image($r("app.media.HarmonyOS")) // media目錄下的媒體資源
//          .width("100%").aspectRatio(2.6)
//          .objectFit(ImageFit.Contain)
//        Text("ImageFit.ScaleDown").fontSize(32).fontColor(Color.Orange)
//        Image($r("app.media.HarmonyOS")) // media目錄下的媒體資源
//          .width("100%").aspectRatio(2.6)
//          .objectFit(ImageFit.ScaleDown)
//        Text("ImageFit.Fill").fontSize(32).fontColor(Color.Orange)
//        Image($r("app.media.HarmonyOS")) // media目錄下的媒體資源
//          .width("100%").aspectRatio(2.6)
//          .objectFit(ImageFit.Fill)
        Text("ImageRenderMode.Original").fontSize(46).fontColor(Color.Orange)
        Image($r("app.media.HarmonyOS")) // media目錄下的媒體資源
          .width("100%").aspectRatio(2.6)
          .renderMode(ImageRenderMode.Original) // 按照原圖進行渲染,包括顔色
        Text("ImageRenderMode.Template").fontSize(46).fontColor(Color.Orange)
        Image($r("app.media.HarmonyOS")) // media目錄下的媒體資源
          .width("100%").aspectRatio(2.6)
          .renderMode(ImageRenderMode.Template) // 按照原圖進行渲染,包括顔色
      }
      .width('100%')


    }
    .height('100%')
  }
}      
OpenHarmony應用開發之ETS開發方式中的Image元件詳解

.sourceSize({width: number,height: number}): 設定圖檔解碼尺寸,将原始圖檔解碼成指定尺寸的圖檔,number類型機關為px。

一張原本尺寸為1140x570像素的圖檔,指定解碼尺寸為120x100像素的照片後,如果圖檔展示尺寸超過該尺寸,就會模糊,示例代碼如下:

Text("原圖").fontSize(46).fontColor(Color.Orange)
        Image($r("app.media.HarmonyOS")) // media目錄下的媒體資源
          .width("100%").aspectRatio(2.6)

        Text("解碼為小尺寸後顯示模糊").fontSize(46).fontColor(Color.Orange)
        Image($r("app.media.HarmonyOS")) // media目錄下的媒體資源
          .width("100%").aspectRatio(2.6).sourceSize({
          width: 120,
          height: 100
        }) // 解碼為小尺寸後顯示模糊      
OpenHarmony應用開發之ETS開發方式中的Image元件詳解

當然,除過這些,還有其他的一些屬性

事件屬性

1.onComplete(callback: (event?: { width: number, height: number, componentWidth: number, componentHeight: number, loadingStatus: number }) => void):圖檔成功加載時觸發該回調,傳回成功加載的圖源尺寸。

  • width:圖檔的寬,機關為像素。
  • height:圖檔的高,機關為像素。
  • componentWidth:元件的寬,機關為像素。
  • componentHeight:元件的高,機關為像素。
  • loadingStatus:圖檔加載成功的狀态。

2.onError(callback: (event?: { componentWidth: number, componentHeight: number }) => void):圖檔加載出現異常時觸發該回調。

Text("原圖").fontSize(46).fontColor(Color.Orange)
        Image($r("app.media.HarmonyOS")) // media目錄下的媒體資源
          .width("100%").aspectRatio(2.6).onComplete((msg: { width: number,height: number,componentWidth: number,
 componentHeight: number, loadingStatus: number }) => {

          console.log(msg.width.toString());
        })
          .onError(() => {
            console.log('加載圖檔失敗')
          })
          .onFinish(() => {
            //當加載的源檔案為帶動效的svg圖檔時,當svg動效播放完成時會觸發這個回調,如果動效為無限循環動效,則不會觸發這個回調。
          })      

總結