在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

解決HarmonyOS應用中Image組件白塊問題的有效方案

HarmonyOS開發者 ? 來源:HarmonyOS開發者 ? 作者:HarmonyOS開發者 ? 2025-02-17 10:08 ? 次閱讀

概述

HarmonyOS應用開發過程中,通過Image組件加載網絡圖片時,通常會經歷四個關鍵階段:組件創建、圖片資源下載、圖片解碼和刷新。當加載的圖片資源過大時,Image組件會等待圖片數據下載和解碼完成后才刷新顯示。由于圖片下載過程耗時較長,在圖片完全加載之前,頁面往往會顯示空白區域或占位圖(通常為白色或淺色背景),這種現象被稱為“Image 白塊”?!癐mage 白塊”不僅影響視覺效果,還會降低用戶體驗,因此在開發中應盡量避免這種情況。

92506c88-eab5-11ef-9310-92fbcf53809c.gif

圖1 Image白塊問題效果圖

為了減少圖片加載時出現的白塊問題,開發者可以采用預下載和緩存機制。具體來說,可以在組件創建之前,通過網絡請求將圖片下載并解碼,然后將圖片數據緩存到應用沙箱中。當Image組件加載時,首先檢查應用沙箱中是否存在該圖片的緩存數據。如果緩存存在,則直接從緩存中讀取圖片,避免重復下載;如果緩存不存在,再進行網絡請求并下載圖片。通過這種方式,可以有效減少加載大尺寸網絡圖片時的白屏或白塊現象,縮短加載時間,從而提升用戶體驗。

9297abc0-eab5-11ef-9310-92fbcf53809c.png

圖2 Image加載網絡圖片兩種方式對比

場景案例

在使用Navigation組件時,開發者通常會在主頁引入子頁面組件,并通過按鈕點擊實現頁面跳轉。如果子頁面需要加載較大的網絡圖片,且未設置占位圖,則跳轉后可能會出現長時間的白塊現象。為了解決這一問題,可以在父頁面提前下載圖片并緩存到本地。當子頁面加載時,直接從緩存中讀取圖片數據,從而減少白塊顯示時間,提升用戶體驗。

本文將以應用沙箱提前緩存舉例,給出減少Image白塊出現時長的一種優化方案。

優化前:使用Image組件直接加載網絡地址

以下為部分示例代碼:

NavDestination() {
  Row() {
    // 不推薦用法:使用Image直接加載網絡圖片的方式,受到圖片下載與解析的耗時影響,極易出現白塊。
    Image("https://www.example.com/xxx.png") // 此處請填寫一個具體的網絡圖片地址。
      .objectFit(ImageFit.Auto)
      .width('100%')
      .height('100%')
  }
  .width('100%')
  .height('100%')
  .justifyContent(FlexAlign.Center)
}
.title(this.name)
優化后:子頁面PageOne中需展示一張較大的網絡圖片,在父組件的aboutToAppear()中提前發起網絡請求,并做判斷文件是否存在,已下載的不再重復請求,存儲在應用沙箱中。當父頁面點擊按鈕跳轉子頁面PageOne,此時觸發pixMap請求讀取應用沙箱中已緩存解碼的網絡圖片并存儲在LocalStorage中,通過在子頁面的Image中傳入被@StorageLink修飾的變量ImageData進行數據刷新,圖片送顯。

92ad46ce-eab5-11ef-9310-92fbcf53809c.png

圖3 使用預下載的方式,由開發者靈活地處理網絡圖片,減少白塊出現時長。

以下為關鍵示例代碼:

1.在父組件里aboutToAppear()中提前發起網絡請求,當父頁面點擊按鈕跳轉子頁面PageOne,此時觸發pixMap請求讀取應用沙箱中已緩存解碼的網絡圖片并存儲在localStorage中。非首次點擊時,不再重復調用getPixMap(),避免每次點擊都從沙箱里讀取文件。

