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

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

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

3天內不再提示

基于ArkUI框架開發-ImageKnife渲染層重構

OpenAtom OpenHarmony ? 來源:未知 ? 2023-04-05 00:25 ? 次閱讀

點擊藍字 ╳ 關注我們


開源項目 OpenHarmony
是每個人的 OpenHarmony

周黎生

OpenHarmony知識體系工作組

ImageKnife是一款圖像加載緩存庫,主要功能特性如下:
支持內存緩存,使用LRUCache算法,對圖片數據進行內存緩存。
支持磁盤緩存,對于下載圖片會保存一份至磁盤當中。
支持進行圖片變換:支持圖像像素源圖片變換效果。
支持用戶配置參數使用:(例如:配置是否開啟一級內存緩存,配置磁盤緩存策略,配置僅使用緩存加載數據,配置圖片變換效果,配置占位圖,配置加載失敗占位圖等)。
更多細節請訪問源碼倉庫地址:
https://gitee.com/openharmony-tpc/ImageKnife

背景說明

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

組件選型,能力對比

首先我們來看看Image組件和Canvas組件對于渲染這一塊的支持情況。


從上表我們可以看出:
Image組件雖然支持了PixelMap的繪制,但是基本沒有繪制控制能力,而且擴展性能力也比較弱,并且渲染過程不可見,也無法對繪制內容進行更多操作。
而Canvas組件屬于更加底層的渲染組件,可以完美地控制繪制內容,并且渲染過程可見,符合了開發者對于擴展性要求較高的定制場景。

重構前后能力對比

重構完成的內容

1.使用canvas組件替代Image組件進行渲染展示圖片。
2.所有圖像數據在渲染層都轉換為PixelMap,方便統一管理和擴展。
3.所有回調節點,統一抽象成接口,方便后續進行擴展,提高代碼可維護性。
4.所有的回調節點繪制的實現,都采用了責任鏈模式,提高了自定義繪制擴展能力。
5.將部分通用方法封裝成工廠方法,減少開發者代碼量。
6.通用方法從配置參數剝離,可采用鏈式調用方式使用這些方法。
7.為了支持列表ImageKnifeOption參數使用@LinkObject修飾,同時ImageKnifeOption類型被@Observed修飾繼承,不可被繼承。

重構中比較重要的點

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


這里每個藍色的小方格都代表著一個數據返回的回調接口,我們需要在這個回調接口,處理接下來內容渲染的展示操作。因為每個回調的流程是固定的,有點像生命周期的流程。所以我這邊抽象成接口IDrawLifeCycle繪制生命周期進行表達。這其實也是為了后面擴展做了準備。

點2:繪制實現采用責任鏈模式
我們支持了用戶配置自定義繪制和全局配置自定義繪制的能力。采用了責任鏈模式實現,用戶參數設置->全局參數設置->自定義組件內部設置。這樣設計的好處就是保留了用戶擴展的能力,用戶可以參與自定義繪制。


點3:提供了ImageKnifeDrawFactory工廠類
在開發者需要進行自定義繪制時,必須實現IDrawLifeCycle的6個接口。為了簡化開發者操作,這里提供了ImageKnifeDrawFactory工廠類。
ImageKnifeDrawFactory里面封裝了圓角、橢圓、百分比下載等實現,簡化用戶操作。當然更多的需求,可以參考該工廠類自行擴展實現。
這里我們提供簡單的場景示例:
場景1:一句代碼,加個圓角效果
代碼如下:
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) // 自定義組件已支持設置通用屬性和事件,這里寬高設置放在鏈式調用中完成
.height(300)
}
}
.width('100%')
.height('100%')
}
}

場景2:全局配置網絡下載百分比效果展示
僅需一句代碼所有網絡圖片加載都能新增網絡下載百分比效果展示。代碼如下:
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);
// 全局配置網絡加載進度條
globalThis.ImageKnife.setDefaultLifeCycle(ImageKnifeDrawFactory.createProgressLifeCycle("#10a5ff", 0.5))
}
}
這里大家可能會問,為什么會將這個IDrawLifeCycle放在EntryAbility里面實現?
這是因為網絡下載百分比進度很多時候都是全局通用,如果有需要全局配置的自定義展示方案。推薦在EntryAbility里面,往ImageKnife的setDefaultLifeCycle函數中注入,即可將ImageKnifeComponent中的默認繪制方案替換。
在這里我們實現的效果如下圖所示。


點4:通用屬性方法和屬性已經支持鏈式調用
比如下面的代碼的寬高已經不用設置在ImageKnifeOption對象中了,直接在自定義組件下方鏈式調用設置即可。
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) // 自定義組件已支持設置通用屬性和事件,這里寬高設置放在鏈式調用中完成
.height(300)
}
}
.width('100%')
.height('100%')
}
}

點5:如何在列表使用
支持列表使用圖片加載,只需要維護一個@State options:Array = []
對象即可
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) // 滑動到邊緣無效果
.chainAnimation(false) // 聯動特效關閉
}.width('100%')
}.width('100%').height('100%').backgroundColor(0xDCDCDC).padding({ top: 5 })
}
}

渲染層重構的總結

