女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

ImageKnife簡介

OpenAtom OpenHarmony ? 來源:OpenAtom OpenHarmony ? 作者:OpenAtom OpenHarmony ? 2022-06-17 11:53 ? 次閱讀

圖片是 UI 界面的重要元素之一,圖片加載速度及效果直接影響應用體驗。ArkUI 開發框架提供了豐富的圖像處理能力,如圖像解碼、圖像編碼、圖像編輯及基本的位圖操作等,滿足了開發者日常開發所需。但隨著產品需求的日益增長,基本的圖像處理能力已不能勝任某些比較復雜的應用場景,如無法直接獲取緩存圖片、無法配置占位圖、無法進行自定義 PixelMap 圖片變換等。為增強 ArkUI 開發框架的圖像處理能力,ImageKnife 組件應運而生,本期我們將為大家帶來 ImageKnife 的介紹。

一、ImageKnife簡介

ImageKnife 是一個參考 Glide 框架進行設計,并基于 eTS 語言實現的圖片處理組件,讓開發者能輕松且高效地進行圖片開發。而 Glide 是一個快速高效的圖片加載庫,它注重于平滑的滾動,提供了易用的 API,高性能、可擴展的圖片解碼管道,以及自動的資源池技術。

功能方面,ImageKnife 提供了自定義圖片變換、占位圖等圖片處理能力,幾乎滿足了開發者進行圖片處理的一切需求。性能方面,ImageKnife 采用 LRU 策略實現二級緩存,可靈活配置,有效減少內存消耗,提升了應用性能。使用方面,ImageKnife 封裝了一套完整的圖片加載流程,開發者只需根據 ImageKnifeOption 配置相關信息即可完成圖片的開發,降低了開發難度,提升了開發效率。如圖 1 所示,是 ImageKnife 加載圖片的整體流程。

503b9a54-d6ac-11ec-bce3-dac502259ad0.jpg

圖1 ImageKnife加載圖片整體流程

二、ImageKnife實現原理

下面我們將為大家介紹 ImageKnife 加載圖片過程中每個環節的實現原理,讓大家更深刻地認識 ImageKnife 組件。圖 2 是 ImageKnife 加載圖片的時序圖:

504d2bc0-d6ac-11ec-bce3-dac502259ad0.jpg

圖2 ImageKnife加載圖片的時序圖

2.1 用戶配置信息

在加載圖片前,用戶需根據自身需求配置相應的參數,包括圖片路徑、圖片大小、占位圖及緩存策略等。ImageKnife 提供了 RequestOption 類,用于封裝用戶配置信息的接口,如圖 3 所示列舉了部分接口供大家參考:

50a4202e-d6ac-11ec-bce3-dac502259ad0.jpg

圖3 用戶配置參數

通過 imageKnifeExecute() 方法獲取用戶配置信息,然后執行 ImageKnife.call(request),正式啟動圖片加載任務。相關實現代碼如下:


