@capacitor-community/camera-preview 2.0.0-beta.2 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/README.md +41 -9
  2. package/android/.gradle/4.10.1/fileChanges/last-build.bin +0 -0
  3. package/android/.gradle/4.10.1/fileHashes/fileHashes.bin +0 -0
  4. package/android/.gradle/4.10.1/fileHashes/fileHashes.lock +0 -0
  5. package/android/.gradle/4.10.1/gc.properties +0 -0
  6. package/android/.gradle/vcs-1/gc.properties +0 -0
  7. package/android/.idea/compiler.xml +6 -0
  8. package/android/.idea/gradle.xml +20 -0
  9. package/android/.idea/jarRepositories.xml +45 -0
  10. package/android/.idea/libraries/Gradle__androidx_activity_activity_1_2_0_aar.xml +14 -0
  11. package/android/.idea/libraries/Gradle__androidx_activity_activity_1_2_3_aar.xml +14 -0
  12. package/android/.idea/libraries/Gradle__androidx_annotation_annotation_1_1_0.xml +9 -0
  13. package/android/.idea/libraries/Gradle__androidx_annotation_annotation_1_2_0.xml +9 -0
  14. package/android/.idea/libraries/Gradle__androidx_annotation_annotation_experimental_1_0_0_aar.xml +11 -0
  15. package/android/.idea/libraries/Gradle__androidx_appcompat_appcompat_1_2_0_aar.xml +14 -0
  16. package/android/.idea/libraries/Gradle__androidx_appcompat_appcompat_1_3_0_aar.xml +14 -0
  17. package/android/.idea/libraries/Gradle__androidx_appcompat_appcompat_resources_1_2_0_aar.xml +11 -0
  18. package/android/.idea/libraries/Gradle__androidx_appcompat_appcompat_resources_1_3_0_aar.xml +11 -0
  19. package/android/.idea/libraries/Gradle__androidx_arch_core_core_common_2_1_0.xml +9 -0
  20. package/android/.idea/libraries/Gradle__androidx_arch_core_core_runtime_2_1_0_aar.xml +11 -0
  21. package/android/.idea/libraries/Gradle__androidx_collection_collection_1_1_0.xml +9 -0
  22. package/android/.idea/libraries/Gradle__androidx_coordinatorlayout_coordinatorlayout_1_1_0_aar.xml +14 -0
  23. package/android/.idea/libraries/Gradle__androidx_core_core_1_3_2_aar.xml +14 -0
  24. package/android/.idea/libraries/Gradle__androidx_core_core_1_5_0_aar.xml +14 -0
  25. package/android/.idea/libraries/Gradle__androidx_cursoradapter_cursoradapter_1_0_0_aar.xml +11 -0
  26. package/android/.idea/libraries/Gradle__androidx_customview_customview_1_0_0_aar.xml +11 -0
  27. package/android/.idea/libraries/Gradle__androidx_drawerlayout_drawerlayout_1_0_0_aar.xml +14 -0
  28. package/android/.idea/libraries/Gradle__androidx_exifinterface_exifinterface_1_3_2_aar.xml +14 -0
  29. package/android/.idea/libraries/Gradle__androidx_fragment_fragment_1_3_0_aar.xml +14 -0
  30. package/android/.idea/libraries/Gradle__androidx_fragment_fragment_1_3_4_aar.xml +14 -0
  31. package/android/.idea/libraries/Gradle__androidx_interpolator_interpolator_1_0_0_aar.xml +11 -0
  32. package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_common_2_3_0.xml +9 -0
  33. package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_common_2_3_1.xml +9 -0
  34. package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_2_0_0_aar.xml +11 -0
  35. package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_core_2_3_0_aar.xml +11 -0
  36. package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_core_2_3_1_aar.xml +11 -0
  37. package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_runtime_2_3_0_aar.xml +11 -0
  38. package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_runtime_2_3_1_aar.xml +11 -0
  39. package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_viewmodel_2_3_0_aar.xml +11 -0
  40. package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_viewmodel_2_3_1_aar.xml +11 -0
  41. package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_viewmodel_savedstate_2_3_0_aar.xml +11 -0
  42. package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_viewmodel_savedstate_2_3_1_aar.xml +11 -0
  43. package/android/.idea/libraries/Gradle__androidx_loader_loader_1_0_0_aar.xml +11 -0
  44. package/android/.idea/libraries/Gradle__androidx_savedstate_savedstate_1_1_0_aar.xml +11 -0
  45. package/android/.idea/libraries/Gradle__androidx_test_core_1_3_0_aar.xml +11 -0
  46. package/android/.idea/libraries/Gradle__androidx_test_espresso_espresso_core_3_1_0_alpha3_aar.xml +11 -0
  47. package/android/.idea/libraries/Gradle__androidx_test_espresso_espresso_core_3_3_0_aar.xml +11 -0
  48. package/android/.idea/libraries/Gradle__androidx_test_espresso_espresso_idling_resource_3_1_0_alpha3_aar.xml +11 -0
  49. package/android/.idea/libraries/Gradle__androidx_test_espresso_espresso_idling_resource_3_3_0_aar.xml +11 -0
  50. package/android/.idea/libraries/Gradle__androidx_test_ext_junit_1_1_2_aar.xml +11 -0
  51. package/android/.idea/libraries/Gradle__androidx_test_monitor_1_1_0_alpha3_aar.xml +11 -0
  52. package/android/.idea/libraries/Gradle__androidx_test_monitor_1_3_0_aar.xml +11 -0
  53. package/android/.idea/libraries/Gradle__androidx_test_runner_1_1_0_alpha3_aar.xml +11 -0
  54. package/android/.idea/libraries/Gradle__androidx_test_runner_1_3_0_aar.xml +11 -0
  55. package/android/.idea/libraries/Gradle__androidx_tracing_tracing_1_0_0_aar.xml +11 -0
  56. package/android/.idea/libraries/Gradle__androidx_vectordrawable_vectordrawable_1_1_0_aar.xml +11 -0
  57. package/android/.idea/libraries/Gradle__androidx_vectordrawable_vectordrawable_animated_1_1_0_aar.xml +11 -0
  58. package/android/.idea/libraries/Gradle__androidx_versionedparcelable_versionedparcelable_1_1_0_aar.xml +11 -0
  59. package/android/.idea/libraries/Gradle__androidx_versionedparcelable_versionedparcelable_1_1_1_aar.xml +11 -0
  60. package/android/.idea/libraries/Gradle__androidx_viewpager_viewpager_1_0_0_aar.xml +11 -0
  61. package/android/.idea/libraries/Gradle__com_google_code_findbugs_jsr305_2_0_1.xml +9 -0
  62. package/android/.idea/libraries/Gradle__com_squareup_javawriter_2_1_1.xml +9 -0
  63. package/android/.idea/libraries/Gradle__javax_inject_javax_inject_1.xml +9 -0
  64. package/android/.idea/libraries/Gradle__junit_junit_4_12.xml +9 -0
  65. package/android/.idea/libraries/Gradle__junit_junit_4_13_1.xml +9 -0
  66. package/android/.idea/libraries/Gradle__net_bytebuddy_byte_buddy_1_10_18.xml +9 -0
  67. package/android/.idea/libraries/Gradle__net_bytebuddy_byte_buddy_agent_1_10_18.xml +9 -0
  68. package/android/.idea/libraries/Gradle__net_sf_kxml_kxml2_2_3_0.xml +9 -0
  69. package/android/.idea/libraries/Gradle__org_apache_cordova_framework_7_0_0_aar.xml +11 -0
  70. package/android/.idea/libraries/Gradle__org_hamcrest_hamcrest_core_1_3.xml +9 -0
  71. package/android/.idea/libraries/Gradle__org_hamcrest_hamcrest_integration_1_3.xml +9 -0
  72. package/android/.idea/libraries/Gradle__org_hamcrest_hamcrest_library_1_3.xml +9 -0
  73. package/android/.idea/libraries/Gradle__org_json_json_20140107.xml +9 -0
  74. package/android/.idea/libraries/Gradle__org_mockito_mockito_core_3_6_28.xml +9 -0
  75. package/android/.idea/libraries/Gradle__org_mockito_mockito_inline_3_6_28.xml +9 -0
  76. package/android/.idea/libraries/Gradle__org_objenesis_objenesis_3_1.xml +9 -0
  77. package/android/.idea/misc.xml +9 -0
  78. package/android/.idea/modules/1419750366/android.capacitor-android.iml +92 -0
  79. package/android/.idea/modules/android.iml +87 -0
  80. package/android/.idea/modules.xml +9 -0
  81. package/android/.idea/vcs.xml +6 -0
  82. package/android/build.gradle +2 -4
  83. package/android/src/main/java/com/ahm/capacitor/camera/preview/CameraActivity.java +128 -70
  84. package/android/src/main/java/com/ahm/capacitor/camera/preview/CameraPreview.java +36 -0
  85. package/android/src/main/java/com/ahm/capacitor/camera/preview/CustomTextureView.java +31 -0
  86. package/android/src/main/java/com/ahm/capacitor/camera/preview/Preview.java +96 -19
  87. package/dist/esm/definitions.d.ts +10 -1
  88. package/dist/esm/web.d.ts +2 -1
  89. package/dist/esm/web.js +6 -0
  90. package/dist/esm/web.js.map +1 -1
  91. package/ios/Plugin/CameraController.swift +82 -0
  92. package/ios/Plugin/Plugin.swift +6 -1
  93. package/package.json +1 -1