綜上可知,此次重構渲染層,一共新增了6個基礎能力,適配了IDE最新版特性自定義組件可鏈式調用通用屬性和方法,并且采用適合的設計模式保留了自定義組件繪制部分的拓展能力。展示了部分常用場景下使用代碼的方式,幫助開發者更快上手開發。
最后在OpenHarmony不斷推陳出新之際,三方庫ImageKnife也應該激流勇進,不斷地提升組件的實用性和適用性,為開發者創造一個良好的開發體驗。
我們將會持續更新ImageKnife三方庫,后續會切換成GPU來渲染圖片變換能力,不斷進行性能優化,提升ImageKnife三方庫。
同時也歡迎開發者使用和提issue。




原文標題:基于ArkUI框架開發-ImageKnife渲染層重構

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

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

    關注

    59

    文章

    2526

    瀏覽量

    43787
  • OpenHarmony
    +關注

    關注

    27

    文章

    3835

    瀏覽量

    18171

原文標題:基于ArkUI框架開發-ImageKnife渲染層重構

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

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    ArkUI-X中Plugin生命周期開發指南

    ; } } } 添加ArkUI-X插件 在StageActivity中,新增addPlugin11+方法,并以字符串形式提供IArkUIXPlugin的實現類的完整包名,用于將開發者實現
    發表于 06-04 22:36

    Kuikly鴻蒙版正式開源 —— 揭秘卓越性能適配之旅

    原生 IDE( Android Studio / VSCode ) 和原生性能分析工具,從業務代碼到框架代碼,使用統一技術棧完成開發,調試和性能分析,從而實現框架開發技術棧自閉環。
    發表于 06-04 16:46

    ArkUI-X添加到現有Android項目中

    本教程主要講述如何利用ArkUI-X SDK完成Android AAR開發,實現基于ArkTS的聲明式開發范式在android平臺顯示。包括: 1.跨平臺Library工程開發介紹 2
    發表于 05-28 22:44

    ArkUI-X跨平臺框架接入指南

    ArkUI跨平臺框架(ArkUI-X)進一步將ArkUI開發框架擴展到了多個OS平臺:目前支持O
    發表于 05-18 18:21

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

    問題的解決方案,通過創新技術手段解決不同技術棧下的性能瓶頸,為開發者提供更流暢的頁面渲染體驗,有效提升鴻蒙應用的頁面滑動流暢度。 ArkUI頁面動態預加載:兼顧應用首頁速度與滑動流暢性 在Ar
    發表于 03-06 14:41

    華為推出RN/H5多設備自適應組件庫

    存在大量用跨平臺框架開發的應用,部分頁面采用React Native(RN)和H5等框架開發,這些框架在系統級的多設備適配能力上相對有限,導致在折疊機、平板等設備上的適配效率不如ArkUI
    的頭像 發表于 01-16 14:46 ?624次閱讀

    AI開發框架集成介紹

    隨著AI應用的廣泛深入,單一框架往往難以滿足多樣化的需求,因此,AI開發框架的集成成為了提升開發效率、促進技術創新的關鍵路徑。以下,是對AI開發
    的頭像 發表于 01-07 15:58 ?477次閱讀

    HarmonyOS開發指導類文檔更新速遞(上)

    、媒體相關能力新增、優化文檔,方便開發者更加高效使用文檔。 ArkUI(方舟UI框架ArkUI(方舟UI框架)是一個簡潔、高性能、支持跨
    的頭像 發表于 12-30 09:50 ?841次閱讀
    HarmonyOS<b class='flag-5'>開發</b>指導類文檔更新速遞(上)

    SSM框架的優缺點分析 SSM在移動端開發中的應用

    :Spring框架是企業型開發使用的成熟的開源框架,能夠節省成本。SSM框架使用起來更加輕快,能夠更合理地分配資源,使用最小的資源完成當前的需求。 節省
    的頭像 發表于 12-16 18:18 ?2132次閱讀

    大語言模型開發框架是什么

    大語言模型開發框架是指用于訓練、推理和部署大型語言模型的軟件工具和庫。下面,AI部落小編為您介紹大語言模型開發框架
    的頭像 發表于 12-06 10:28 ?468次閱讀

    HarmonyOS NEXT應用元服務開發Intents Kit(意圖框架服務)習慣推薦方案開發者測試

    意圖框架開發者提供真機測試能力,即開發者可連接設備進行調測。開發者完成代碼開發之后,功能正式上架應用市場前,可以在HarmonyOS NE
    發表于 11-25 17:37

    JavaWeb框架比較

    JavaWeb框架開發人員提供了構建Web應用程序所需的基礎設施和組件,每種框架都有其獨特的特點和適用場景。以下是對幾種主流JavaWeb框架的比較: Spring MVC 優點
    的頭像 發表于 11-25 09:14 ?601次閱讀

    HarmonyOS NEXT應用元服務開發Intents Kit(意圖框架服務)事件推薦開發者測試

    意圖框架開發者提供真機測試能力,即開發者可連接設備進行調測。開發者完成代碼開發之后,功能正式上架應用市場前,可以在HarmonyOS NE
    發表于 11-18 17:39

    簡述大前端技術棧的渲染原理

    應用開發:Android、iOS、鴻蒙(HarmonyOS)等; ?Web前端框架:Vue、React、Angular等; ?小程序開發:微信小程序、京東小程序、支付寶小程序等; ?跨平臺解決方案:React Native、Fl
    的頭像 發表于 11-07 10:11 ?576次閱讀

    bootstrap框架用什么軟件開發

    Bootstrap是一個流行的前端框架,用于快速開發響應式和移動優先的Web應用程序。它提供了一套預定義的CSS和JavaScript組件,使得開發者可以快速構建出漂亮的用戶界面
    的頭像 發表于 07-11 09:50 ?766次閱讀