99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于ArkUI框架開(kāi)發(fā)-ImageKnife渲染層重構(gòu)

OpenAtom OpenHarmony ? 來(lái)源:未知 ? 2023-04-05 00:25 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

點(diǎn)擊藍(lán)字 ╳ 關(guān)注我們


開(kāi)源項(xiàng)目 OpenHarmony
是每個(gè)人的 OpenHarmony

周黎生

OpenHarmony知識(shí)體系工作組

ImageKnife是一款圖像加載緩存庫(kù),主要功能特性如下:
支持內(nèi)存緩存,使用LRUCache算法,對(duì)圖片數(shù)據(jù)進(jìn)行內(nèi)存緩存。
支持磁盤(pán)緩存,對(duì)于下載圖片會(huì)保存一份至磁盤(pán)當(dāng)中。
支持進(jìn)行圖片變換:支持圖像像素源圖片變換效果。
支持用戶配置參數(shù)使用:(例如:配置是否開(kāi)啟一級(jí)內(nèi)存緩存,配置磁盤(pán)緩存策略,配置僅使用緩存加載數(shù)據(jù),配置圖片變換效果,配置占位圖,配置加載失敗占位圖等)。
更多細(xì)節(jié)請(qǐng)?jiān)L問(wèn)源碼倉(cāng)庫(kù)地址:
https://gitee.com/openharmony-tpc/ImageKnife

背景說(shuō)明

早期ImageKnife三方庫(kù)在實(shí)現(xiàn)渲染部分的時(shí)候,使用的是image組件來(lái)展示圖片的。由于image組件其實(shí)是一個(gè)完整的集加載解析和圖片展示的組件,渲染的模式只能通過(guò)配置固定參數(shù)進(jìn)行,面對(duì)復(fù)雜的需求場(chǎng)景,可能會(huì)出現(xiàn)擴(kuò)展性不夠的情況。
現(xiàn)在隨著時(shí)間的推移渲染組件又多了一位重量級(jí)選手Canvas組件??梢酝ㄟ^(guò)2個(gè)組件渲染層的能力對(duì)比進(jìn)行判斷渲染層最終交由哪個(gè)組件展示。
如果想了解更多ImageKnife的背景知識(shí),可以點(diǎn)擊鏈接查看之前的文章介紹:
舊版本ImageKnife加載流程介紹
https://developer.huawei.com/consumer/cn/forum/topic/0203864555891240375?fid=0101587866109860105

組件選型,能力對(duì)比

首先我們來(lái)看看Image組件和Canvas組件對(duì)于渲染這一塊的支持情況。


從上表我們可以看出:
Image組件雖然支持了PixelMap的繪制,但是基本沒(méi)有繪制控制能力,而且擴(kuò)展性能力也比較弱,并且渲染過(guò)程不可見(jiàn),也無(wú)法對(duì)繪制內(nèi)容進(jìn)行更多操作。
而Canvas組件屬于更加底層的渲染組件,可以完美地控制繪制內(nèi)容,并且渲染過(guò)程可見(jiàn),符合了開(kāi)發(fā)者對(duì)于擴(kuò)展性要求較高的定制場(chǎng)景。

重構(gòu)前后能力對(duì)比

重構(gòu)完成的內(nèi)容

1.使用canvas組件替代Image組件進(jìn)行渲染展示圖片。
2.所有圖像數(shù)據(jù)在渲染層都轉(zhuǎn)換為PixelMap,方便統(tǒng)一管理和擴(kuò)展。
3.所有回調(diào)節(jié)點(diǎn),統(tǒng)一抽象成接口,方便后續(xù)進(jìn)行擴(kuò)展,提高代碼可維護(hù)性。
4.所有的回調(diào)節(jié)點(diǎn)繪制的實(shí)現(xiàn),都采用了責(zé)任鏈模式,提高了自定義繪制擴(kuò)展能力。
5.將部分通用方法封裝成工廠方法,減少開(kāi)發(fā)者代碼量。
6.通用方法從配置參數(shù)剝離,可采用鏈?zhǔn)秸{(diào)用方式使用這些方法。
7.為了支持列表ImageKnifeOption參數(shù)使用@LinkObject修飾,同時(shí)ImageKnifeOption類型被@Observed修飾繼承,不可被繼承。

重構(gòu)中比較重要的點(diǎn)

點(diǎn)1:回調(diào)接口抽象為IDrawLifeCycle接口
渲染繪制是主線程才能操作。因此我們可以對(duì)渲染順序進(jìn)行了梳理,大致流程:展示占位圖->展示網(wǎng)絡(luò)加載進(jìn)度->展示縮略圖->展示主圖->展示重試圖層->展示失敗占位圖


這里每個(gè)藍(lán)色的小方格都代表著一個(gè)數(shù)據(jù)返回的回調(diào)接口,我們需要在這個(gè)回調(diào)接口,處理接下來(lái)內(nèi)容渲染的展示操作。因?yàn)槊總€(gè)回調(diào)的流程是固定的,有點(diǎn)像生命周期的流程。所以我這邊抽象成接口IDrawLifeCycle繪制生命周期進(jìn)行表達(dá)。這其實(shí)也是為了后面擴(kuò)展做了準(zhǔn)備。