aboutToAppear(): void {
  httpRequest(); // 在父組件提前發起網絡請求
}


build() {
  Navigation(this.childNavStack) {
    Column() {
      Button('push Path to pageOne', { stateEffect: true, type: ButtonType.Capsule })
        .width('80%')
        .height(40)
        .margin({ bottom: '36vp' })
        .onClick(() => {
          if (!localStorage.get('imageData')) { // 非首次點擊,不再重復調用getPixMap(),避免每次點擊都從沙箱里讀取文件。
            this.getPixMap();
          }
          this.childNavStack.pushPath({ name: 'pageOne' });
        })
    }
    .width('100%')
    .height('100%')
    .justifyContent(FlexAlign.End)
  }
  .backgroundColor(Color.Transparent)
  .title('ParentNavigation')
}
2.在NetRequest.ets中定義網絡請求httpRequest(),通過fs.access()檢查文件是否存在,當文件存在時不再重復請求,并寫入沙箱中。
export async function httpRequest() {
  fs.access(fileUrl, fs.AccessModeType.READ).then((res) => { // 檢查文件是否存在
    if (!res) { // 如沙箱里不存在地址,重新請求網絡圖片資源
      http.createHttp()
        .request('https://www.example.com/xxx.png', // 此處請填寫一個具體的網絡圖片地址。
          (error: BusinessError, data: http.HttpResponse) => {
            if (error) {
              // 下載失敗時不執行后續邏輯
              return;
            }
            // 處理網絡請求返回的數據
            if (http.ResponseCode.OK === data.responseCode) {
              const imageData: ArrayBuffer = data.result as ArrayBuffer;
              // 保存圖片到應用沙箱
              readWriteFileWithStream(imageData);
            }
          }
        )
    }
  })
}
3.在子組件中通過在子頁面的Image中傳入被@StorageLink修飾的變量ImageData進行數據刷新,圖片送顯。
build() {
  NavDestination() {
    Row() {
      Image(this.imageData) // 正例:此時Image拿到已提前加載好的網絡圖片,減少了白塊出現時長
        .objectFit(ImageFit.Auto)
        .width('100%')
        .height('100%')
    }
    .width('100%')
    .height('100%')
    .justifyContent(FlexAlign.Center)
  }
  .title(this.name)
}

性能對比分析

1、trace分析

下面,使用trace對優化前后性能進行對比分析。

優化前查看trace數據,分析階段的起點為父頁面點擊按鈕開始計時即trace的H:DispatchTouchEvent,結束點為子頁面圖片渲染的首幀出現即H:CreateImagePixelMap標簽后的第一個Vsync,記錄白塊出現時間為1.3s,其中以H:HttpRequestInner的標簽起始為起點到H:DownloadImageSuccess標簽結束為終點記錄時間,即為網絡下載耗時1.2s,因此使用Image直接加載網絡圖片時,出現長時間Image白塊,其原因是需要等待網絡下載資源完成。

92cd21ba-eab5-11ef-9310-92fbcf53809c.png

圖4 直接使用Image加載網絡數據

優化后查看trace數據,分析階段的起點為父頁面點擊按鈕開始計時即trace的H:DispatchTouchEvent,結束點為子頁面圖片渲染的首幀出現即H:CreateImagePixelMap標簽后的第一個Vsync,記錄白塊出現時間為32.6ms,其中記錄H:HttpRequestInner的標簽耗時即為提前網絡下載的耗時1.16s,對比白塊時長可知提前預下載可以減少白塊出現時長。

92ecdf82-eab5-11ef-9310-92fbcf53809c.png

圖5 使用預下載的方式

說明:網絡下載耗時實際受到網絡波動影響,優化前后的網絡下載耗時數據總體差異在1s內,提供的性能數值僅供參考。

2、效果對比

優化前直接使用Image加載網絡數據,未使用預下載 優化后使用預下載

