From 5d1a9b77fa1799fc7921d167be52e1c9e328276c Mon Sep 17 00:00:00 2001 From: yuandongping Date: Tue, 29 Apr 2025 17:33:48 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=BD=95=E5=83=8F?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yuandongping --- code/Solutions/Media/MultiMedia/README_zh.md | 2 +- .../Media/MultiMedia/build-profile.json5 | 6 +- .../entry/src/main/ets/model/CameraService.ts | 235 ++++++++++-------- .../MultiMedia/entry/src/main/module.json5 | 7 +- .../MultiMedia/hvigor/hvigor-config.json5 | 6 +- .../Media/MultiMedia/lib/CameraPage-1.0.0.hap | Bin 188433 -> 205232 bytes .../Media/MultiMedia/lib/CameraPage-1.0.0.tgz | 4 +- 7 files changed, 144 insertions(+), 116 deletions(-) diff --git a/code/Solutions/Media/MultiMedia/README_zh.md b/code/Solutions/Media/MultiMedia/README_zh.md index 2f37207cc3..4dd7820a56 100644 --- a/code/Solutions/Media/MultiMedia/README_zh.md +++ b/code/Solutions/Media/MultiMedia/README_zh.md @@ -99,7 +99,7 @@ entry/src/main/ets/ 1.本示例仅支持标准系统上运行。 -2.本示例为Stage模型,已适配API version 10版本SDK,版本号:4.0.10.15。 +2.本示例为Stage模型,已适配API version 12版本SDK,版本号:5.0.0。 3.本示例需要使用DevEco Studio NEXT Developer Preview1 (Build Version: 4.1.3.500, built on January 20, 2024)及以上版本才可编译运行。 diff --git a/code/Solutions/Media/MultiMedia/build-profile.json5 b/code/Solutions/Media/MultiMedia/build-profile.json5 index 0b16333dd4..0cdb7f30d4 100644 --- a/code/Solutions/Media/MultiMedia/build-profile.json5 +++ b/code/Solutions/Media/MultiMedia/build-profile.json5 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Huawei Device Co., Ltd. + * Copyright (c) 2022-2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -18,8 +18,8 @@ "signingConfigs": [], "products": [ { - "compileSdkVersion": 10, - "compatibleSdkVersion": 10, + "compileSdkVersion": 12, + "compatibleSdkVersion": 12, "name": "default", "signingConfig": "default", } diff --git a/code/Solutions/Media/MultiMedia/entry/src/main/ets/model/CameraService.ts b/code/Solutions/Media/MultiMedia/entry/src/main/ets/model/CameraService.ts index 6f3704aa4d..6ac06f1ee9 100644 --- a/code/Solutions/Media/MultiMedia/entry/src/main/ets/model/CameraService.ts +++ b/code/Solutions/Media/MultiMedia/entry/src/main/ets/model/CameraService.ts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Huawei Device Co., Ltd. + * Copyright (c) 2022-2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -13,14 +13,15 @@ * limitations under the License. */ -import camera from '@ohos.multimedia.camera' -import deviceInfo from '@ohos.deviceInfo' -import fileio from '@ohos.file.fs' -import image from '@ohos.multimedia.image' -import media from '@ohos.multimedia.media' -import userFileManager from '@ohos.filemanagement.userFileManager' -import Logger from '../model/Logger' -import MediaUtils, { FileType } from '../model/MediaUtils' +import camera from '@ohos.multimedia.camera'; +import deviceInfo from '@ohos.deviceInfo'; +import fileio from '@ohos.file.fs'; +import image from '@ohos.multimedia.image'; +import media from '@ohos.multimedia.media'; +import userFileManager from '@ohos.filemanagement.userFileManager'; +import Logger from '../model/Logger'; +import MediaUtils, { FileType } from '../model/MediaUtils'; +import { Size } from '@kit.ArkUI'; const CameraMode = { MODE_PHOTO: 0, // 拍照模式 @@ -33,25 +34,26 @@ const CameraSize = { } export default class CameraService { - private tag: string = 'CameraService' - private context: any = undefined - private mediaUtil: MediaUtils = undefined - private cameraManager: camera.CameraManager = undefined - private cameras: Array = undefined - private cameraId: string = '' - private cameraInput: camera.CameraInput = undefined - private previewOutput: camera.PreviewOutput = undefined - private photoOutPut: camera.PhotoOutput = undefined - private captureSession: camera.CaptureSession = undefined - private mReceiver: image.ImageReceiver = undefined - private photoUri: string = '' - private fileAsset: userFileManager.FileAsset = undefined - private fd: number = -1 - private curMode = CameraMode.MODE_PHOTO - private videoRecorder: media.VideoRecorder = undefined - private videoOutput: camera.VideoOutput = undefined - private handleTakePicture: (photoUri: string) => void = undefined - private cameraOutputCapability: camera.CameraOutputCapability = undefined + private tag: string = 'CameraService'; + private context: any = undefined; + private mediaUtil: MediaUtils = undefined; + private cameraManager: camera.CameraManager = undefined; + private cameras: Array = undefined; + private cameraId: string = ''; + private cameraInput: camera.CameraInput = undefined; + private previewOutput: camera.PreviewOutput = undefined; + private photoOutPut: camera.PhotoOutput = undefined; + private captureSession: camera.CaptureSession = undefined; + private mReceiver: image.ImageReceiver = undefined; + private photoUri: string = ''; + private fileAsset: userFileManager.FileAsset = undefined; + private fd: number = -1; + private curMode = CameraMode.MODE_PHOTO; + private videoRecorder: media.VideoRecorder = undefined; + private videoOutput: camera.VideoOutput = undefined; + private handleTakePicture: (photoUri: string) => void = undefined; + private cameraOutputCapability: camera.CameraOutputCapability = undefined; + private previewSize: Size = undefined; private videoConfig: any = { audioSourceType: 1, videoSourceType: 0, @@ -75,7 +77,7 @@ export default class CameraService { }, maxSize: 10000, maxDuration: 10000 - } + }; constructor(context: any) { this.context = context @@ -125,44 +127,45 @@ export default class CameraService { } async initCamera(surfaceId: string) { - Logger.info(this.tag, 'initCamera') - await this.releaseCamera() - Logger.info(this.tag, `deviceInfo.deviceType = ${deviceInfo.deviceType}`) + Logger.info(this.tag, 'initCamera'); + await this.releaseCamera(); + Logger.info(this.tag, `deviceInfo.deviceType = ${deviceInfo.deviceType}`); if (deviceInfo.deviceType === 'default') { - this.videoConfig.videoSourceType = 1 + this.videoConfig.videoSourceType = 1; } else { - this.videoConfig.videoSourceType = 0 + this.videoConfig.videoSourceType = 0; } - this.cameraManager = camera.getCameraManager(this.context) - Logger.info(this.tag, 'getCameraManager') - this.cameras = this.cameraManager.getSupportedCameras() - Logger.info(this.tag, `get cameras ${this.cameras.length}`) + this.cameraManager = camera.getCameraManager(this.context); + Logger.info(this.tag, 'getCameraManager'); + this.cameras = this.cameraManager.getSupportedCameras(); + Logger.info(this.tag, `get cameras ${this.cameras.length}`); if (this.cameras.length === 0) { - Logger.info(this.tag, 'cannot get cameras') - return + Logger.info(this.tag, 'cannot get cameras'); + return; } - let cameraDevice = this.cameras[0] - this.cameraInput = this.cameraManager.createCameraInput(cameraDevice) - this.cameraInput.open() - Logger.info(this.tag, 'createCameraInput') - this.cameraOutputCapability = this.cameraManager.getSupportedOutputCapability(cameraDevice) - let previewProfile = this.cameraOutputCapability.previewProfiles[0] - this.previewOutput = this.cameraManager.createPreviewOutput(previewProfile, surfaceId) - Logger.info(this.tag, 'createPreviewOutput') - let mSurfaceId = await this.mReceiver.getReceivingSurfaceId() - let profile = this.cameraOutputCapability.photoProfiles[0] - this.photoOutPut = this.cameraManager.createPhotoOutput(profile, mSurfaceId) - this.captureSession = this.cameraManager.createCaptureSession() - Logger.info(this.tag, 'createCaptureSession') - this.captureSession.beginConfig() - Logger.info(this.tag, 'beginConfig') - this.captureSession.addInput(this.cameraInput) - this.captureSession.addOutput(this.previewOutput) - this.captureSession.addOutput(this.photoOutPut) - await this.captureSession.commitConfig() - await this.captureSession.start() - Logger.info(this.tag, 'captureSession start') + let cameraDevice = this.cameras[0]; + this.cameraInput = this.cameraManager.createCameraInput(cameraDevice); + this.cameraInput.open(); + Logger.info(this.tag, 'createCameraInput'); + this.cameraOutputCapability = this.cameraManager.getSupportedOutputCapability(cameraDevice, camera.SceneMode.NORMAL_VIDEO); + let previewProfile = this.cameraOutputCapability.previewProfiles[0]; + this.previewSize = previewProfile.size; + this.previewOutput = this.cameraManager.createPreviewOutput(previewProfile, surfaceId); + Logger.info(this.tag, 'createPreviewOutput'); + let mSurfaceId = await this.mReceiver.getReceivingSurfaceId(); + let profile = this.cameraOutputCapability.photoProfiles[0]; + this.photoOutPut = this.cameraManager.createPhotoOutput(profile, mSurfaceId); + this.captureSession = this.cameraManager.createCaptureSession(); + Logger.info(this.tag, 'createCaptureSession'); + this.captureSession.beginConfig(); + Logger.info(this.tag, 'beginConfig'); + this.captureSession.addInput(this.cameraInput); + this.captureSession.addOutput(this.previewOutput); + this.captureSession.addOutput(this.photoOutPut); + await this.captureSession.commitConfig(); + await this.captureSession.start(); + Logger.info(this.tag, 'captureSession start'); } setTakePictureCallback(callback) { @@ -189,64 +192,90 @@ export default class CameraService { } async startVideo() { - Logger.info(this.tag, 'startVideo begin') - await this.captureSession.stop() - this.captureSession.beginConfig() + Logger.info(this.tag, 'startVideo begin'); + await this.captureSession.stop(); + this.captureSession.beginConfig(); if (this.curMode === CameraMode.MODE_PHOTO) { - this.curMode = CameraMode.MODE_VIDEO + this.curMode = CameraMode.MODE_VIDEO; if (this.photoOutPut) { - this.captureSession.removeOutput(this.photoOutPut) - this.photoOutPut.release() + try { + this.captureSession.removeOutput(this.photoOutPut); + this.photoOutPut.release(); + } catch (err) { + Logger.error(this.tag, 'remove photoOutPut error: ' + JSON.stringify(err)); + } } } else { if (this.videoOutput) { - this.captureSession.removeOutput(this.videoOutput) + try { + this.captureSession.removeOutput(this.videoOutput); + } catch (err) { + Logger.error(this.tag, 'remove videoOutput error: ' + JSON.stringify(err)); + } } } if (this.videoOutput) { - this.captureSession.removeOutput(this.videoOutput) - await this.videoOutput.release() + try { + this.captureSession.removeOutput(this.videoOutput); + await this.videoOutput.release(); + } catch (err) { + Logger.error(this.tag, 'remove videoOutput error: ' + JSON.stringify(err)); + } } - this.fileAsset = await this.mediaUtil.createAndGetUri(FileType.VIDEO) - this.fd = await this.mediaUtil.getFdPath(this.fileAsset) - this.videoRecorder = await media.createVideoRecorder() - this.videoConfig.url = `fd://${this.fd}` - await this.videoRecorder.prepare(this.videoConfig) - let videoId = await this.videoRecorder.getInputSurface() + this.fileAsset = await this.mediaUtil.createAndGetUri(FileType.VIDEO); + this.fd = await this.mediaUtil.getFdPath(this.fileAsset); + this.videoRecorder = await media.createVideoRecorder(); + this.videoConfig.url = `fd://${this.fd}`; + this.videoConfig.profile.videoFrameWidth = this.previewSize.width; + this.videoConfig.profile.videoFrameHeight = this.previewSize.height; + await this.videoRecorder.prepare(this.videoConfig); + let videoId = await this.videoRecorder.getInputSurface(); let profile = this.cameraOutputCapability.videoProfiles[0]; - this.videoOutput = this.cameraManager.createVideoOutput(profile, videoId) - this.captureSession.addOutput(this.videoOutput) - await this.captureSession.commitConfig() - await this.captureSession.start() - await this.videoOutput.start() - await this.videoRecorder.start() - Logger.info(this.tag, 'startVideo end') + this.videoOutput = this.cameraManager.createVideoOutput(profile, videoId); + this.captureSession.addOutput(this.videoOutput); + try { + await this.captureSession.commitConfig(); + await this.captureSession.start(); + await this.videoOutput.start(); + await this.videoRecorder.start(); + } catch (err) { + Logger.error(this.tag, 'record start error: ' + JSON.stringify(err)); + } + Logger.info(this.tag, 'startVideo end'); } async stopVideo() { - Logger.info(this.tag, 'stopVideo called') - await this.videoRecorder.stop() - await this.videoOutput.stop() - await this.videoRecorder.release() - await this.fileAsset.close(this.fd) + Logger.info(this.tag, 'stopVideo called'); + try { + await this.videoRecorder.stop(); + await this.videoOutput.stop(); + await this.videoRecorder.release(); + await this.fileAsset.close(this.fd); + } catch (err) { + Logger.error(this.tag, 'stopVideo error: ' + JSON.stringify(err)); + } } async releaseCamera() { - Logger.info(this.tag, 'releaseCamera') - if (this.cameraInput) { - await this.cameraInput.close() - } - if (this.previewOutput) { - await this.previewOutput.release() - } - if (this.photoOutPut) { - await this.photoOutPut.release() - } - if (this.videoOutput) { - await this.videoOutput.release() - } - if (this.captureSession) { - await this.captureSession.release() + Logger.info(this.tag, 'releaseCamera'); + try { + if (this.cameraInput) { + await this.cameraInput.close(); + } + if (this.previewOutput) { + await this.previewOutput.release(); + } + if (this.photoOutPut) { + await this.photoOutPut.release(); + } + if (this.videoOutput) { + await this.videoOutput.release(); + } + if (this.captureSession) { + await this.captureSession.release(); + } + } catch (err) { + Logger.error(this.tag, 'releaseCamera error: ' + JSON.stringify(err)); } } } \ No newline at end of file diff --git a/code/Solutions/Media/MultiMedia/entry/src/main/module.json5 b/code/Solutions/Media/MultiMedia/entry/src/main/module.json5 index 2cafdd31e4..fe361512ae 100644 --- a/code/Solutions/Media/MultiMedia/entry/src/main/module.json5 +++ b/code/Solutions/Media/MultiMedia/entry/src/main/module.json5 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Huawei Device Co., Ltd. + * Copyright (c) 2022-2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -27,15 +27,14 @@ "deliveryWithInstall": true, "installationFree": false, "pages": "$profile:main_pages", - "uiSyntax": "ets", "abilities": [ { "name": "MainAbility", - "srcEntrance": "./ets/MainAbility/MainAbility.ts", + "srcEntry": "./ets/MainAbility/MainAbility.ts", "description": "$string:MainAbility_desc", "icon": "$media:icon", "label": "$string:MainAbility_label", - "visible": true, + "exported": true, "launchType": "singleton", "startWindowIcon": "$media:icon", "startWindowBackground": "$color:white", diff --git a/code/Solutions/Media/MultiMedia/hvigor/hvigor-config.json5 b/code/Solutions/Media/MultiMedia/hvigor/hvigor-config.json5 index 9dda70c28b..7f3034e8a4 100644 --- a/code/Solutions/Media/MultiMedia/hvigor/hvigor-config.json5 +++ b/code/Solutions/Media/MultiMedia/hvigor/hvigor-config.json5 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Huawei Device Co., Ltd. + * Copyright (c) 2022-2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -13,8 +13,8 @@ * limitations under the License. */ { - "hvigorVersion": "4.0.2", + "hvigorVersion": "4.1.2", "dependencies": { - "@ohos/hvigor-ohos-plugin": "4.0.2" + "@ohos/hvigor-ohos-plugin": "4.1.2" } } \ No newline at end of file diff --git a/code/Solutions/Media/MultiMedia/lib/CameraPage-1.0.0.hap b/code/Solutions/Media/MultiMedia/lib/CameraPage-1.0.0.hap index 01c91b5e651579d15023eddcfe18e1d4b57521a2..d100ca5611b003357856c8415a261069fa4c8645 100644 GIT binary patch delta 45076 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 delta 74160 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

9%9I!vIO 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 F_kY9qTj2lz diff --git a/code/Solutions/Media/MultiMedia/lib/CameraPage-1.0.0.tgz b/code/Solutions/Media/MultiMedia/lib/CameraPage-1.0.0.tgz index 51ec9eeeab..196b6271dd 100644 --- a/code/Solutions/Media/MultiMedia/lib/CameraPage-1.0.0.tgz +++ b/code/Solutions/Media/MultiMedia/lib/CameraPage-1.0.0.tgz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9faa526ab4c7fc32a4516fad0826b5569b78bdcb2b3fbb247404ffece345e8a2 -size 75600 +oid sha256:33d1b3ec43c014912f929cd730e99570dec772fc162a5a1d18b67469f9340dd1 +size 75237 -- Gitee From c8d9035e175faf61db0eebb1b418c8d3f75cb1ff Mon Sep 17 00:00:00 2001 From: kelinyang Date: Sat, 3 May 2025 20:12:57 +0800 Subject: [PATCH 2/6] =?UTF-8?q?displaySync=E5=92=8CdisplaySoloist=E8=B5=84?= =?UTF-8?q?=E6=96=99=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: kelinyang --- .../DisplaySoloist/entry/src/main/ets/pages/Index.ets | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/BasicFeature/Graphics/DisplaySoloist/entry/src/main/ets/pages/Index.ets b/code/BasicFeature/Graphics/DisplaySoloist/entry/src/main/ets/pages/Index.ets index 118ba0102d..7f71e4a843 100644 --- a/code/BasicFeature/Graphics/DisplaySoloist/entry/src/main/ets/pages/Index.ets +++ b/code/BasicFeature/Graphics/DisplaySoloist/entry/src/main/ets/pages/Index.ets @@ -84,7 +84,7 @@ struct Index { } }).margin(4) - XComponent({ id: 'xcomponentId30', type: 'surface', libraryname: 'entry' }) + XComponent({ id: 'xcomponentId30', type: XComponentType.SURFACE, libraryname: 'entry' }) .onLoad((xComponentContext) => { this.xComponentContext1 = xComponentContext as XComponentContext; }).width('640px') @@ -110,7 +110,7 @@ struct Index { } }).margin(4) - XComponent({ id: 'xcomponentId60', type: 'surface', libraryname: 'entry' }) + XComponent({ id: 'xcomponentId60', type: XComponentType.SURFACE, libraryname: 'entry' }) .onLoad((xComponentContext) => { this.xComponentContext2 = xComponentContext as XComponentContext; }).width('640px') @@ -136,7 +136,7 @@ struct Index { } }).margin(4) - XComponent({ id: 'xcomponentId120', type: 'surface', libraryname: 'entry' }) + XComponent({ id: 'xcomponentId120', type: XComponentType.SURFACE, libraryname: 'entry' }) .onLoad((xComponentContext) => { this.xComponentContext3 = xComponentContext as XComponentContext; }).width('640px') -- Gitee From 12a53f8106eedc6b6fe58d27529e412cc066b240 Mon Sep 17 00:00:00 2001 From: yuandongping Date: Tue, 6 May 2025 14:16:33 +0800 Subject: [PATCH 3/6] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=8F=82=E6=95=B0?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E5=8F=96=E6=B6=88=E5=90=8E=E4=BB=8D=E8=83=BD?= =?UTF-8?q?=E4=BF=9D=E5=AD=98=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yuandongping --- .../src/main/ets/pages/ImageEditPage.ets | 123 +++++++++++------- 1 file changed, 79 insertions(+), 44 deletions(-) diff --git a/code/BasicFeature/Media/ImageEffect/entry/src/main/ets/pages/ImageEditPage.ets b/code/BasicFeature/Media/ImageEffect/entry/src/main/ets/pages/ImageEditPage.ets index 5d7854d1b5..94aa5fe954 100644 --- a/code/BasicFeature/Media/ImageEffect/entry/src/main/ets/pages/ImageEditPage.ets +++ b/code/BasicFeature/Media/ImageEffect/entry/src/main/ets/pages/ImageEditPage.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2024-2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -13,12 +13,34 @@ * limitations under the License. */ -import imageEffect from 'libentry.so' +import imageEffect from 'libentry.so'; import image from '@ohos.multimedia.image'; import { ImageUtils } from '../utils/ImageUtils'; import { fileUri } from '@kit.CoreFileKit'; import fs from '@ohos.file.fs'; +interface FilterDataType { + brightnessSetValue: number, + brightnessSelect: boolean, + contrastSetValue: number, + contrastSelect: boolean, + cropSetValue: number, + cropSelect: boolean, + customSetValue: number, + customSelect: boolean +} + +const DEFAULT_FILTER_DATA: FilterDataType = { + brightnessSetValue: 100, + brightnessSelect: true, + contrastSetValue: 0, + contrastSelect: false, + cropSetValue: 100, + cropSelect: false, + customSetValue: 0, + customSelect: false +}; + @Entry @Component struct ImageEditPage { @@ -26,16 +48,9 @@ struct ImageEditPage { settingBtn: Resource = $r('app.media.ic_public_settings'); @Provide pixelMap: image.PixelMap | undefined = undefined; @Provide displayPixelMap: image.PixelMap | undefined = undefined; - @State brightnessSetValue: number = 100; - @State brightnessSelect: boolean = true; - @State contrastSetValue: number = 0; - @State contrastSelect: boolean = false; - @State cropSetValue: number = 100; - @State cropSelect: boolean = false; - @State customSetValue: number = 0; - @State customSelect: boolean = false; @State filterOptions: Array> = []; @State filterInfo: string = ""; + @State nowSelectedData: FilterDataType = DEFAULT_FILTER_DATA; aboutToAppear(): void { console.info(`${this.tag} aboutToAppear called`); @@ -99,6 +114,7 @@ struct ImageEditPage { Column() { Row() { Button("Reset").id("btn_reset").onClick(() => { + this.resetParams(); this.pixelInit(); }).width(100).margin({ left: 3, right: 3, top: 3, bottom: 6 }) @@ -137,31 +153,32 @@ struct ImageEditPage { private confirmInfo() { this.filterOptions = []; - if (this.brightnessSelect) { + if (this.nowSelectedData.brightnessSelect) { let brightnessArray: (string | number)[] = []; - brightnessArray.push("Brightness", this.brightnessSetValue); + brightnessArray.push("Brightness", this.nowSelectedData.brightnessSetValue); this.filterOptions.push(brightnessArray); } - if (this.contrastSelect) { + if (this.nowSelectedData.contrastSelect) { let contrastArray: (string | number)[] = []; - contrastArray.push("Contrast", this.contrastSetValue); + contrastArray.push("Contrast", this.nowSelectedData.contrastSetValue); this.filterOptions.push(contrastArray); } - if (this.cropSelect) { + if (this.nowSelectedData.cropSelect) { let cropArray: (string | number)[] = []; - cropArray.push("Crop", this.cropSetValue); + cropArray.push("Crop", this.nowSelectedData.cropSetValue); this.filterOptions.push(cropArray); } - if (this.customSelect) { + if (this.nowSelectedData.customSelect) { let customArray: (string | number)[] = []; - customArray.push("CustomBrightness", this.customSetValue); + customArray.push("CustomBrightness", this.nowSelectedData.customSetValue); this.filterOptions.push(customArray); } } private async doApply(): Promise { this.confirmInfo(); - if (this.brightnessSelect || this.contrastSelect || this.cropSelect || this.customSelect) { + if (this.nowSelectedData.brightnessSelect || this.nowSelectedData.contrastSelect || + this.nowSelectedData.cropSelect || this.nowSelectedData.customSelect) { await this.doSavePixel(); let filePath = getContext().filesDir + "/test.jpg"; imageEffect.apply(filePath, [...this.filterOptions]); @@ -169,6 +186,10 @@ struct ImageEditPage { } } + resetParams() { + this.nowSelectedData = DEFAULT_FILTER_DATA; + } + private async pixelInit(): Promise { this.displayPixelMap?.release(); this.displayPixelMap = await ImageUtils.getInstance().getPixelMap($r('app.media.ic_1080x1920')) @@ -179,15 +200,8 @@ struct ImageEditPage { cancel: this.onCancel, confirm: this.onAccept, filterOptions: $filterOptions, - brightnessSetValue: $brightnessSetValue, - brightnessSelect: $brightnessSelect, - contrastSetValue: $contrastSetValue, - contrastSelect: $contrastSelect, - cropSetValue: $cropSetValue, - cropSelect: $cropSelect, - customSetValue: $customSetValue, - customSelect: $customSelect, filterInfo: $filterInfo, + nowSelectedData: $nowSelectedData }), cancel: this.existApp, autoCancel: true, @@ -197,8 +211,9 @@ struct ImageEditPage { console.info(`Callback when the cancel button is clicked`); } - onAccept() { + onAccept(nowSelectedData: FilterDataType) { console.info(`Callback when the confirm button is clicked`); + this.nowSelectedData = nowSelectedData; } existApp() { @@ -208,23 +223,35 @@ struct ImageEditPage { @CustomDialog struct CustomDialogExample { - @Link brightnessSetValue: number - @Link brightnessSelect: boolean - @Link contrastSetValue: number - @Link contrastSelect: boolean - @Link cropSetValue: number - @Link cropSelect: boolean - @Link customSetValue: number - @Link customSelect: boolean - @Link filterOptions: Array> + @State brightnessSetValue: number = 100; + @State brightnessSelect: boolean = true; + @State contrastSetValue: number = 0; + @State contrastSelect: boolean = false; + @State cropSetValue: number = 100; + @State cropSelect: boolean = false; + @State customSetValue: number = 0; + @State customSelect: boolean = false; + @Link filterOptions: Array>; @Link filterInfo: string; + @Link nowSelectedData: FilterDataType; controller: CustomDialogController; cancel: () => void = () => { + }; + confirm: (nowSelectedData: FilterDataType) => void = (nowSelectedData: FilterDataType) => { + }; + @State formatList: Array = ["Format:default", "Format:rgba_8888", "Format:nv21", "Format:nv12"]; + @State handlePopup: boolean = false; + + aboutToAppear(): void { + this.brightnessSetValue = this.nowSelectedData.brightnessSetValue; + this.brightnessSelect = this.nowSelectedData.brightnessSelect; + this.contrastSetValue = this.nowSelectedData.contrastSetValue; + this.contrastSelect = this.nowSelectedData.contrastSelect; + this.cropSetValue = this.nowSelectedData.cropSetValue; + this.cropSelect = this.nowSelectedData.cropSelect; + this.customSetValue = this.nowSelectedData.customSetValue; + this.customSelect = this.nowSelectedData.customSelect; } - confirm: () => void = () => { - } - @State formatList: Array = ["Format:default", "Format:rgba_8888", "Format:nv21", "Format:nv12"] - @State handlePopup: boolean = false @Builder FilterInfoMenu() { @@ -480,9 +507,17 @@ struct CustomDialogExample { .id("btn_dialog_cancel") Button($r('app.string.btn_confirm')) .onClick(() => { - - this.controller.close() - this.confirm() + this.controller.close(); + this.confirm({ + brightnessSetValue: this.brightnessSetValue, + brightnessSelect: this.brightnessSelect, + contrastSetValue: this.contrastSetValue, + contrastSelect: this.contrastSelect, + cropSetValue: this.cropSetValue, + cropSelect: this.cropSelect, + customSetValue: this.customSetValue, + customSelect: this.customSelect + }); }).backgroundColor(0xffffff) .fontColor(Color.Red) .id("btn_dialog_confirm") -- Gitee From 4a0a85ff2abb46d47e34c312ab36dd906123196e Mon Sep 17 00:00:00 2001 From: kelinyang Date: Tue, 6 May 2025 20:14:58 +0800 Subject: [PATCH 4/6] =?UTF-8?q?displaySync=E5=92=8CdisplaySoloist=E8=B5=84?= =?UTF-8?q?=E6=96=99=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: kelinyang --- .../DisplaySoloist/entry/src/main/ets/pages/Index.ets | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/DocsSample/graphic/DisplaySoloist/entry/src/main/ets/pages/Index.ets b/code/DocsSample/graphic/DisplaySoloist/entry/src/main/ets/pages/Index.ets index ad64905125..69e4c3b1d7 100644 --- a/code/DocsSample/graphic/DisplaySoloist/entry/src/main/ets/pages/Index.ets +++ b/code/DocsSample/graphic/DisplaySoloist/entry/src/main/ets/pages/Index.ets @@ -79,7 +79,7 @@ struct Index { } }).margin(4) - XComponent({ id: 'xcomponentId30', type: 'surface', libraryname: 'entry' }) + XComponent({ id: 'xcomponentId30', type: XComponentType.SURFACE, libraryname: 'entry' }) .onLoad((xComponentContext) => { this.xComponentContext1 = xComponentContext as XComponentContext; }).width('640px') @@ -105,7 +105,7 @@ struct Index { } }).margin(4) - XComponent({ id: 'xcomponentId60', type: 'surface', libraryname: 'entry' }) + XComponent({ id: 'xcomponentId60', type: XComponentType.SURFACE, libraryname: 'entry' }) .onLoad((xComponentContext) => { this.xComponentContext2 = xComponentContext as XComponentContext; }).width('640px') @@ -131,7 +131,7 @@ struct Index { } }).margin(4) - XComponent({ id: 'xcomponentId120', type: 'surface', libraryname: 'entry' }) + XComponent({ id: 'xcomponentId120', type: XComponentType.SURFACE, libraryname: 'entry' }) .onLoad((xComponentContext) => { this.xComponentContext3 = xComponentContext as XComponentContext; }).width('640px') -- Gitee From c92940de77302f2f843c7bd30bc7697ee932667e Mon Sep 17 00:00:00 2001 From: leijiawei Date: Wed, 7 May 2025 16:53:28 +0800 Subject: [PATCH 5/6] git test --- file.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 file.txt diff --git a/file.txt b/file.txt new file mode 100644 index 0000000000..e69de29bb2 -- Gitee From 15461f2e314632c2846280675e8a6219db09cf05 Mon Sep 17 00:00:00 2001 From: leijiawei Date: Wed, 7 May 2025 17:20:50 +0800 Subject: [PATCH 6/6] agin test Signed-off-by: leijiawei --- test.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 test.txt diff --git a/test.txt b/test.txt new file mode 100644 index 0000000000..e69de29bb2 -- Gitee