點(diǎn)2:繪制實(shí)現(xiàn)采用責(zé)任鏈模式
我們支持了用戶配置自定義繪制和全局配置自定義繪制的能力。采用了責(zé)任鏈模式實(shí)現(xiàn),用戶參數(shù)設(shè)置->全局參數(shù)設(shè)置->自定義組件內(nèi)部設(shè)置。這樣設(shè)計(jì)的好處就是保留了用戶擴(kuò)展的能力,用戶可以參與自定義繪制。


點(diǎn)3:提供了ImageKnifeDrawFactory工廠類
在開(kāi)發(fā)者需要進(jìn)行自定義繪制時(shí),必須實(shí)現(xiàn)IDrawLifeCycle的6個(gè)接口。為了簡(jiǎn)化開(kāi)發(fā)者操作,這里提供了ImageKnifeDrawFactory工廠類。
ImageKnifeDrawFactory里面封裝了圓角、橢圓、百分比下載等實(shí)現(xiàn),簡(jiǎn)化用戶操作。當(dāng)然更多的需求,可以參考該工廠類自行擴(kuò)展實(shí)現(xiàn)。
這里我們提供簡(jiǎn)單的場(chǎng)景示例:
場(chǎng)景1:一句代碼,加個(gè)圓角效果
代碼如下:
import {ImageKnifeComponent} from '@ohos/imageknife'
import {ImageKnifeOption} from '@ohos/imageknife'
import {ImageKnifeDrawFactory} from '@ohos/imageknife'
@Entry
@Component
struct Index {
@State imageKnifeOption1: ImageKnifeOption =
{ // 加載一張本地的png資源(必選)
loadSrc: $r('app.media.pngSample'),
// 主圖的展示模式是 縮放至適合組件大小,并且在組件底部繪制
mainScaleType: ScaleType.FIT_END,
// 占位圖使用本地資源icon_loading(可選)
placeholderSrc: $r('app.media.icon_loading'),
// 失敗占位圖使用本地資源icon_failed(可選)
errorholderSrc: $r('app.media.icon_failed'),
// 繪制圓角30,邊框5,邊框"#ff00ff".用戶自定義繪制(可選)
drawLifeCycle:ImageKnifeDrawFactory.createRoundLifeCycle(5,"#ff00ff",30)
};
build() {
Scroll() {
Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
ImageKnifeComponent({ imageKnifeOption: this.imageKnifeOption1 })
.width(300) // 自定義組件已支持設(shè)置通用屬性和事件,這里寬高設(shè)置放在鏈?zhǔn)秸{(diào)用中完成
.height(300)
}
}
.width('100%')
.height('100%')
}
}

場(chǎng)景2:全局配置網(wǎng)絡(luò)下載百分比效果展示
僅需一句代碼所有網(wǎng)絡(luò)圖片加載都能新增網(wǎng)絡(luò)下載百分比效果展示。代碼如下:
import AbilityStage from '@ohos.application.Ability'
import { ImageKnife,ImageKnifeDrawFactory} from '@ohos/imageknife'


export default class EntryAbility extends Ability {
onCreate(want,launchParam) {
globalThis.ImageKnife = ImageKnife.with(this.context);
// 全局配置網(wǎng)絡(luò)加載進(jìn)度條
globalThis.ImageKnife.setDefaultLifeCycle(ImageKnifeDrawFactory.createProgressLifeCycle("#10a5ff", 0.5))
}
}
這里大家可能會(huì)問(wèn),為什么會(huì)將這個(gè)IDrawLifeCycle放在EntryAbility里面實(shí)現(xiàn)?
這是因?yàn)榫W(wǎng)絡(luò)下載百分比進(jìn)度很多時(shí)候都是全局通用,如果有需要全局配置的自定義展示方案。推薦在EntryAbility里面,往ImageKnife的setDefaultLifeCycle函數(shù)中注入,即可將ImageKnifeComponent中的默認(rèn)繪制方案替換。
在這里我們實(shí)現(xiàn)的效果如下圖所示。