92506c88-eab5-11ef-9310-92fbcf53809c.gif

932ce046-eab5-11ef-9310-92fbcf53809c.gif

3、數據對比

對比數據如下:

方案 白塊出現時長(毫秒) 白塊出現時長
(優化前)直接使用Image加載網絡數據,未使用預下載 1300 圖片位置白塊出現時間較長
(優化后)使用預下載 32.6 圖片位置白塊出現時間較短

說明:測試數據僅限于示例程序,不同設備特性和具體應用場景的多樣性,所獲得的性能數據存在差異,提供的數值僅供參考。

由此可見,加載網絡圖片時,使用預下載,提前處理網絡請求并從應用沙箱中讀取緩存數據的方式,可以減少用戶可見Image白屏或白塊出現時長,提升用戶體驗。

更詳細內容請參考:https://developer.huawei.com/consumer/cn/doc/best-practices-V5/bpta-image-white-lump-solution-V5

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

    關注

    0

    文章

    33

    瀏覽量

    11960
  • 組件
    +關注

    關注

    1

    文章

    521

    瀏覽量

    17976
  • HarmonyOS
    +關注

    關注

    79

    文章

    1985

    瀏覽量

    30774

原文標題:HarmonyOS應用Image白塊問題解決方案

文章出處:【微信號:HarmonyOS_Dev,微信公眾號:HarmonyOS開發者】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    HarmonyOS開發案例:【imageimage-animator組件

    OpenHarmony提供了常用的圖片、圖片幀動畫播放器組件,開發者可以根據實際場景和開發需求,實現不同的界面交互效果,包括:點擊陰影效果、點擊切換狀態、點擊動畫效果、點擊切換動效。
    的頭像 發表于 04-26 17:32 ?1579次閱讀
    <b class='flag-5'>HarmonyOS</b>開發案例:【<b class='flag-5'>image</b>、<b class='flag-5'>image</b>-animator<b class='flag-5'>組件</b>】

    HarmonyOS開發案例:【基礎組件Slider的使用】

    學習如何使用聲明式UI編程框架的基礎組件。本篇Codelab將會使用Image組件、Slider組件、Text組件共同實現一個可調節的風車動
    的頭像 發表于 05-10 16:01 ?766次閱讀
    <b class='flag-5'>HarmonyOS</b>開發案例:【基礎<b class='flag-5'>組件</b>Slider的使用】

    HarmonyOS開發案例:【常用組件與布局】

    HarmonyOS ArkUI提供了豐富多樣的UI組件,您可以使用這些組件輕松地編寫出更加豐富、漂亮的界面。
    的頭像 發表于 05-09 18:20 ?1356次閱讀
    <b class='flag-5'>HarmonyOS</b>開發案例:【常用<b class='flag-5'>組件</b>與布局】

    HarmonyOS開發--1、組件化的設計方案

    ”的系統能力為各種硬件開發提供了全棧的軟件解決方案,并保持了上層接口的統一和分布式能力的統一。HarmonyOS通過組件化和小型化等設計方法,做到硬件資源的可大可小,在多種終端設備間,按需彈性部署
    發表于 09-14 11:30

    HarmonyOS實戰—Image組件的剪切和縮放

    1. Image圖片標簽概述:圖片(Image)是用來顯示圖片的組件。常見的屬性:id,長、寬、高等。具體可以參考華為開發手冊(組件的通用屬性):https
    發表于 08-17 18:00

    HarmonyOS組件更新,新增700+開源組件

    組件是對數據和方法的簡單封裝,通過使用現成的組件讓應用開發更加簡單高效。自HarmonyOS組件開源以來,經兩次上線,已開源了700+的Java/JS
    發表于 11-18 11:17

    講解一下HarmonyOS的幾個自定義組件用到的知識

    看下 DrawTask 的描述:在項目開發,我們經常會用到自定義組件,此處分享一下 HarmonyOS JS 如何利用 canvas 實現自定義
    發表于 03-16 16:05

    HarmonyOS應用開發資料(Svg組件

    1、HarmonyOS應用開發-Svg組件circle  該組件從API version 7開始支持。后續版本如有新增內容,則采用上角標單獨標記該內容的起始版本。2、HarmonyOS
    發表于 03-17 14:49

    組件資料】HarmonyOS三方件開發指南

    顯示。1.2.模擬器上運行效果:2、HarmonyOS三方件開發指南——AsyncHttpHarmony組件1.AsyncHttpHarmony功能介紹1.1.組件介紹在做HarmonyOS
    發表于 03-21 11:18

    求助,請問如何發布我的HarmonyOS組件或解決方案?

    我要如何發布我的HarmonyOS組件或解決方案
    發表于 06-02 15:55

    HarmonyOS/OpenHarmony應用開發-聲明式開發范式組件匯總

    類型基礎組件Blank、Button、Checkbox、CheckboxGroup、DataPanel、DatePicker、Divider、Gauge、Image、ImageAnimator
    發表于 01-19 11:14

    HarmonyOS元服務-動態創建組件

    示例效果:提供在頁面動態添加組件,并為動態添加的組件設置屬性與樣式的能力(API version 8開始支持)。示例代碼:index.hml<div class="
    發表于 03-29 10:52

    HarmonyOS組件化設計方案

    能力、適配多種終端形態”,HarmonyOS采用了“組件化”的設計方案,實現根據設備的資源能力和業務特征靈活裁剪,滿足不同形態終端設備對操作系統的要求。 一、為什么采用“組件化”設計
    的頭像 發表于 10-13 09:59 ?2351次閱讀

    OpenHarmony應用開發之ETS開發方式Image組件

    今天帶大家了解ETS開發方式Image組件
    的頭像 發表于 07-03 12:06 ?3581次閱讀
    OpenHarmony應用開發之ETS開發方式<b class='flag-5'>Image</b><b class='flag-5'>組件</b>

    鴻蒙ArkTS聲明式組件Image

    Image為圖片組件,常用于在應用顯示圖片。Image支持加載[PixelMap]、[ResourceStr]和[DrawableDescriptor]類型的數據源,支持png、jp
    的頭像 發表于 06-23 20:32 ?1184次閱讀
    鴻蒙ArkTS聲明式<b class='flag-5'>組件</b>:<b class='flag-5'>Image</b>
    主站蜘蛛池模板: 一级不卡毛片免费 | 欧美性天堂 | 99久久精品免费看国产免费 | 色免费视频 | 六月婷婷激情 | 痴女在线播放免费视频 | 黄网站在线观看视频 | 免费色视频网站 | 成人黄网大全在线观看 | 日本亚洲卡一卡2卡二卡三卡四卡 | 成年人黄色免费网站 | 精品手机在线视频 | 亚洲欧美在线视频免费 | 亚洲一区日韩一区欧美一区a | 婷婷九月丁香 | 天天操天天干天搞天天射 | 国产一级做a爰片久久毛片男 | 欧美一区二区三区在线 | 欧美操穴 | www亚洲欲色成人久久精品 | 最新精品 | 唐人社电亚洲一区二区三区 | 天天射天天射天天干 | 欧美大胆一级视频 | 亚洲乱码一二三四区 | 美女被猛男躁免费视频网站 | 欧美在线视频免费播放 | 欧美不卡1卡2卡三卡老狼 | 国产精品久久久久网站 | 欧美伦理一区 | 亚洲成熟 | 日本成人视屏 | 免费黄色在线观看 | 亚洲97在线 | 国内自拍 亚洲系列 欧美系列 | 扒开双腿爽爽爽视频www | 性夜影院爽黄a免费视频 | 中文天堂在线最新2022更新 | 欧美激情第一欧美在线 | aaaa级日本片免费视频 | 日本女人啪啪 |