From 8b715efb24b6099b07402304db0738109a33028c Mon Sep 17 00:00:00 2001 From: zgf Date: Tue, 18 Jun 2024 20:02:18 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E5=A2=9E=E5=8A=A0gif=E5=9B=BEduration?= =?UTF-8?q?=E7=9A=84=E9=BB=98=E8=AE=A4=E5=80=BC=EF=BC=8C=E4=BB=A5=E5=8F=8A?= =?UTF-8?q?=E9=BB=98=E8=AE=A4=E6=92=AD=E6=94=BE=E6=AC=A1=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zgf --- CHANGELOG.md | 1 + .../ets/components/imageknife/ImageKnife.ets | 1 + .../imageknife/ImageKnifeComponent.ets | 17 +++++++++++++++-- .../components/imageknife/ImageKnifeData.ets | 1 + .../components/imageknife/utils/gif/GIFFrame.ts | 2 ++ .../imageknife/utils/gif/GIFParseImpl.ets | 10 +++++++++- 6 files changed, 29 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5f1e56f..cd0e222 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ - svg解码宽高单位给位px - 修复复用场景下从内存获取图片后又清空了画布导致图片不显示 - 修复复用场景主图比占位图绘制快后下次不显示占位图问题 +- 增加gif图duration的默认值,以及默认播放次数 ## 2.2.0-rc.2 - ImageKnife支持下采样 diff --git a/library/src/main/ets/components/imageknife/ImageKnife.ets b/library/src/main/ets/components/imageknife/ImageKnife.ets index 26175dc..94b7f8a 100644 --- a/library/src/main/ets/components/imageknife/ImageKnife.ets +++ b/library/src/main/ets/components/imageknife/ImageKnife.ets @@ -808,6 +808,7 @@ export class ImageKnife { let imageKnifeData = ImageKnifeData.createImageGIFFrame(ImageKnifeType.GIFFRAME, data as GIFFrame[]); let requestList: List | undefined = this.executingJobMap.get(request.uuid); LogUtil.info("VISIBLE: taskpool execute done. data as GIFFrame: " + requestList?.length); + imageKnifeData.iterations = data[0].iterations // 组件被销毁会删除请求,因此requestList可能是undefined if(requestList != undefined) { requestList.forEach((requestOption: RequestOption)=>{ diff --git a/library/src/main/ets/components/imageknife/ImageKnifeComponent.ets b/library/src/main/ets/components/imageknife/ImageKnifeComponent.ets index db97ec9..6addda7 100644 --- a/library/src/main/ets/components/imageknife/ImageKnifeComponent.ets +++ b/library/src/main/ets/components/imageknife/ImageKnifeComponent.ets @@ -56,6 +56,8 @@ export struct ImageKnifeComponent { private imageSmoothingEnabled: boolean = true; // 是否是gif图片 private isGif: boolean = false + + private gifPlayTimes: number = 0 defaultLifeCycle: IDrawLifeCycle = { // 展示占位图 @@ -875,7 +877,7 @@ export struct ImageKnifeComponent { this.renderFrames_context = context this.renderFrames_compWidth = compWidth this.renderFrames_compHeight = compHeight - + this.gifPlayTimes = data.iterations this.renderFrames() } } @@ -916,6 +918,13 @@ export struct ImageKnifeComponent { // draw Frame this.drawFrame(this.renderFrames_frames, this.renderFrames_index, this.renderFrames_context, this.renderFrames_compWidth, this.renderFrames_compHeight); // gif播放次数 + if (this.renderFrames_frames != undefined && this.renderFrames_index === (this.renderFrames_frames.length - 1) && this.gifPlayTimes != 0 && this.imageKnifeOption.gif == undefined ) { + this.playTimes++ + if (this.gifPlayTimes == this.playTimes){ + this.imageKnifeOption.autoPlay = false; + this.playTimes = 0 + } + } if (this.renderFrames_frames != undefined && this.renderFrames_index === (this.renderFrames_frames.length - 1) && this.imageKnifeOption.gif != undefined ) { this.playTimes++ if (this.imageKnifeOption.gif.playTimes == this.playTimes){ @@ -961,7 +970,11 @@ export struct ImageKnifeComponent { if (this.renderFrames_frames != undefined && this.renderFrames_index >= this.renderFrames_frames.length) { this.renderFrames_index = 0; } - this.gifTimerId = setTimeout(this.renderFrames, delayTime) + if (delayTime == 0) { + this.gifTimerId = setTimeout(this.renderFrames, 100) + } else { + this.gifTimerId = setTimeout(this.renderFrames, delayTime) + } } } diff --git a/library/src/main/ets/components/imageknife/ImageKnifeData.ets b/library/src/main/ets/components/imageknife/ImageKnifeData.ets index 0f9853b..bffd953 100644 --- a/library/src/main/ets/components/imageknife/ImageKnifeData.ets +++ b/library/src/main/ets/components/imageknife/ImageKnifeData.ets @@ -95,6 +95,7 @@ export class ImageKnifeData { static PNG = 'png'; static BMP = 'bmp'; static WEBP = 'webp'; + iterations: number = 0 waitSaveDisk = false; imageKnifeType: ImageKnifeType | undefined = undefined; drawPixelMap: DrawPixelMap | undefined = undefined; diff --git a/library/src/main/ets/components/imageknife/utils/gif/GIFFrame.ts b/library/src/main/ets/components/imageknife/utils/gif/GIFFrame.ts index 394c313..a6648df 100644 --- a/library/src/main/ets/components/imageknife/utils/gif/GIFFrame.ts +++ b/library/src/main/ets/components/imageknife/utils/gif/GIFFrame.ts @@ -44,4 +44,6 @@ export class GIFFrame { // 表示透明度的可选颜色索引 transparentIndex: number + + iterations?:number } \ No newline at end of file diff --git a/library/src/main/ets/components/imageknife/utils/gif/GIFParseImpl.ets b/library/src/main/ets/components/imageknife/utils/gif/GIFParseImpl.ets index 9c4ea5f..7250564 100644 --- a/library/src/main/ets/components/imageknife/utils/gif/GIFParseImpl.ets +++ b/library/src/main/ets/components/imageknife/utils/gif/GIFParseImpl.ets @@ -67,11 +67,18 @@ export class GIFParseImpl implements IParseGif { } }) let data: GIFFrame[] = []; + let iterations: number = 0 imageSource.createPixelMapList(decodeOpts).then((pixelList: Array) => { //sdk的api接口发生变更:从.getDelayTime() 变为.getDelayTimeList() - imageSource.getDelayTimeList().then(delayTimes => { + imageSource.getDelayTimeList().then(async (delayTimes) => { if (pixelList.length > 0) { let pixelmap1 = pixelList[0]; + try { + let dataTimes = await imageSource.getImageProperty(image.PropertyKey.GIF_LOOP_COUNT) + iterations = Number(dataTimes) + } catch (e) { + iterations = 1 + } pixelmap1.getImageInfo().then(imageInfo => { for (let i = 0; i < pixelList.length; i++) { let frame = new GIFFrame(); @@ -84,6 +91,7 @@ export class GIFParseImpl implements IParseGif { } data.push(frame) } + data[0].iterations = iterations callback(data, undefined) imageSource.release(); }).catch((err: string) => { From ed67b3b198af48ca96836653312dd287a5d8940a Mon Sep 17 00:00:00 2001 From: zgf Date: Wed, 19 Jun 2024 10:36:30 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E5=A2=9E=E5=8A=A0gif=E5=9B=BEduration?= =?UTF-8?q?=E7=9A=84=E9=BB=98=E8=AE=A4=E5=80=BC=EF=BC=8C=E4=BB=A5=E5=8F=8A?= =?UTF-8?q?=E9=BB=98=E8=AE=A4=E6=92=AD=E6=94=BE=E6=AC=A1=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zgf --- .../src/main/ets/pages/testGifPlayTimesPage.ets | 4 ++++ .../src/main/resources/base/media/diamond_1.gif | Bin 0 -> 7416 bytes 2 files changed, 4 insertions(+) create mode 100644 entry/src/main/resources/base/media/diamond_1.gif diff --git a/entry/src/main/ets/pages/testGifPlayTimesPage.ets b/entry/src/main/ets/pages/testGifPlayTimesPage.ets index 38ced1a..f2bbb40 100644 --- a/entry/src/main/ets/pages/testGifPlayTimesPage.ets +++ b/entry/src/main/ets/pages/testGifPlayTimesPage.ets @@ -58,6 +58,10 @@ struct TestGifPlayTimesPage { } ImageKnifeComponent({ imageKnifeOption: this.ImageKnifeOption1 }).width(300).height(300).borderWidth(3) + Text("gif自带默播放一次") + ImageKnifeComponent({ imageKnifeOption: { + loadSrc:$r('app.media.diamond_1') + } }).width(300).height(300).borderWidth(3) } } } diff --git a/entry/src/main/resources/base/media/diamond_1.gif b/entry/src/main/resources/base/media/diamond_1.gif new file mode 100644 index 0000000000000000000000000000000000000000..9bfbc4b32665f18a7a654d9c67993300eb4ac1b0 GIT binary patch literal 7416 zcmVzyo00001b5ch_0Itp) z=>Py6vPnciRCr$PoO!e*M}6PF)$6@)nYYaLW}lHXBaM(W2}Aqs~>%)vHhF_JI}62S==NoXXEK#Zgr%}BGo z_1@b{RnE7nt8aC`zW2Qu$^2nc|Mb1Rch#r9zon{M;K$|1HQ>~MIG5V^{54OjXw)1U zdm(xKZ#}1bKbPnIr*zC&RqAK2II2e1dK!Xk zG(kQuz($WEUoXqT#ttRW(CBRNuqCik!`pLZ1t6(R(H@E5{{J@zcb?V#|5Iw%bA8rT zS14haULR`^IwvJA*|i>eiI1eFu48i>1o`lO<1pgLT#b6THdeA94wXJdOYP;Yb|D|-T7tn|_?c@FqK zz$J^w`dc$kLi!$(T;iTPk7+2|Q8RQ~53KuJI}+z$`QB~ToykM{#WnJPB_ zg+vkvv=kt71oi+3=}<

3;L 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