點(diǎn)4:通用屬性方法和屬性已經(jīng)支持鏈?zhǔn)秸{(diào)用
比如下面的代碼的寬高已經(jīng)不用設(shè)置在ImageKnifeOption對(duì)象中了,直接在自定義組件下方鏈?zhǔn)秸{(diào)用設(shè)置即可。
import {ImageKnifeComponent,ImageKnifeOption,ImageKnifeDrawFactory} from '@ohos/imageknife'
@Entry
@Component
struct Index {
@State imageKnifeOption1: ImageKnifeOption =
{ // 加載一張本地的png資源(必選)
loadSrc: $r('app.media.pngSample'),
};
build() {
Scroll() {
Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
ImageKnifeComponent({ imageKnifeOption: this.imageKnifeOption1 })
.width(300) // 自定義組件已支持設(shè)置通用屬性和事件,這里寬高設(shè)置放在鏈?zhǔn)秸{(diào)用中完成
.height(300)
}
}
.width('100%')
.height('100%')
}
}

點(diǎn)5:如何在列表使用
支持列表使用圖片加載,只需要維護(hù)一個(gè)@State options:Array = []
對(duì)象即可
import {ImageKnifeOption,ImageKnifeComponent} from '@ohos/imageknife'
@Entry
@Component
struct BasicTestFeatureAbilityPage {
urls=[
"http://e.hiphotos.baidu.com/image/pic/item/a1ec08fa513d2697e542494057fbb2fb4316d81e.jpg",
"http://c.hiphotos.baidu.com/image/pic/item/30adcbef76094b36de8a2fe5a1cc7cd98d109d99.jpg",
"http://h.hiphotos.baidu.com/image/pic/item/7c1ed21b0ef41bd5f2c2a9e953da81cb39db3d1d.jpg",
"http://g.hiphotos.baidu.com/image/pic/item/55e736d12f2eb938d5277fd5d0628535e5dd6f4a.jpg",
"http://e.hiphotos.baidu.com/image/pic/item/4e4a20a4462309f7e41f5cfe760e0cf3d6cad6ee.jpg",
]
@State options:Array = []
aboutToAppear(){
this.options = this.urls.map((url)=>{
return {
loadSrc:url
}
})
console.log('this.options length ='+this.options.length)
}
build() {
Stack({ alignContent: Alignment.TopStart }) {
Column() {
List({ space: 20, initialIndex: 0 }) {
ForEach(this.options, (item) => {
ListItem() {
ImageKnifeComponent({imageKnifeOption:item}).width(300).height(300)
}
}, item => item.loadSrc)
}
.listDirection(Axis.Vertical) // 排列方向
.divider({ strokeWidth: 2, color: 0xFFFFFF, startMargin: 20, endMargin: 20 }) // 每行之間的分界線
.edgeEffect(EdgeEffect.None) // 滑動(dòng)到邊緣無(wú)效果
.chainAnimation(false) // 聯(lián)動(dòng)特效關(guān)閉
}.width('100%')
}.width('100%').height('100%').backgroundColor(0xDCDCDC).padding({ top: 5 })
}
}

渲染層重構(gòu)的總結(jié)

