|
@@ -43,6 +43,10 @@ export struct MultiMediaCollect {
|
|
|
@State isUploading: boolean = false
|
|
|
// 照片列表
|
|
|
@State photoList:DrawingInfo[]=[]
|
|
|
+ //双指缩放的中心点X
|
|
|
+ @State pinchCenterX: number = 0;
|
|
|
+ //双指缩放的中心点Y
|
|
|
+ @State pinchCenterY: number = 0;
|
|
|
// 获取本地live照片
|
|
|
@State commodityPixelMap: PixelMap | null = null;
|
|
|
// 拍照动作是否完成
|
|
@@ -102,7 +106,7 @@ export struct MultiMediaCollect {
|
|
|
if (data?.code !== undefined) {
|
|
|
switch (data.code) {
|
|
|
case 2:
|
|
|
- this.isCapturing = true
|
|
|
+ this.isCapturing = false
|
|
|
this.uploadPhoto(); // 拍照成功
|
|
|
break;
|
|
|
case 3:
|
|
@@ -111,6 +115,10 @@ export struct MultiMediaCollect {
|
|
|
break;
|
|
|
case -1:
|
|
|
console.info(TAG,'连接故障')
|
|
|
+ promptAction.showToast({
|
|
|
+ message: '相机连接失败,请检查usb',
|
|
|
+ duration: 3000,
|
|
|
+ })
|
|
|
break;
|
|
|
case 5:
|
|
|
console.info(TAG,'暂停预览')
|
|
@@ -203,9 +211,9 @@ export struct MultiMediaCollect {
|
|
|
queryFlashMode = async () => {
|
|
|
CommonEventManager.publish("queryflashmode", (err) => {
|
|
|
if (err?.code) {
|
|
|
- console.info(TAG,"Publish openSession err=" + JSON.stringify(err))
|
|
|
+ console.info(TAG,"Publish queryFlashMode err=" + JSON.stringify(err))
|
|
|
} else {
|
|
|
- console.info(TAG,"Publish openSession succeed ")
|
|
|
+ console.info(TAG,"Publish queryFlashMode succeed ")
|
|
|
}
|
|
|
})
|
|
|
}
|
|
@@ -216,6 +224,7 @@ export struct MultiMediaCollect {
|
|
|
if (err?.code) {
|
|
|
console.error(TAG, JSON.stringify(err));
|
|
|
} else {
|
|
|
+ console.info(TAG, "Publish startView succeed");
|
|
|
this.isStopView =false;
|
|
|
this.liveShow();
|
|
|
}
|
|
@@ -256,7 +265,6 @@ export struct MultiMediaCollect {
|
|
|
promptAction.showToast({
|
|
|
message: '相机正在重连中...',
|
|
|
duration: 3000,
|
|
|
- bottom: 500
|
|
|
});
|
|
|
await sleep(3000);
|
|
|
await this.connectCamera()
|
|
@@ -310,11 +318,11 @@ export struct MultiMediaCollect {
|
|
|
console.info(TAG,"Publish stopview err=" + JSON.stringify(err));
|
|
|
} else {
|
|
|
console.info(TAG,"Publish Publish stopview succeed");
|
|
|
- CommonEventManager.publish("shootonly", (err) => {
|
|
|
+ CommonEventManager.publish("shoot", (err) => {
|
|
|
if (err?.code) {
|
|
|
- console.info(TAG,"Publish shootonly error=" + JSON.stringify(err));
|
|
|
+ console.info(TAG,"Publish shoot error=" + JSON.stringify(err));
|
|
|
} else {
|
|
|
- console.info(TAG,"Publish Publish shootonly succeed");
|
|
|
+ console.info(TAG,"Publish Publish shoot succeed");
|
|
|
}
|
|
|
});
|
|
|
}
|
|
@@ -331,15 +339,15 @@ export struct MultiMediaCollect {
|
|
|
console.info(TAG,"Publish Publish stopview succeed");
|
|
|
CommonEventManager.publish(mode, (err) => {
|
|
|
if (err?.code) {
|
|
|
- console.info(TAG,"Publish shootonly error=" + JSON.stringify(err));
|
|
|
+ console.info(TAG,"Publish"+mode+" error=" + JSON.stringify(err));
|
|
|
} else {
|
|
|
- console.info(TAG,"Publish Publish shootonly succeed");
|
|
|
+ console.info(TAG,"Publish "+mode+" succeed");
|
|
|
CommonEventManager.publish("startview", (err) => {
|
|
|
this.isStopView = false;
|
|
|
if (err?.code) {
|
|
|
- console.info(TAG,"Publish shootonly error=" + JSON.stringify(err));
|
|
|
+ console.info(TAG,"Publish startview error=" + JSON.stringify(err));
|
|
|
}else{
|
|
|
- console.info(TAG,"Publish Publish shootonly succeed");
|
|
|
+ console.info(TAG,"Publish Publish startview succeed");
|
|
|
}
|
|
|
})
|
|
|
}
|
|
@@ -351,12 +359,11 @@ export struct MultiMediaCollect {
|
|
|
|
|
|
//上传照片
|
|
|
uploadPhoto=()=>{
|
|
|
+ console.info(TAG,"start upload:");
|
|
|
let imageUri: string = "/data/storage/el2/base/haps/entry/files/image_base64.txt"
|
|
|
try {
|
|
|
uploadInstance.startUploadBase64(imageUri, () => {
|
|
|
- if (this.seqNo) {
|
|
|
- this.loadPhotos()
|
|
|
- }
|
|
|
+ this.loadPhotos()
|
|
|
this.isUploading = false
|
|
|
this.startView();//上传完恢复预览
|
|
|
})
|
|
@@ -364,6 +371,29 @@ export struct MultiMediaCollect {
|
|
|
console.error(TAG,"upload failed:", error.code);
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ private adjustOffsetWithAnimation() {
|
|
|
+ let moveScale = (this.scaleValue-1)/2
|
|
|
+ // const maxOffsetX = 760*moveScale //rk3588
|
|
|
+ // const maxOffsetY = 520*moveScale //rk3588
|
|
|
+ const maxOffsetX = 1635/1.5*moveScale //rk3568
|
|
|
+ const maxOffsetY = 1038/1.5*moveScale //rk3568
|
|
|
+ // 钳制偏移量到合法范围内
|
|
|
+ const clampedX = Math.max(-maxOffsetX, Math.min(maxOffsetX, this.offsetX));
|
|
|
+ const clampedY = Math.max(-maxOffsetY, Math.min(maxOffsetY, this.offsetY));
|
|
|
+
|
|
|
+ // 只有超出边界时才触发动画
|
|
|
+ if (this.offsetX !== clampedX || this.offsetY !== clampedY) {
|
|
|
+ animateTo({
|
|
|
+ duration: 300,
|
|
|
+ curve: Curve.EaseOut
|
|
|
+ }, () => {
|
|
|
+ this.offsetX = clampedX;
|
|
|
+ this.offsetY = clampedY;
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
async aboutToAppear() {
|
|
|
this.loadPhotos();
|
|
|
await this.createSubscriber();
|
|
@@ -545,6 +575,9 @@ export struct MultiMediaCollect {
|
|
|
Image(CommonConstants.PICTURE_URL_PREFIX + this.photoList[this.selectedPhotoIndex].filePath)
|
|
|
.width('100%')
|
|
|
.height('100%')
|
|
|
+ // .onComplete((event) => {
|
|
|
+ // console.info(TAG,"width:"+event!.componentWidth +"height:"+ event!.componentHeight)
|
|
|
+ // }) // 获取Image组件的长宽(除以1.5获取vp)
|
|
|
.objectFit(ImageFit.Fill)
|
|
|
.rotate({ angle: this.rotateAngle })
|
|
|
.scale({ x: this.scaleValue, y: this.scaleValue })
|
|
@@ -552,30 +585,52 @@ export struct MultiMediaCollect {
|
|
|
.translate({ x: this.offsetX, y: this.offsetY })
|
|
|
.gesture(
|
|
|
GestureGroup(GestureMode.Exclusive,
|
|
|
- // 双指缩放手势
|
|
|
+ // 替换原有的 PinchGesture 部分代码
|
|
|
PinchGesture()
|
|
|
- .onActionStart(() => {
|
|
|
- this.lastScale = this.scaleValue
|
|
|
- this.lastOffsetX = this.offsetX
|
|
|
- this.lastOffsetY = this.offsetY
|
|
|
+ .onActionStart((event: GestureEvent) => {
|
|
|
+ this.lastScale = this.scaleValue;
|
|
|
+ this.lastOffsetX = this.offsetX;
|
|
|
+ this.lastOffsetY = this.offsetY;
|
|
|
+ // 记录双指中心点(相对于图片中心)
|
|
|
+ // this.pinchCenterX = event.pinchCenterX - 1230 / 2; //rk3588
|
|
|
+ // this.pinchCenterY = event.pinchCenterY - 780 / 2; //rk3588
|
|
|
+
|
|
|
+ this.pinchCenterX = event.pinchCenterX - 1635 / 2; //rk3568
|
|
|
+ this.pinchCenterY = event.pinchCenterY - 1038 / 2; //rk3568
|
|
|
})
|
|
|
.onActionUpdate((event: GestureEvent) => {
|
|
|
- this.scaleValue = this.lastScale * event.scale
|
|
|
+ const newScale = this.lastScale * event.scale;
|
|
|
+ // 计算缩放中心点相对于图片中心的位置
|
|
|
+ // const currentCenterX = (event.pinchCenterX - 1230 / 2) - this.lastOffsetX; //rk3588
|
|
|
+ // const currentCenterY = (event.pinchCenterY - 780 / 2) - this.lastOffsetY; //rk3588
|
|
|
+
|
|
|
+ const currentCenterX = (event.pinchCenterX - 1635 / 2) - this.lastOffsetX; //rk3568
|
|
|
+ const currentCenterY = (event.pinchCenterY - 1038 / 2) - this.lastOffsetY; //rk3568
|
|
|
+
|
|
|
+ // 计算缩放后的新位置
|
|
|
+ const scaleRatio = newScale / this.lastScale;
|
|
|
+ const newOffsetX = this.lastOffsetX + (currentCenterX * (1 - scaleRatio));
|
|
|
+ const newOffsetY = this.lastOffsetY + (currentCenterY * (1 - scaleRatio));
|
|
|
+
|
|
|
+ this.offsetX = newOffsetX;
|
|
|
+ this.offsetY = newOffsetY;
|
|
|
+ this.scaleValue = newScale;
|
|
|
})
|
|
|
.onActionEnd(() => {
|
|
|
- //缩放最小比例为1
|
|
|
+ // 缩放最小比例为1
|
|
|
if (this.scaleValue < 1) {
|
|
|
- //旋转90°或者270°的最小缩小比例为0.63
|
|
|
+ // 旋转90°或者270°的最小缩小比例为0.73
|
|
|
if(this.rotateAngle==90||this.rotateAngle==270) {
|
|
|
- if(this.scaleValue<0.63){
|
|
|
- this.scaleValue = 0.63
|
|
|
+ if(this.scaleValue<0.73){
|
|
|
+ this.scaleValue = 0.73
|
|
|
}
|
|
|
} else {
|
|
|
this.scaleValue = 1
|
|
|
}
|
|
|
}
|
|
|
- //缩放最大比例为4
|
|
|
- if (this.scaleValue > 4) this.scaleValue = 4
|
|
|
+ // 缩放最大比例为3
|
|
|
+ if (this.scaleValue > 3) this.scaleValue = 3
|
|
|
+ this.adjustOffsetWithAnimation()
|
|
|
}),
|
|
|
|
|
|
// 单指滑动手势
|
|
@@ -595,25 +650,8 @@ export struct MultiMediaCollect {
|
|
|
// 临时计算新位置
|
|
|
let newOffsetX = this.lastOffsetX;
|
|
|
let newOffsetY = this.lastOffsetY;
|
|
|
-
|
|
|
- switch(this.rotateAngle % 360) {
|
|
|
- case 0:
|
|
|
- newOffsetX += dx * sensitivity;
|
|
|
- newOffsetY += dy * sensitivity;
|
|
|
- break;
|
|
|
- case 90:
|
|
|
- newOffsetX -= dy * sensitivity;
|
|
|
- newOffsetY += dx * sensitivity;
|
|
|
- break;
|
|
|
- case 180:
|
|
|
- newOffsetX -= dx * sensitivity;
|
|
|
- newOffsetY -= dy * sensitivity;
|
|
|
- break;
|
|
|
- case 270:
|
|
|
- newOffsetX += dy * sensitivity;
|
|
|
- newOffsetY -= dx * sensitivity;
|
|
|
- break;
|
|
|
- }
|
|
|
+ newOffsetX += dx * sensitivity;
|
|
|
+ newOffsetY += dy * sensitivity;
|
|
|
this.offsetX = newOffsetX;
|
|
|
this.offsetY = newOffsetY;
|
|
|
})
|
|
@@ -624,25 +662,9 @@ export struct MultiMediaCollect {
|
|
|
this.offsetY = 0;
|
|
|
return;
|
|
|
}
|
|
|
- // 计算最大允许偏移量(基于缩放比例)
|
|
|
- const maxOffsetX = (this.scaleValue - 1) * 500; //500是容器的半宽
|
|
|
- const maxOffsetY = (this.scaleValue - 1) * 345; //345是容器的半高
|
|
|
- // 检查X轴边界
|
|
|
- if (Math.abs(this.offsetX) > maxOffsetX) {
|
|
|
- this.offsetX = this.offsetX > 0 ? maxOffsetX : -maxOffsetX;
|
|
|
- }
|
|
|
- // 检查Y轴边界
|
|
|
- if (Math.abs(this.offsetY) > maxOffsetY) {
|
|
|
- this.offsetY = this.offsetY > 0 ? maxOffsetY : -maxOffsetY;
|
|
|
- }
|
|
|
- // 添加回弹动画
|
|
|
- animateTo({
|
|
|
- duration: 300,
|
|
|
- curve: Curve.EaseOut
|
|
|
- }, () => {
|
|
|
- this.offsetX = this.offsetX;
|
|
|
- this.offsetY = this.offsetY;
|
|
|
- });
|
|
|
+ this.adjustOffsetWithAnimation()
|
|
|
+ // 计算缩
|
|
|
+ console.info(TAG,this.offsetX,TAG,this.offsetY,TAG,this.scaleValue)
|
|
|
})
|
|
|
)
|
|
|
)
|