@@ -2,22 +2,27 @@ package com.ahm.capacitor.camera.preview;
2
2
 
3
3
  import android.app.Activity;
4
4
  import android.content.Context;
5
+ import android.graphics.SurfaceTexture;
5
6
  import android.hardware.Camera;
6
7
  import android.util.DisplayMetrics;
7
8
  import android.util.Log;
8
9
  import android.view.Surface;
9
10
  import android.view.SurfaceHolder;
11
+ import android.view.TextureView;
10
12
  import android.view.View;
11
13
  import android.widget.RelativeLayout;
12
14
 
13
15
  import java.io.IOException;
14
16
  import java.util.List;
15
17
 
16
- class Preview extends RelativeLayout implements SurfaceHolder.Callback {
18
+ class Preview extends RelativeLayout implements SurfaceHolder.Callback,
19
+ TextureView.SurfaceTextureListener {
17
20
  private final String TAG = "Preview";
18
21
 
19
22
  CustomSurfaceView mSurfaceView;
23
+ CustomTextureView mTextureView;
20
24
  SurfaceHolder mHolder;
25
+ SurfaceTexture mSurface;
21
26
  Camera.Size mPreviewSize;
22
27
  List<Camera.Size> mSupportedPreviewSizes;
23
28
  Camera mCamera;
@@ -26,20 +31,36 @@ class Preview extends RelativeLayout implements SurfaceHolder.Callback {
26
31
  int facing = Camera.CameraInfo.CAMERA_FACING_BACK;
27
32
  int viewWidth;
28
33
  int viewHeight;
34
+ private boolean enableOpacity = false;
35
+ private float opacity = 1F;
29
36
 
30
37
  Preview(Context context) {
31
- super(context);
32
-
33
- mSurfaceView = new CustomSurfaceView(context);
34
- addView(mSurfaceView);
38
+ this(context, false);
39
+ }
35
40
 
36
- requestLayout();
41
+ Preview(Context context, boolean enableOpacity) {
42
+ super(context);
37
43
 
38
- // Install a SurfaceHolder.Callback so we get notified when the
39
- // underlying surface is created and destroyed.
40
- mHolder = mSurfaceView.getHolder();
41
- mHolder.addCallback(this);
42
- mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
44
+ this.enableOpacity = enableOpacity;
45
+ if (!enableOpacity) {
46
+ mSurfaceView = new CustomSurfaceView(context);
47
+ addView(mSurfaceView);
48
+ requestLayout();
49
+
50
+ // Install a SurfaceHolder.Callback so we get notified when the
51
+ // underlying surface is created and destroyed.
52
+ mHolder = mSurfaceView.getHolder();
53
+ mHolder.addCallback(this);
54
+ mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
55
+ } else {
56
+ // Use a TextureView so we can manage opacity
57
+ mTextureView = new CustomTextureView(context);
58
+ // Install a SurfaceTextureListener so we get notified
59
+ mTextureView.setSurfaceTextureListener(this);
60
+ mTextureView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
61
+ addView(mTextureView);
62
+ requestLayout();
63
+ }
43
64
  }
44
65
 
45
66
  public void setCamera(Camera camera, int cameraId) {
@@ -123,7 +144,14 @@ class Preview extends RelativeLayout implements SurfaceHolder.Callback {
123
144
 
124
145
  Log.d("CameraPreview", "before set camera");
125
146
 
126
- camera.setPreviewDisplay(mHolder);
147
+ View v;
148
+ if (enableOpacity) {
149
+ camera.setPreviewTexture(mSurface);
150
+ v = mTextureView;
151
+ } else {
152
+ camera.setPreviewDisplay(mHolder);
153
+ v = mSurfaceView;
154
+ }
127
155
 
128
156
  Log.d("CameraPreview", "before getParameters");
129
157
 
@@ -132,7 +160,7 @@ class Preview extends RelativeLayout implements SurfaceHolder.Callback {
132
160
  Log.d("CameraPreview", "before setPreviewSize");
133
161
 
134
162
  mSupportedPreviewSizes = parameters.getSupportedPreviewSizes();
135
- mPreviewSize = getOptimalPreviewSize(mSupportedPreviewSizes, mSurfaceView.getWidth(), mSurfaceView.getHeight());
163
+ mPreviewSize = getOptimalPreviewSize(mSupportedPreviewSizes, v.getWidth(), v.getHeight());
136
164
  parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height);
137
165
  Log.d(TAG, mPreviewSize.width + " " + mPreviewSize.height);
138
166
 
@@ -285,21 +313,70 @@ class Preview extends RelativeLayout implements SurfaceHolder.Callback {
285
313
  if (mSupportedPreviewSizes != null) {
286
314
  mPreviewSize = getOptimalPreviewSize(mSupportedPreviewSizes, w, h);
287
315
  }
288
- Camera.Parameters parameters = mCamera.getParameters();
289
- parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height);
290
- requestLayout();
291
- //mCamera.setDisplayOrientation(90);
292
- mCamera.setParameters(parameters);
293
- mCamera.startPreview();
316
+ startCamera();
294
317
  } catch (Exception exception) {
295
318
  Log.e(TAG, "Exception caused by surfaceChanged()", exception);
296
319
  }
297
320
  }
298
321
  }
299
322
 
323
+ private void startCamera() {
324
+ Camera.Parameters parameters = mCamera.getParameters();
325
+ parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height);
326
+ requestLayout();
327
+ //mCamera.setDisplayOrientation(90);
328
+ mCamera.setParameters(parameters);
329
+ mCamera.startPreview();
330
+ }
331
+
332
+ // Texture Callbacks
333
+
334
+ public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
335
+ // The Surface has been created, acquire the camera and tell it where
336
+ // to draw.
337
+ try {
338
+ mSurface = surface;
339
+ if (mSupportedPreviewSizes != null) {
340
+ mPreviewSize = getOptimalPreviewSize(mSupportedPreviewSizes, width, height);
341
+ }
342
+ if (mCamera != null) {
343
+ mTextureView.setAlpha(opacity);
344
+ mCamera.setPreviewTexture(surface);
345
+ startCamera();
346
+ }
347
+ } catch (Exception exception) {
348
+ Log.e(TAG, "Exception caused by onSurfaceTextureAvailable()", exception);
349
+ }
350
+ }
351
+
352
+ public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
353
+ }
354
+
355
+ public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
356
+ try {
357
+ if (mCamera != null) {
358
+ mCamera.stopPreview();
359
+ }
360
+ } catch (Exception exception) {
361
+ Log.e(TAG, "Exception caused by onSurfaceTextureDestroyed()", exception);
362
+ return false;
363
+ }
364
+ return true;
365
+
366
+ }
367
+
368
+ public void onSurfaceTextureUpdated(SurfaceTexture surface) {
369
+ }
300
370
  public void setOneShotPreviewCallback(Camera.PreviewCallback callback) {
301
371
  if(mCamera != null) {
302
372
  mCamera.setOneShotPreviewCallback(callback);
303
373
  }
304
374
  }
