1.修复ImageKnife绘制部分复杂gif图片,gif图片闪屏显示的问题

Signed-off-by: 明月清风 <2928139825@qq.com>
This commit is contained in:
明月清风 2023-07-27 14:49:31 +08:00
parent af5d79426e
commit 8629370f57
9 changed files with 73 additions and 63 deletions

View File

@ -3,7 +3,7 @@
"bundleName": "com.openharmony.imageknife", "bundleName": "com.openharmony.imageknife",
"vendor": "example", "vendor": "example",
"versionCode": 1000000, "versionCode": 1000000,
"versionName": "1.0.0", "versionName": "2.0.2",
"icon": "$media:app_icon", "icon": "$media:app_icon",
"label": "$string:app_name", "label": "$string:app_name",
"distributedNotificationEnabled": true "distributedNotificationEnabled": true

View File

@ -1,3 +1,13 @@
## 2.0.2
- 修复若干问题:
修复ImageKnife绘制部分复杂gif图片gif图片闪屏显示的问题
适配DevEco Studio 版本4.0 Canary2(4.0.3.312), SDK: API10 (4.0.9.3)
## 2.0.1 ## 2.0.1
- 修复若干问题: - 修复若干问题:

View File

@ -452,7 +452,7 @@ request.skipMemoryCache(true)
在下述版本验证通过: 在下述版本验证通过:
DevEco Studio版本: 4.0Canary1(4.0.3.212), SDK: API10(4.0.8.3) DevEco Studio 版本4.0 Canary2(4.0.3.312), SDK: API10 (4.0.9.3)
## 目录结构 ## 目录结构

View File

