@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.
- package/README.md +41 -9
- package/android/.gradle/4.10.1/fileChanges/last-build.bin +0 -0
- package/android/.gradle/4.10.1/fileHashes/fileHashes.bin +0 -0
- package/android/.gradle/4.10.1/fileHashes/fileHashes.lock +0 -0
- package/android/.gradle/4.10.1/gc.properties +0 -0
- package/android/.gradle/vcs-1/gc.properties +0 -0
- package/android/.idea/compiler.xml +6 -0
- package/android/.idea/gradle.xml +20 -0
- package/android/.idea/jarRepositories.xml +45 -0
- package/android/.idea/libraries/Gradle__androidx_activity_activity_1_2_0_aar.xml +14 -0
- package/android/.idea/libraries/Gradle__androidx_activity_activity_1_2_3_aar.xml +14 -0
- package/android/.idea/libraries/Gradle__androidx_annotation_annotation_1_1_0.xml +9 -0
- package/android/.idea/libraries/Gradle__androidx_annotation_annotation_1_2_0.xml +9 -0
- package/android/.idea/libraries/Gradle__androidx_annotation_annotation_experimental_1_0_0_aar.xml +11 -0
- package/android/.idea/libraries/Gradle__androidx_appcompat_appcompat_1_2_0_aar.xml +14 -0
- package/android/.idea/libraries/Gradle__androidx_appcompat_appcompat_1_3_0_aar.xml +14 -0
- package/android/.idea/libraries/Gradle__androidx_appcompat_appcompat_resources_1_2_0_aar.xml +11 -0
- package/android/.idea/libraries/Gradle__androidx_appcompat_appcompat_resources_1_3_0_aar.xml +11 -0
- package/android/.idea/libraries/Gradle__androidx_arch_core_core_common_2_1_0.xml +9 -0
- package/android/.idea/libraries/Gradle__androidx_arch_core_core_runtime_2_1_0_aar.xml +11 -0
- package/android/.idea/libraries/Gradle__androidx_collection_collection_1_1_0.xml +9 -0
- package/android/.idea/libraries/Gradle__androidx_coordinatorlayout_coordinatorlayout_1_1_0_aar.xml +14 -0
- package/android/.idea/libraries/Gradle__androidx_core_core_1_3_2_aar.xml +14 -0
- package/android/.idea/libraries/Gradle__androidx_core_core_1_5_0_aar.xml +14 -0
- package/android/.idea/libraries/Gradle__androidx_cursoradapter_cursoradapter_1_0_0_aar.xml +11 -0
- package/android/.idea/libraries/Gradle__androidx_customview_customview_1_0_0_aar.xml +11 -0
- package/android/.idea/libraries/Gradle__androidx_drawerlayout_drawerlayout_1_0_0_aar.xml +14 -0
- package/android/.idea/libraries/Gradle__androidx_exifinterface_exifinterface_1_3_2_aar.xml +14 -0
- package/android/.idea/libraries/Gradle__androidx_fragment_fragment_1_3_0_aar.xml +14 -0
- package/android/.idea/libraries/Gradle__androidx_fragment_fragment_1_3_4_aar.xml +14 -0
- package/android/.idea/libraries/Gradle__androidx_interpolator_interpolator_1_0_0_aar.xml +11 -0
- package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_common_2_3_0.xml +9 -0
- package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_common_2_3_1.xml +9 -0
- package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_2_0_0_aar.xml +11 -0
- package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_core_2_3_0_aar.xml +11 -0
- package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_core_2_3_1_aar.xml +11 -0
- package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_runtime_2_3_0_aar.xml +11 -0
- package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_runtime_2_3_1_aar.xml +11 -0
- package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_viewmodel_2_3_0_aar.xml +11 -0
- package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_viewmodel_2_3_1_aar.xml +11 -0
- package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_viewmodel_savedstate_2_3_0_aar.xml +11 -0
- package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_viewmodel_savedstate_2_3_1_aar.xml +11 -0
- package/android/.idea/libraries/Gradle__androidx_loader_loader_1_0_0_aar.xml +11 -0
- package/android/.idea/libraries/Gradle__androidx_savedstate_savedstate_1_1_0_aar.xml +11 -0
- package/android/.idea/libraries/Gradle__androidx_test_core_1_3_0_aar.xml +11 -0
- package/android/.idea/libraries/Gradle__androidx_test_espresso_espresso_core_3_1_0_alpha3_aar.xml +11 -0
- package/android/.idea/libraries/Gradle__androidx_test_espresso_espresso_core_3_3_0_aar.xml +11 -0
- package/android/.idea/libraries/Gradle__androidx_test_espresso_espresso_idling_resource_3_1_0_alpha3_aar.xml +11 -0
- package/android/.idea/libraries/Gradle__androidx_test_espresso_espresso_idling_resource_3_3_0_aar.xml +11 -0
- package/android/.idea/libraries/Gradle__androidx_test_ext_junit_1_1_2_aar.xml +11 -0
- package/android/.idea/libraries/Gradle__androidx_test_monitor_1_1_0_alpha3_aar.xml +11 -0
- package/android/.idea/libraries/Gradle__androidx_test_monitor_1_3_0_aar.xml +11 -0
- package/android/.idea/libraries/Gradle__androidx_test_runner_1_1_0_alpha3_aar.xml +11 -0
- package/android/.idea/libraries/Gradle__androidx_test_runner_1_3_0_aar.xml +11 -0
- package/android/.idea/libraries/Gradle__androidx_tracing_tracing_1_0_0_aar.xml +11 -0
- package/android/.idea/libraries/Gradle__androidx_vectordrawable_vectordrawable_1_1_0_aar.xml +11 -0
- package/android/.idea/libraries/Gradle__androidx_vectordrawable_vectordrawable_animated_1_1_0_aar.xml +11 -0
- package/android/.idea/libraries/Gradle__androidx_versionedparcelable_versionedparcelable_1_1_0_aar.xml +11 -0
- package/android/.idea/libraries/Gradle__androidx_versionedparcelable_versionedparcelable_1_1_1_aar.xml +11 -0
- package/android/.idea/libraries/Gradle__androidx_viewpager_viewpager_1_0_0_aar.xml +11 -0
- package/android/.idea/libraries/Gradle__com_google_code_findbugs_jsr305_2_0_1.xml +9 -0
- package/android/.idea/libraries/Gradle__com_squareup_javawriter_2_1_1.xml +9 -0
- package/android/.idea/libraries/Gradle__javax_inject_javax_inject_1.xml +9 -0
- package/android/.idea/libraries/Gradle__junit_junit_4_12.xml +9 -0
- package/android/.idea/libraries/Gradle__junit_junit_4_13_1.xml +9 -0
- package/android/.idea/libraries/Gradle__net_bytebuddy_byte_buddy_1_10_18.xml +9 -0
- package/android/.idea/libraries/Gradle__net_bytebuddy_byte_buddy_agent_1_10_18.xml +9 -0
- package/android/.idea/libraries/Gradle__net_sf_kxml_kxml2_2_3_0.xml +9 -0
- package/android/.idea/libraries/Gradle__org_apache_cordova_framework_7_0_0_aar.xml +11 -0
- package/android/.idea/libraries/Gradle__org_hamcrest_hamcrest_core_1_3.xml +9 -0
- package/android/.idea/libraries/Gradle__org_hamcrest_hamcrest_integration_1_3.xml +9 -0
- package/android/.idea/libraries/Gradle__org_hamcrest_hamcrest_library_1_3.xml +9 -0
- package/android/.idea/libraries/Gradle__org_json_json_20140107.xml +9 -0
- package/android/.idea/libraries/Gradle__org_mockito_mockito_core_3_6_28.xml +9 -0
- package/android/.idea/libraries/Gradle__org_mockito_mockito_inline_3_6_28.xml +9 -0
- package/android/.idea/libraries/Gradle__org_objenesis_objenesis_3_1.xml +9 -0
- package/android/.idea/misc.xml +9 -0
- package/android/.idea/modules/1419750366/android.capacitor-android.iml +92 -0
- package/android/.idea/modules/android.iml +87 -0
- package/android/.idea/modules.xml +9 -0
- package/android/.idea/vcs.xml +6 -0
- package/android/build.gradle +2 -4
- package/android/src/main/java/com/ahm/capacitor/camera/preview/CameraActivity.java +128 -70
- package/android/src/main/java/com/ahm/capacitor/camera/preview/CameraPreview.java +36 -0
- package/android/src/main/java/com/ahm/capacitor/camera/preview/CustomTextureView.java +31 -0
- package/android/src/main/java/com/ahm/capacitor/camera/preview/Preview.java +96 -19
- package/dist/esm/definitions.d.ts +10 -1
- package/dist/esm/web.d.ts +2 -1
- package/dist/esm/web.js +6 -0
- package/dist/esm/web.js.map +1 -1
- package/ios/Plugin/CameraController.swift +82 -0
- package/ios/Plugin/Plugin.swift +6 -1
- 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
|
-
|
|
32
|
-
|
|
33
|
-
mSurfaceView = new CustomSurfaceView(context);
|
|
34
|
-
addView(mSurfaceView);
|
|
38
|
+
this(context, false);
|
|
39
|
+
}
|
|
35
40
|
|
|
36
|
-
|
|
41
|
+
Preview(Context context, boolean enableOpacity) {
|
|
42
|
+
super(context);
|
|
37
43
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
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
|
-
/**
|
|
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 };
|
package/dist/esm/web.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web.js","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;
|
|
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?) {
|
package/ios/Plugin/Plugin.swift
CHANGED
|
@@ -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
|
}
|