375
+
376
+ public void setOpacity(final float opacity) {
377
+ this.opacity = opacity;
378
+ if (mCamera != null && enableOpacity) {
379
+ mTextureView.setAlpha(opacity);
380
+ }
381
+ }
305
382
  }
@@ -28,8 +28,12 @@ export interface CameraPreviewOptions {
28
28
  enableHighResolution?: boolean;
29
29
  /** Defaults to false - Web only - Disables audio stream to prevent permission requests and output switching */
30
30
  disableAudio?: boolean;
31
- /** Defaults to false - Android Only - Locks device orientation when camera is showing. */
31
+ /** Android Only - Locks device orientation when camera is showing. */
32
32
  lockAndroidOrientation?: boolean;
33
+ /** Defaults to false - Android and Web only. Set if camea preview can change opacity. */
34
+ enableOpacity?: boolean;
35
+ /** Defaults to false - Android only. Set if camea preview will support pinch to zoom. */
36
+ enableZoom?: boolean;
33
37
  }
34
38
  export interface CameraPreviewPictureOptions {
35
39
  /** The picture height, optional, default 0 (Device default) */
@@ -44,6 +48,10 @@ export interface CameraSampleOptions {
44
48
  quality?: number;
45
49
  }
46
50
  export declare type CameraPreviewFlashMode = 'off' | 'on' | 'auto' | 'red-eye' | 'torch';
51
+ export interface CameraOpacityOptions {
52
+ /** The percent opacity to set for camera view, default 1 */
53
+ opacity?: number;
54
+ }
47
55
  export interface CameraPreviewPlugin {
48
56
  start(options: CameraPreviewOptions): Promise<{}>;
49
57
  stop(): Promise<{}>;
@@ -60,4 +68,5 @@ export interface CameraPreviewPlugin {
60
68
  flashMode: CameraPreviewFlashMode | string;
61
69
  }): void;
62
70
  flip(): void;
71
+ setOpacity(options: CameraOpacityOptions): Promise<{}>;
63
72
  }