@ -1,10 +1,10 @@
{ {
"license": "ISC", "license": "Apache License 2.0",
"devDependencies": {}, "devDependencies": {},
"name": "entry", "name": "entry",
"description": "example description", "description": "example description",
"repository": {}, "repository": {},
"version": "1.0.0", "version": "2.0.2",
"dependencies": { "dependencies": {
"@ohos/imageknife": "file:../imageknife", "@ohos/imageknife": "file:../imageknife",
"@ohos/disklrucache": "^2.0.0" "@ohos/disklrucache": "^2.0.0"

View File

@ -14,7 +14,7 @@
"main": "index.ets", "main": "index.ets",
"repository": "https://gitee.com/openharmony-tpc/ImageKnife", "repository": "https://gitee.com/openharmony-tpc/ImageKnife",
"type": "module", "type": "module",
"version": "2.0.1", "version": "2.0.2",
"dependencies": { "dependencies": {
"@ohos/disklrucache": "^2.0.0", "@ohos/disklrucache": "^2.0.0",
"@ohos/svg": "^2.0.0", "@ohos/svg": "^2.0.0",

View File

@ -18,7 +18,7 @@ import { LruCache } from "../cache/LruCache"
import {EngineKeyFactories} from "../cache/key/EngineKeyFactories" import {EngineKeyFactories} from "../cache/key/EngineKeyFactories"
import {EngineKeyInterface} from "../cache/key/EngineKeyInterface" import {EngineKeyInterface} from "../cache/key/EngineKeyInterface"
import {RequestOption} from "../imageknife/RequestOption" import {RequestOption} from "../imageknife/RequestOption"
import {AsyncCallback} from "../imageknife/interface/asynccallback" import {AsyncCallback} from "../imageknife/interface/AsyncCallback"
import {PlaceHolderManager} from "../imageknife/holder/PlaceHolderManager" import {PlaceHolderManager} from "../imageknife/holder/PlaceHolderManager"
import {RetryHolderManager} from "../imageknife/holder/RetryHolderManager" import {RetryHolderManager} from "../imageknife/holder/RetryHolderManager"
import {ErrorHolderManager} from "../imageknife/holder/ErrorHolderManager" import {ErrorHolderManager} from "../imageknife/holder/ErrorHolderManager"

View File

@ -25,17 +25,12 @@ import { LogUtil } from '../imageknife/utils/LogUtil'
@Component @Component
export struct ImageKnifeComponent { export struct ImageKnifeComponent {
@Watch('watchImageKnifeOption') @ObjectLink imageKnifeOption: ImageKnifeOption; @Watch('watchImageKnifeOption') @ObjectLink imageKnifeOption: ImageKnifeOption;
autoPlay: boolean = true autoPlay: boolean = true
private settings: RenderingContextSettings = new RenderingContextSettings(true) private settings: RenderingContextSettings = new RenderingContextSettings(true)
private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings) private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
private hasDisplayRetryholder = false; private hasDisplayRetryholder = false;
private lastWidth: number = 0 private lastWidth: number = 0
private lastHeight: number = 0 private lastHeight: number = 0
private currentWidth: number = 0 private currentWidth: number = 0
private currentHeight: number = 0 private currentHeight: number = 0
@ -85,6 +80,7 @@ export struct ImageKnifeComponent {
private canvasHasReady: boolean = false; private canvasHasReady: boolean = false;
private firstDrawFlag: boolean = false; private firstDrawFlag: boolean = false;
private onReadyNext: () => void = undefined private onReadyNext: () => void = undefined
build() { build() {
Canvas(this.context) Canvas(this.context)
.width('100%') .width('100%')
@ -250,8 +246,6 @@ export struct ImageKnifeComponent {
} }
} }
configRenderGpu(request: RequestOption) { configRenderGpu(request: RequestOption) {
if (this.imageKnifeOption.enableGpu) { if (this.imageKnifeOption.enableGpu) {
request.enableGPU() request.enableGPU()
@ -676,10 +670,17 @@ export struct ImageKnifeComponent {
if (index >= 1) { if (index >= 1) {
let preFrame = frames[index-1] let preFrame = frames[index-1]
disposal = preFrame.disposalType disposal = preFrame.disposalType
if (disposal === FrameDisposalType.DISPOSE_RestoreBackground) {
const { width, height, left, top } = preFrame.dims;
context.clearRect(left, top, width, height);
} }
} else {
if (disposal === FrameDisposalType.DISPOSE_RestoreBackground) { if (disposal === FrameDisposalType.DISPOSE_RestoreBackground) {
context.clearRect(0, 0, compWidth, compHeight) context.clearRect(0, 0, compWidth, compHeight)
} }
}
let scaleType = (typeof this.imageKnifeOption.mainScaleType == 'number') ? this.imageKnifeOption.mainScaleType : ScaleType.FIT_CENTER let scaleType = (typeof this.imageKnifeOption.mainScaleType == 'number') ? this.imageKnifeOption.mainScaleType : ScaleType.FIT_CENTER
context.save(); context.save();
let frameW = frames[0].dims.left + frames[0].dims.width let frameW = frames[0].dims.left + frames[0].dims.width
@ -725,7 +726,6 @@ export enum ScaleType {
} }
export class ScaleTypeHelper { export class ScaleTypeHelper {
static drawImageWithScaleType(context: CanvasRenderingContext2D, scaleType: ScaleType, source: PixelMap | ImageBitmap, imageWidth: number, imageHeight: number, compWidth: number, compHeight: number, imageOffsetX: number, imageOffsetY: number) { static drawImageWithScaleType(context: CanvasRenderingContext2D, scaleType: ScaleType, source: PixelMap | ImageBitmap, imageWidth: number, imageHeight: number, compWidth: number, compHeight: number, imageOffsetX: number, imageOffsetY: number) {
let scaleW = compWidth / imageWidth let scaleW = compWidth / imageWidth

View File

@ -14,7 +14,7 @@
*/ */
import { DiskStrategy } from "../cache/diskstrategy/DiskStrategy" import { DiskStrategy } from "../cache/diskstrategy/DiskStrategy"
import type { AsyncCallback } from "../imageknife/interface/asynccallback" import type { AsyncCallback } from "../imageknife/interface/AsyncCallback"
import type { AsyncSuccess } from "../imageknife/interface/AsyncSuccess" import type { AsyncSuccess } from "../imageknife/interface/AsyncSuccess"
import type { IAllCacheInfoCallback } from "../imageknife/interface/IAllCacheInfoCallback" import type { IAllCacheInfoCallback } from "../imageknife/interface/IAllCacheInfoCallback"
import { AUTOMATIC } from "../cache/diskstrategy/enum/AUTOMATIC" import { AUTOMATIC } from "../cache/diskstrategy/enum/AUTOMATIC"

View File

@ -6,6 +6,6 @@
"name": "imageknife", "name": "imageknife",
"description": "example description", "description": "example description",
"repository": {}, "repository": {},
"version": "1.0.0", "version": "2.0.2",
"dependencies": {} "dependencies": {}
} }