綜上可知,此次重構(gòu)渲染層,一共新增了6個(gè)基礎(chǔ)能力,適配了IDE最新版特性自定義組件可鏈?zhǔn)秸{(diào)用通用屬性和方法,并且采用適合的設(shè)計(jì)模式保留了自定義組件繪制部分的拓展能力。展示了部分常用場(chǎng)景下使用代碼的方式,幫助開(kāi)發(fā)者更快上手開(kāi)發(fā)。
最后在OpenHarmony不斷推陳出新之際,三方庫(kù)ImageKnife也應(yīng)該激流勇進(jìn),不斷地提升組件的實(shí)用性和適用性,為開(kāi)發(fā)者創(chuàng)造一個(gè)良好的開(kāi)發(fā)體驗(yàn)。
我們將會(huì)持續(xù)更新ImageKnife三方庫(kù),后續(xù)會(huì)切換成GPU來(lái)渲染圖片變換能力,不斷進(jìn)行性能優(yōu)化,提升ImageKnife三方庫(kù)。
同時(shí)也歡迎開(kāi)發(fā)者使用和提issue。




原文標(biāo)題:基于ArkUI框架開(kāi)發(fā)-ImageKnife渲染層重構(gòu)

文章出處:【微信公眾號(hào):OpenAtom OpenHarmony】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 鴻蒙
    +關(guān)注

    關(guān)注

    60

    文章

    2623

    瀏覽量

    44077
  • OpenHarmony
    +關(guān)注

    關(guān)注

    29

    文章

    3856

    瀏覽量

    18657

原文標(biāo)題:基于ArkUI框架開(kāi)發(fā)-ImageKnife渲染層重構(gòu)

文章出處:【微信號(hào):gh_e4f28cfa3159,微信公眾號(hào):OpenAtom OpenHarmony】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    【HarmonyOS next】ArkUI-X休閑娛樂(lè)搞笑日歷【基礎(chǔ)】

    引言 在跨平臺(tái)應(yīng)用開(kāi)發(fā)中,網(wǎng)絡(luò)圖片在不同設(shè)備上的適配展示是常見(jiàn)挑戰(zhàn)。本文將基于HarmonyOS next的ArkUI-X框架,通過(guò)一個(gè)休閑娛樂(lè)日歷應(yīng)用,展示如何實(shí)現(xiàn)網(wǎng)絡(luò)圖片在華為和iOS設(shè)備上
    發(fā)表于 06-28 22:07

    【HarmonyOS next】ArkUI-X休閑益智連連看【進(jìn)階】

    一套代碼雙端運(yùn)行的跨平臺(tái)實(shí)踐 在移動(dòng)應(yīng)用開(kāi)發(fā)中,跨平臺(tái)技術(shù)始終是開(kāi)發(fā)者追求的圣杯。借助ArkUI-X框架,我們僅用一套ArkTS代碼即可實(shí)現(xiàn)應(yīng)用在HarmonyOS和iOS雙端的原生級(jí)
    發(fā)表于 06-28 21:51

    【HarmonyOS next】ArkUI-X新聞熱搜聚合App【進(jìn)階】

    API,展示了多平臺(tái)榜單數(shù)據(jù)并支持網(wǎng)頁(yè)詳情查看。項(xiàng)目采用ArkUI框架開(kāi)發(fā),現(xiàn)通過(guò)ArkUI-X實(shí)現(xiàn)iOS平臺(tái)的無(wú)縫遷移。 1.2 核心技術(shù)棧 HarmonyOS:原生開(kāi)發(fā)平臺(tái)
    發(fā)表于 06-28 21:43

    【HarmonyOS next】ArkUI-X休閑益智兒童拼圖【進(jìn)階】

    一、前言:當(dāng)拼圖遇上跨端開(kāi)發(fā) 最近在開(kāi)發(fā)一款跨平臺(tái)的兒童拼圖游戲時(shí),我深刻體會(huì)到了ArkUI-X框架的威力——同一套代碼竟能同時(shí)在華為Mate60 Pro和iPhone15上流暢運(yùn)行!
    發(fā)表于 06-28 21:41

    【HarmonyOS next】ArkUI-X休閑益智猜字謎【基礎(chǔ)】

    下圖是在iOS中的運(yùn)行效果 下圖是在HarmonyOS中的運(yùn)行效果 今天咱們來(lái)聊聊如何用ArkUI-X這個(gè)新興框架實(shí)現(xiàn)跨端開(kāi)發(fā),通過(guò)一個(gè)猜字謎小游戲帶大家感受它的開(kāi)發(fā)魅力。本文不僅能讓
    發(fā)表于 06-26 20:01

    ArkUI介紹

    ArkUI(方舟UI框架)為應(yīng)用的UI開(kāi)發(fā)提供了完整的基礎(chǔ)設(shè)施,包括簡(jiǎn)潔的UI語(yǔ)法、豐富的UI功能(組件、布局、動(dòng)畫(huà)以及交互事件),以及實(shí)時(shí)界面預(yù)覽工具等,可以支持開(kāi)發(fā)者進(jìn)行可視化界面
    發(fā)表于 06-24 06:41

    UI開(kāi)發(fā)概述

    使用UI開(kāi)發(fā)框架開(kāi)發(fā)應(yīng)用時(shí),主要涉及如下開(kāi)發(fā)過(guò)程。開(kāi)發(fā)者可以先通過(guò)第一個(gè)入門(mén)實(shí)例了解整個(gè)應(yīng)用的UI開(kāi)發(fā)過(guò)程。 任務(wù)簡(jiǎn)介相關(guān)指導(dǎo)學(xué)習(xí)Ark
    發(fā)表于 06-24 06:36

    HarmonyOS NEXT應(yīng)用元服務(wù)布局優(yōu)化ArkUI框架執(zhí)行流程

    一、 ArkUI框架執(zhí)行流程 在使用ArkUI開(kāi)發(fā)中,我們通過(guò)布局組件和基礎(chǔ)組件進(jìn)行界面描述,這些描述會(huì)呈現(xiàn)出一個(gè)組件樹(shù)的結(jié)構(gòu),基礎(chǔ)組件在其中為葉子結(jié)點(diǎn),布局組件則是中間節(jié)點(diǎn),可以把這
    發(fā)表于 06-23 09:41

    ArkUI-X應(yīng)用工程結(jié)構(gòu)說(shuō)明

    簡(jiǎn)介 本文檔配套ArkUI-X,將OpenHarmony ArkUI開(kāi)發(fā)框架擴(kuò)展到不同的OS平臺(tái),比如Android和iOS平臺(tái),讓開(kāi)發(fā)者基
    發(fā)表于 06-19 23:11

    ArkUI-X跨平臺(tái)應(yīng)用改造指南

    ,包含了應(yīng)用的所有UI界面、彈窗、媒體圖片等元素,這些都是能夠被用戶直接感知并進(jìn)行操作的。此是借助HarmonyOS的ArkUI組件以及相關(guān)能力來(lái)進(jìn)行設(shè)計(jì)與開(kāi)發(fā)的,并且ArkUI-X
    發(fā)表于 06-16 23:05

    ArkUI-X在Android平臺(tái)動(dòng)態(tài)化開(kāi)發(fā)指南

    本文介紹如何在Android平臺(tái)進(jìn)行ArkUI-X動(dòng)態(tài)化開(kāi)發(fā),包括動(dòng)態(tài)化目錄規(guī)則及約束。 適用場(chǎng)景 動(dòng)態(tài)化主要包括兩個(gè)典型場(chǎng)景: 場(chǎng)景1:框架動(dòng)態(tài)化,為了降低應(yīng)用ROM體積占用,及滿足動(dòng)態(tài)升級(jí)
    發(fā)表于 06-15 23:33

    ArkUI-X框架LogInterface使用指南

    WARN/INFO/DEBUG),存在應(yīng)用崩潰的風(fēng)險(xiǎn)。 注意:開(kāi)發(fā)者使用時(shí)注冊(cè),必須位于調(diào)用MyApplication超類的onCreate()方法之后 設(shè)置ArkUI-X框架
    發(fā)表于 06-15 23:20

    ArkUI-X跨平臺(tái)框架接入指南

    ArkUI跨平臺(tái)框架(ArkUI-X)進(jìn)一步將ArkUI開(kāi)發(fā)框架擴(kuò)展到了多個(gè)OS平臺(tái):目前支持O
    發(fā)表于 05-18 18:21

    Get這個(gè)秘籍,鴻蒙原生應(yīng)用頁(yè)面滑動(dòng)絲滑無(wú)比

    問(wèn)題的解決方案,通過(guò)創(chuàng)新技術(shù)手段解決不同技術(shù)棧下的性能瓶頸,為開(kāi)發(fā)者提供更流暢的頁(yè)面渲染體驗(yàn),有效提升鴻蒙應(yīng)用的頁(yè)面滑動(dòng)流暢度。 ArkUI頁(yè)面動(dòng)態(tài)預(yù)加載:兼顧應(yīng)用首頁(yè)速度與滑動(dòng)流暢性 在Ar
    發(fā)表于 03-06 14:41

    華為推出RN/H5多設(shè)備自適應(yīng)組件庫(kù)

    存在大量用跨平臺(tái)框架開(kāi)發(fā)的應(yīng)用,部分頁(yè)面采用React Native(RN)和H5等框架開(kāi)發(fā),這些框架在系統(tǒng)級(jí)的多設(shè)備適配能力上相對(duì)有限,導(dǎo)致在折疊機(jī)、平板等設(shè)備上的適配效率不如ArkUI
    的頭像 發(fā)表于 01-16 14:46 ?807次閱讀