imageKnifeExecute() {  // 首先需要確保獲取ImageKnife單例對象  if(ImageKnife){  }else{    ImageKnife = globalThis.exports.default.data.imageKnife;  }  // 生成配置信息requestOption  let request = new RequestOption();  // 配置必要信息和回調  this.configNecessary(request);  // 配置緩存相關信息     this.configCacheStrategy(request);  // 配置顯示信息和回調   this.configDisplay(request);  // 啟動ImageKnife執行請求  ImageKnife.call(request);}

2.2 加載圖片

加載圖片過程是 ImageKnife 組件的核心部分,如圖 4 所示,包含占位圖填充、緩存實現及圖片解碼三個環節。下面我們將為大家分別介紹每個環節的實現。

50df29b2-d6ac-11ec-bce3-dac502259ad0.jpg

圖4 圖片加載過程

2.2.1 占位圖填充

占位圖就是圖片加載過程中頁面上的過渡效果,通常表現形式是在頁面上待加載區域填充灰色的占位圖,可以使得頁面框架不會因為加載失敗而變形。ImageKnife 提供了占位圖功能,開發者可在 RequestOption 中配置是否啟動占位圖任務。如圖 5 所示是占位圖工作流程,執行圖片加載任務后,占位圖會填充加載頁面。如果圖片解析成功則將頁面上填充的占位圖替換為待加載的圖片。如果圖片解析失敗,則將頁面上填充的占位圖替換為“圖片解析失敗占位圖”。

50f9905e-d6ac-11ec-bce3-dac502259ad0.jpg

圖5 占位圖工作流程

相關實現代碼如下:


// 占位圖解析成功placeholderOnComplete(imageKnifeData: ImageKnifeData) {// 主圖未加載成功,并且未加載失敗  顯示占位圖  主圖加載成功或者加載失敗后=>不展示占位圖  if (!this.loadMainReady && !this.loadErrorReady && !this.loadThumbnailReady) {        this.placeholderFunc(imageKnifeData)  }}// 加載失敗 占位圖解析成功errorholderOnComplete(imageKnifeData: ImageKnifeData) {  // 如果有錯誤占位圖 先解析并保存在RequestOption中 等到加載失敗時候進行調用  this.errorholderData = imageKnifeData;  if (this.loadErrorReady) {    this.errorholderFunc(imageKnifeData)}

2.2.2 緩存實現

緩存是圖片加載過程中最關鍵的環節,緩存機制直接影響了圖片加載速度及圖片滾動效果,開發者可通過以下方法來靈活配置緩存策略。

5115f8b6-d6ac-11ec-bce3-dac502259ad0.jpg

圖6 緩存策略API

為了保障圖片的加載速度,ImageKnife 通過使用 Least Recently Used(最近最少使用)清空策略來實現內存緩存及磁盤緩存。如圖 7 所示,在圖片加載過程中,CPU 會首先讀取內存緩存中的數據,如果讀取到圖片資源則直接顯示圖片,否則讀取磁盤緩存數據。如果在磁盤緩存上仍然沒有讀取到數據,則可判定為該圖片為網絡圖片,這時需要將網絡圖片解碼后再進行顯示(后面章節會詳細介紹),并將解碼后的圖片文件緩存至磁盤。

5164b046-d6ac-11ec-bce3-dac502259ad0.jpg

圖7 圖片緩存過程

下面我們將分別介紹兩種緩存機制的具體實現。

(1)內存緩存

內存緩存,就是指當前程序運行內存分配的臨時存儲器,當我們使用 ImageKnife 加載圖片時,這張圖片會被緩存到內存當中,只要在它還沒從內存中被清除之前,下次再加載這張圖片都會直接從內存中讀取,而不用重新從網絡或硬盤上讀取,大幅度提升圖片的加載效率。ImageKnife 內存緩存的實現,需控制最大空間(maxsize),以及目前占用空間(size),相關實現代碼如下:


// 移除較少使用的緩存數據trimToSize(tempsize: number) {  while (true) {    if (tempsize < 0) {      this.map.clear()      this.size = 0      break    }    if (this.size <= tempsize || this.map.isEmpty()) {      break    }    var delkey = this.map.getFirstKey()    this.map.remove(delkey)    this.size--  }}
// 緩存數據最大值maxSize(): number{  return this.maxsize}
// 設置緩存數據量最大值resize(maxsize: number) {  if (maxsize < 0) {    throw new Error('maxsize <0 & maxsize invalid');  }  this.maxsize = maxsize  this.trimToSize(maxsize)}
// 清除緩存evicAll() {  this.trimToSize(-1)}

(2)磁盤緩存

默認情況下,磁盤緩存的是解碼后的圖片文件,需防止應用重復從網絡或其他地方下載和讀取數據。ImageKnife 磁盤緩存的實現,主要依靠 journal 文件對緩存數據進行保存,保證程序磁盤緩存內容的持久化問題。相關實現代碼:


//讀取journal文件的緩存數據readJournal(path: string) {  var fileReader = new FileReader(path)  var line: string = ''  while (!fileReader.isEnd()) {    line = fileReader.readLine()    line = line.replace('
', '').replace('
', '')    this.dealwithJournal(line)  }  this.fileUtils.deleteFile(this.journalPathTemp)  this.trimToSize()}
//根據LRU算法刪除多余緩存數據private trimToSize() {  while (this.size > this.maxSize) {    var tempkey: string = this.cacheMap.getFirstKey()    var fileSize = this.fileUtils.getFileSize(this.dirPath + tempkey)    if (fileSize > 0) {      this.size = this.size - fileSize    }    this.fileUtils.deleteFile(this.dirPath + tempkey)    this.cacheMap.remove(tempkey)    this.fileUtils.writeData(this.journalPath, 'remove ' + tempkey + '
')  }}
//清除所有disk緩存數據cleanCacheData() {  var length = this.cacheMap.size()  for (var index = 0; index < length; index++) {    this.fileUtils.deleteFile(this.dirPath + this.cacheMap[index])  }  this.fileUtils.deleteFile(this.journalPath)  this.cacheMap.clear()  this.size = 0}

2.2.3 圖片解碼

當我們使用 ImageKnife 去加載一張圖片的時候,并不是將原始圖片直接顯示出來,而是會進行圖片解碼后再顯示到頁面。圖片解碼就是將不同格式的圖片(包括 JPEG、PNG、GIF、WebP、BMP)解碼成統一格式的 PixelMap 圖片文件。ImageKnife 的圖片解碼能力依賴的是 ArkUI 開發框架提供的 ImageSource 解碼能力。通過 import image from '@ohos.multimedia.image'導入 ArkUI 開發框架的圖片能力,并調用 createImageSource() 方法獲取,實現代碼如下:


import image from '@ohos.multimedia.image'
export class TransformUtils {  static centerCrop(buf: ArrayBuffer, outWidth: number, outHeihgt: number,                    callback?: AsyncTransform>) {    // 創建媒體解碼imageSource    var imageSource = image.createImageSource(buf as any);    // 獲取圖片信息    imageSource.getImageInfo()      .then((p) => {        var sw;        var sh;        var scale;        var pw = p.size.width;        var ph = p.size.height;        // 根據centerCrop規則控制縮放比例        if (pw == outWidth && ph == outHeihgt) {          sw = outWidth;          sh = outHeihgt;        } else {          if (pw * outHeihgt > outWidth * ph) {            scale = outHeihgt / ph;          } else {            scale = outWidth / pw;          }          sw = pw * scale;          sh = ph * scale;        }        var options = {          editable: true,          rotate: 0,          desiredRegion: { size: { width: sw, height: sh },            x: pw / 2 - sw / 2,            y: ph / 2 - sh / 2,          },        }        if (callback) {          // 回調,創建相關配置pixelmap          callback('', imageSource.createPixelMap(options));        }      })      .catch((error) => {        callback(error, null);      })  }}

2.3 顯示圖片

獲取到 PixelMap 解碼文件后,接下來就是將它渲染到應用界面上。ImageKnife 的圖片渲染能力依賴的是 ArkUI 開發框架提供的 image 組件的渲染能力。由于 eTS 是聲明式的,我們無法直接獲得 Image 組件的對象,需要依賴 ArkUI 開發框架的 @State 能力綁定輸入參數,在改變屬性對象之后,通知 UI 組件重新渲染,達到圖片顯示的效果,相關代碼如下:
@Componentexport struct ImageKnifeComponent {  @Watch('watchImageKnifeOption') @Link imageKnifeOption: ImageKnifeOption;  @State imageKnifePixelMapPack: PixelMapPack = new PixelMapPack();  @State imageKnifeResource: Resource = $r('app.media.icon_loading')  @State imageKnifeString: string = ''  @State normalPixelMap: boolean = false;  @State normalResource: boolean = true;  previousData: ImageKnifeData = null;  nowData: ImageKnifeData = null;
  build() {    Stack() {      //Image組件配置      Image(this.normalPixelMap ? this.imageKnifePixelMapPack.pixelMap : (this.normalResource ? this.imageKnifeResource : this.imageKnifeString))        .objectFit(this.imageKnifeOption.imageFit ? this.imageKnifeOption.imageFit : ImageFit.Fill)        .visibility(this.imageVisible)        .width(this.imageWidth)        .height(this.imageHeight)    }  }  //必要的用戶配置和回調方法  configNecessary(request: RequestOption){    request.load(this.imageKnifeOption.loadSrc)      .addListener((err, data) => {        console.log('request.load callback')        this.imageKnifeChangeSource(data)        this.animateTo('image');        return false;      })
    if (this.imageKnifeOption.size) {      request.setImageViewSize(this.imageKnifeOption.size)    }  }  // imageknife 第一次啟動和數據刷新后重新發送請求  imageKnifeExecute() {    let request = new RequestOption();    this.configNecessary(request);    this.configCacheStrategy(request);    this.configDisplay(request);    ImageKnife.call(request);  }  //返回數據Image渲染展示圖片  imageKnifeSpecialFixed(data:ImageKnifeData) {    if (data.isPixelMap()) {      this.displayPixelMap(data);    }    else if (data.isString()) {      this.displayString(data);    } else if (data.isResource()) {      this.displayResource(data);    } else {    }  }}
注:@State 裝飾的變量是組件內部的狀態數據,當這些狀態數據被修改時,將會調用所在組件的 build 方法進行 UI 刷新。

三、ImageKnife實戰

通過上文的介紹,相信大家對 ImageKnife 組件有了深刻的了解。下面我們將創建一個 ImageKnife_Test 項目,為大家展示 ArkUI 開發框架中 ImageKnife 組件的使用。通過將 ImageKnife 組件下載至項目中,然后根據 ImageKnifeOption 配置相關信息,即可完成 GIF 圖片的加載。

3.1 創建項目

如圖 8 所示,在 DevEco Studio 中新建 ImageKnife_Test 項目,項目類型選擇 Application,語言選擇 eTS,點擊 Finish 完成創建。

51e17770-d6ac-11ec-bce3-dac502259ad0.jpg

圖8 創建項目

3.2 添加依賴

成功創建項目后,接下來就是將 ImageKnife 組件下載至項目中。

首先,我們需找到 .npmrc 配置文件,并在文件中添加 @ohos 的 scope 倉庫地址:@ohos:registry=https://repo.harmonyos.com/npm/,如圖 9 所示:

52287cec-d6ac-11ec-bce3-dac502259ad0.jpg

圖9 添加 scope倉庫地址

配置好 npm 倉庫地址后,如圖 10 所示,在 DevEco Studio 的底部導航欄,點擊“Terminal”(快捷鍵 Alt+F12),鍵入命令:npm install @ohos/imageknife 并回車,此時 ImageKnife 組件會被自動下載至項目中。下載完成后工程根目錄下會生成 node_modules/@ohos/imageknife 目錄。

526d892c-d6ac-11ec-bce3-dac502259ad0.jpg

圖10 下載至項目

3.3 編寫邏輯代碼

ImageKnife 組件成功下載至項目中后,接下來就是邏輯代碼編寫,這里我們將為大家介紹兩種使用方式:

方式一:首先初始化全局 ImageKnife 實例,然后在 app.ets 中調用 ImageKnife.with() 進行初始化,相關代碼如下:


import {ImageKnife} from '@ohos/imageknife'export default {  data: {    imageKnife: {} // ImageKnife  },  onCreate() {    this.data.imageKnife = ImageKnife.with();  },  onDestroy() {  },}然后在頁面index.ets中使用imageknife,相關代碼如下:@Entry@Componentstruct Index {  build() {
  }
  // 頁面初始化完成,生命周期回調函數中 進行調用ImageKnife  aboutToAppear() {    let requestOption = new RequestOption();  requestOptin.load($r('app.media.IceCream'))  .addListener((err,data) => {      //加載成功/失敗回調監聽    })    ...  ImageKnife.call(requestOption)  }}
var ImageKnife;var defaultTemp = globalThis.exports.defaultif (defaultTemp != undefined) {  ImageKnife = defaultTemp.data.imageKnife;}
方式二:在 index.ets 中,直接使用 ImageKnifeOption 作為入參,并配合自定義組件 ImageKnifeComponent 使用,相關代碼如下:
import {ImageKnifeOption} from '@ohos/imageknife'
@Entry@Componentstruct Index {  @State imageKnifeOption1: ImageKnifeOption =    {      loadSrc: $r('app.media.gifSample'),      size: { width: 300, height: 300 },      placeholderSrc: $r('app.media.icon_loading'),      errorholderSrc: $r('app.media.icon_failed')    };  build() {    Scroll() {      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {        ImageKnifeComponent({ imageKnifeOption: $imageKnifeOption1 })      }    }    .width('100%')    .height('100%')  }}
以上就是本期全部內容,恭喜大家又花幾分鐘時間收獲了一個實用的組件。希望廣大開發者能利用這個強大的開源組件開發出更多精美的應用。同時,我們會陸續更新實用組件的解析,敬請期待! 審核編輯 :李倩

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 框架
    +關注

    關注

    0

    文章

    404

    瀏覽量

    17796
  • 組件
    +關注

    關注

    1

    文章

    529

    瀏覽量

    18313

原文標題:ImageKnife組件,讓小白也能輕松搞定圖片開發

文章出處:【微信號:gh_e4f28cfa3159,微信公眾號:OpenAtom OpenHarmony】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    Get這個秘籍,鴻蒙原生應用頁面滑動絲滑無比

    時出現白塊現象是開發者常遇到的技術難題,且大多數情況在使用imageKnife后仍存在相應問題。傳統的優化方式主要依賴于增加cachedCount緩存數量,但這一方法往往帶來新的問題,例如首頁白屏或
    發表于 03-06 14:41

    FGPA SYSTEM樣板79761制作流程簡介

    電子發燒友網站提供《FGPA SYSTEM樣板79761制作流程簡介.pdf》資料免費下載
    發表于 01-21 14:49 ?0次下載
    FGPA SYSTEM樣板79761制作流程<b class='flag-5'>簡介</b>

    ES32V SDK簡介

    電子發燒友網站提供《ES32V SDK簡介.pdf》資料免費下載
    發表于 01-16 16:15 ?0次下載
    ES32V SDK<b class='flag-5'>簡介</b>

    PAM4 PRBS測試簡介

    本文為 AMD Versal 自適應 SoC 器件和 AMD UltraScale Plus 的 PAM4 PRBS 測試簡介。
    的頭像 發表于 01-15 10:55 ?1566次閱讀
    PAM4 PRBS測試<b class='flag-5'>簡介</b>

    EE-235:VisualDSP腳本簡介

    電子發燒友網站提供《EE-235:VisualDSP腳本簡介.pdf》資料免費下載
    發表于 01-06 14:22 ?0次下載
    EE-235:VisualDSP腳本<b class='flag-5'>簡介</b>

    屏蔽柵MOSFET技術簡介

    繼上一篇超級結MOSFET技術簡介后,我們這次介紹下屏蔽柵MOSFET。
    的頭像 發表于 12-27 14:52 ?2445次閱讀
    屏蔽柵MOSFET技術<b class='flag-5'>簡介</b>

    閃電定位儀應用簡介

    閃電定位儀應用簡介
    發表于 11-13 16:34 ?0次下載

    閃電定位儀的日常維護方法簡介

    閃電定位儀的日常維護方法簡介
    發表于 11-13 16:32 ?0次下載

    超聲波簡介

    電子發燒友網站提供《超聲波簡介.pdf》資料免費下載
    發表于 10-25 09:14 ?0次下載
    超聲波<b class='flag-5'>簡介</b>

    可穿戴設備的電針活動應用簡介

    電子發燒友網站提供《可穿戴設備的電針活動應用簡介.pdf》資料免費下載
    發表于 09-11 09:31 ?0次下載
    可穿戴設備的電針活動應用<b class='flag-5'>簡介</b>

    遠程患者監測申請簡介

    電子發燒友網站提供《遠程患者監測申請簡介.pdf》資料免費下載
    發表于 09-10 10:43 ?0次下載
    遠程患者監測申請<b class='flag-5'>簡介</b>

    UCD3138x器件簡介

    電子發燒友網站提供《UCD3138x器件簡介.pdf》資料免費下載
    發表于 08-31 10:03 ?0次下載
    UCD3138x器件<b class='flag-5'>簡介</b>

    光耦仿真器簡介

    電子發燒友網站提供《光耦仿真器簡介.pdf》資料免費下載
    發表于 08-28 11:45 ?0次下載
    光耦仿真器<b class='flag-5'>簡介</b>

    第1章 有限單元法和ANSYS簡介

    ?第1章 ?有限單元法和ANSYS簡介
    發表于 08-27 17:20 ?1次下載

    糧情測控系統簡介

    電子發燒友網站提供《糧情測控系統簡介.docx》資料免費下載
    發表于 08-08 12:46 ?0次下載