@@ -6,15 +6,14 @@ declare const global: any;
66const ActivityCompatClass = useAndroidX ( ) ? global . androidx . core . app . ActivityCompat : android . support . v4 . app . ActivityCompat ;
77const CAMERA_PERMISSION_REQUEST_CODE = 502 ;
88
9+ interface SizeWH {
10+ width : number ;
11+ height : number ;
12+ }
13+
914class 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
2019function 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