package/dist/esm/web.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { WebPlugin } from "@capacitor/core";
2
- import { CameraPreviewOptions, CameraPreviewPictureOptions, CameraPreviewPlugin, CameraPreviewFlashMode, CameraSampleOptions } from "./definitions";
2
+ import { CameraPreviewOptions, CameraPreviewPictureOptions, CameraPreviewPlugin, CameraPreviewFlashMode, CameraSampleOptions, CameraOpacityOptions } from "./definitions";
3
3
  export declare class CameraPreviewWeb extends WebPlugin implements CameraPreviewPlugin {
4
4
  /**
5
5
  * track which camera is used based on start options
@@ -18,6 +18,7 @@ export declare class CameraPreviewWeb extends WebPlugin implements CameraPreview
18
18
  flashMode: CameraPreviewFlashMode | string;
19
19
  }): Promise<void>;
20
20
  flip(): Promise<void>;
21
+ setOpacity(_options: CameraOpacityOptions): Promise<any>;
21
22
  }
22
23
  declare const CameraPreview: CameraPreviewWeb;
23
24
  export { CameraPreview };
package/dist/esm/web.js CHANGED
@@ -110,6 +110,12 @@ export class CameraPreviewWeb extends WebPlugin {
110
110
  async flip() {
111
111
  throw new Error('flip not supported under the web platform');
112
112
  }
113
+ async setOpacity(_options) {
114
+ const video = document.getElementById("video");
115
+ if (!!video && !!_options['opacity']) {
116
+ video.style.setProperty("opacity", _options['opacity'].toString());
117
+ }
118
+ }
113
119
  }
114
120
  const CameraPreview = new CameraPreviewWeb();
115
121
  export { CameraPreview };
@@ -1 +1 @@
1
- {"version":3,"file":"web.js","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"web.js","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"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"}
@@ -34,6 +34,8 @@ class CameraController: NSObject {
34
34
 
35
35
  var audioDevice: AVCaptureDevice?
36
36
  var audioInput: AVCaptureDeviceInput?
37
+
38
+ var zoomFactor: CGFloat = 1.0
37
39
  }
38
40
 
39
41
  extension CameraController {
@@ -162,6 +164,25 @@ extension CameraController {
162
164
  self.previewLayer?.frame = view.frame
163
165
  }
164
166
 
167
+ func setupGestures(target: UIView, enableZoom: Bool) {
168
+ setupTapGesture(target: target, selector: #selector(handleTap(_:)), delegate: self)
169
+ if (enableZoom) {
170
+ setupPinchGesture(target: target, selector: #selector(handlePinch(_:)), delegate: self)
171
+ }
172
+ }
173
+
174
+ func setupTapGesture(target: UIView, selector: Selector, delegate: UIGestureRecognizerDelegate?) {
175
+ let tapGesture = UITapGestureRecognizer(target: self, action: selector)
176
+ tapGesture.delegate = delegate
177
+ target.addGestureRecognizer(tapGesture)
178
+ }
179
+
180
+ func setupPinchGesture(target: UIView, selector: Selector, delegate: UIGestureRecognizerDelegate?) {
181
+ let pinchGesture = UIPinchGestureRecognizer(target: self, action: selector)
182
+ pinchGesture.delegate = delegate
183
+ target.addGestureRecognizer(pinchGesture)
184
+ }
185
+
165
186
  func updateVideoOrientation() {
166
187
  assert(Thread.isMainThread) // UIApplication.statusBarOrientation requires the main thread.
167
188
 
@@ -416,6 +437,67 @@ extension CameraController {
416
437
  }
417
438
  }
418
439
 
440
+ extension CameraController: UIGestureRecognizerDelegate {
441
+ func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
442
+ return true;
443
+ }
444
+
445
+ @objc
446
+ func handleTap(_ tap: UITapGestureRecognizer) {
447
+ guard let device = self.currentCameraPosition == .rear ? rearCamera : frontCamera else { return }
448
+
449
+ let point = tap.location(in: tap.view)
450
+ let devicePoint = self.previewLayer?.captureDevicePointConverted(fromLayerPoint: point)
451
+
452
+ do {
453
+ try device.lockForConfiguration()
454
+ defer { device.unlockForConfiguration() }
455
+
456
+ let focusMode = AVCaptureDevice.FocusMode.autoFocus
457
+ if device.isFocusPointOfInterestSupported && device.isFocusModeSupported(focusMode) {
458
+ device.focusPointOfInterest = CGPoint(x: CGFloat(devicePoint?.x ?? 0), y: CGFloat(devicePoint?.y ?? 0))
459
+ device.focusMode = focusMode
460
+ }
461
+
462
+ let exposureMode = AVCaptureDevice.ExposureMode.autoExpose
463
+ if device.isExposurePointOfInterestSupported && device.isExposureModeSupported(exposureMode) {
464
+ device.exposurePointOfInterest = CGPoint(x: CGFloat(devicePoint?.x ?? 0), y: CGFloat(devicePoint?.y ?? 0))
465
+ device.exposureMode = exposureMode
466
+ }
467
+ } catch {
468
+ debugPrint(error)
469
+ }
470
+ }
471
+
472
+ @objc
473
+ private func handlePinch(_ pinch: UIPinchGestureRecognizer) {
474
+ guard let device = self.currentCameraPosition == .rear ? rearCamera : frontCamera else { return }
475
+
476
+ func minMaxZoom(_ factor: CGFloat) -> CGFloat { return max(1.0, min(factor, device.activeFormat.videoMaxZoomFactor)) }
477
+
478
+ func update(scale factor: CGFloat) {
479
+ do {
480
+ try device.lockForConfiguration()
481
+ defer { device.unlockForConfiguration() }
482
+
483
+ device.videoZoomFactor = factor
484
+ } catch {
485
+ debugPrint(error)
486
+ }
487
+ }
488
+
489
+ switch pinch.state {
490
+ case .began: fallthrough
491
+ case .changed:
492
+ let newScaleFactor = minMaxZoom(pinch.scale * zoomFactor)
493
+ update(scale: newScaleFactor)
494
+ case .ended:
495
+ zoomFactor = device.videoZoomFactor
496
+ default: break
497
+ }
498
+ }
499
+ }
500
+
419
501
  extension CameraController: AVCapturePhotoCaptureDelegate {
420
502
  public func photoOutput(_ captureOutput: AVCapturePhotoOutput, didFinishProcessingPhoto photoSampleBuffer: CMSampleBuffer?, previewPhoto previewPhotoSampleBuffer: CMSampleBuffer?,
421
503
  resolvedSettings: AVCaptureResolvedPhotoSettings, bracketSettings: AVCaptureBracketedStillImageSettings?, error: Swift.Error?) {
@@ -19,6 +19,7 @@ public class CameraPreview: CAPPlugin {
19
19
  var rotateWhenOrientationChanged: Bool?
20
20
  var toBack: Bool?
21
21
  var storeToFile: Bool?
22
+ var enableZoom: Bool?
22
23
  var highResolutionOutput: Bool = false
23
24
 
24
25
  @objc func rotated() {
@@ -78,6 +79,7 @@ public class CameraPreview: CAPPlugin {
78
79
  self.rotateWhenOrientationChanged = call.getBool("rotateWhenOrientationChanged") ?? true
79
80
  self.toBack = call.getBool("toBack") ?? false
80
81
  self.storeToFile = call.getBool("storeToFile") ?? false
82
+ self.enableZoom = call.getBool("enableZoom") ?? false
81
83
 
82
84
  AVCaptureDevice.requestAccess(for: .video, completionHandler: { (granted: Bool) in
83
85
  guard granted else {
@@ -96,7 +98,7 @@ public class CameraPreview: CAPPlugin {
96
98
  return
97
99
  }
98
100
  let height = self.paddingBottom != nil ? self.height! - self.paddingBottom!: self.height!;
99
- self.previewView = UIView(frame: CGRect(x: 0, y: 0, width: self.width!, height: height))
101
+ self.previewView = UIView(frame: CGRect(x: self.x ?? 0, y: self.y ?? 0, width: self.width!, height: height))
100
102
  self.webView?.isOpaque = false
101
103
  self.webView?.backgroundColor = UIColor.clear
102
104
  self.webView?.scrollView.backgroundColor = UIColor.clear
@@ -106,6 +108,9 @@ public class CameraPreview: CAPPlugin {
106
108
  }
107
109
  try? self.cameraController.displayPreview(on: self.previewView)
108
110
 
111
+ let frontView = self.toBack! ? self.webView : self.previewView;
112
+ self.cameraController.setupGestures(target: frontView ?? self.previewView, enableZoom: self.enableZoom!)
113
+
109
114
  if (self.rotateWhenOrientationChanged == true) {
110
115
  NotificationCenter.default.addObserver(self, selector: #selector(CameraPreview.rotated), name: UIDevice.orientationDidChangeNotification, object: nil)
111
116
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@capacitor-community/camera-preview",
3
- "version": "2.0.0-beta.2",
3
+ "version": "3.0.0",
4
4
  "description": "Camera preview",
5
5
  "main": "dist/esm/index.js",
6
6
  "types": "dist/esm/index.d.ts",