Skip to content
This repository was archived by the owner on Apr 4, 2023. It is now read-only.

Commit 741471e

Browse files
FIXED orientation bug on android #1373
Fixing Camera Stretch #1365
1 parent e69429b commit 741471e

File tree

1 file changed

+37
-24
lines changed

1 file changed

+37
-24
lines changed

src/mlkit/mlkit-cameraview.android.ts

Lines changed: 37 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,14 @@ declare const global: any;
66
const ActivityCompatClass = useAndroidX() ? global.androidx.core.app.ActivityCompat : android.support.v4.app.ActivityCompat;
77
const CAMERA_PERMISSION_REQUEST_CODE = 502;
88

9+
interface SizeWH {
10+
width: number;
11+
height: number;
12+
}
13+
914
class SizePair {
10-
pictureSize: {
11-
width: number;
12-
height: number;
13-
};
14-
previewSize: {
15-
width: number;
16-
height: number;
17-
};
15+
pictureSize: SizeWH;
16+
previewSize: SizeWH;
1817
}
1918

2019
function useAndroidX() {
@@ -29,6 +28,7 @@ export abstract class MLKitCameraView extends MLKitCameraViewBase {
2928
public lastVisionImage;
3029
private detector: any;
3130
private camera;
31+
private metadata;
3232

3333
disposeNativeView(): void {
3434
super.disposeNativeView();
@@ -154,10 +154,16 @@ export abstract class MLKitCameraView extends MLKitCameraViewBase {
154154
parameters.setPreviewFormat(android.graphics.ImageFormat.NV21);
155155

156156
application.off("orientationChanged");
157-
application.on("orientationChanged", () => this.setRotation(this.camera, parameters, requestedCameraId));
157+
application.on("orientationChanged", () => {
158+
this.setRotation(this.camera, parameters, requestedCameraId);
159+
setTimeout(() => {
160+
this.fixStretch(previewSize);
161+
this.setMetadata(previewSize);
162+
}, 700);
163+
});
158164

159165
this.setRotation(this.camera, parameters, requestedCameraId);
160-
this.fixStretch(previewSize.width, previewSize.height);
166+
this.fixStretch(previewSize);
161167

162168
if (parameters.getSupportedFocusModes().contains(android.hardware.Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO)) {
163169
parameters.setFocusMode(android.hardware.Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
@@ -175,13 +181,7 @@ export abstract class MLKitCameraView extends MLKitCameraViewBase {
175181
const onSuccessListener = this.createSuccessListener();
176182
const onFailureListener = this.createFailureListener();
177183

178-
let metadata =
179-
new com.google.firebase.ml.vision.common.FirebaseVisionImageMetadata.Builder()
180-
.setFormat(com.google.firebase.ml.vision.common.FirebaseVisionImageMetadata.IMAGE_FORMAT_NV21)
181-
.setWidth(previewSize.width)
182-
.setHeight(previewSize.height)
183-
.setRotation(this.rotation)
184-
.build();
184+
this.setMetadata(previewSize);
185185

186186
let throttle = 0;
187187
this.camera.setPreviewCallbackWithBuffer(new android.hardware.Camera.PreviewCallback({
@@ -207,13 +207,13 @@ export abstract class MLKitCameraView extends MLKitCameraViewBase {
207207
let data = this.pendingFrameData;
208208

209209
if (this.detector.processImage) {
210-
this.lastVisionImage = com.google.firebase.ml.vision.common.FirebaseVisionImage.fromByteBuffer(data, metadata);
210+
this.lastVisionImage = com.google.firebase.ml.vision.common.FirebaseVisionImage.fromByteBuffer(data, this.metadata);
211211
this.detector
212212
.processImage(this.lastVisionImage)
213213
.addOnSuccessListener(onSuccessListener)
214214
.addOnFailureListener(onFailureListener);
215215
} else if (this.detector.detectInImage) {
216-
this.lastVisionImage = com.google.firebase.ml.vision.common.FirebaseVisionImage.fromByteBuffer(data, metadata);
216+
this.lastVisionImage = com.google.firebase.ml.vision.common.FirebaseVisionImage.fromByteBuffer(data, this.metadata);
217217
this.detector
218218
.detectInImage(this.lastVisionImage)
219219
.addOnSuccessListener(onSuccessListener)
@@ -241,12 +241,22 @@ export abstract class MLKitCameraView extends MLKitCameraViewBase {
241241
}, 500);
242242
}
243243

244-
private fixStretch(width, height): void {
244+
private setMetadata(previewSize: SizeWH): void {
245+
this.metadata =
246+
new com.google.firebase.ml.vision.common.FirebaseVisionImageMetadata.Builder()
247+
.setFormat(com.google.firebase.ml.vision.common.FirebaseVisionImageMetadata.IMAGE_FORMAT_NV21)
248+
.setWidth(previewSize.width)
249+
.setHeight(previewSize.height)
250+
.setRotation(this.rotation)
251+
.build();
252+
}
253+
254+
private fixStretch(previewSize: SizeWH): void {
245255
let measuredWidth = this.surfaceView.getMeasuredWidth();
246256
let measuredHeight = this.surfaceView.getMeasuredHeight();
247257

248-
let scale = width / height;
249-
let invertedScale = height / width;
258+
let scale = previewSize.width / previewSize.height;
259+
let invertedScale = previewSize.height / previewSize.width;
250260
let measuredScale = measuredWidth / measuredHeight;
251261

252262
let scaleX = 1, scaleY = 1;
@@ -264,8 +274,11 @@ export abstract class MLKitCameraView extends MLKitCameraViewBase {
264274
}
265275
}
266276

267-
this.surfaceView.setScaleX(scaleX);
268-
this.surfaceView.setScaleY(scaleY);
277+
// make sure the new size covers the entire viewport requested
278+
const correction = scaleX / scaleY > 1 ? scaleX / scaleY : 1;
279+
280+
this.surfaceView.setScaleX(scaleX * correction);
281+
this.surfaceView.setScaleY(scaleY * correction);
269282
}
270283

271284
protected updateTorch(): void {

0 commit comments

Comments
 (0)