From 4f9e17811085eb36046406b8aa19836fc099ce3a Mon Sep 17 00:00:00 2001 From: Ryan Zander Date: Fri, 17 Jan 2020 13:33:53 +0700 Subject: [PATCH] Adding changes from https://github.com/flutter/plugins/pull/709 --- .../plugins/camera/MethodCallHandlerImpl.java | 5 +++++ packages/camera/example/lib/main.dart | 14 +++++++++--- packages/camera/ios/Classes/CameraPlugin.m | 22 +++++++++++++++++++ packages/camera/lib/camera.dart | 20 +++++++++++++++++ 4 files changed, 58 insertions(+), 3 deletions(-) diff --git a/packages/camera/android/src/main/java/io/flutter/plugins/camera/MethodCallHandlerImpl.java b/packages/camera/android/src/main/java/io/flutter/plugins/camera/MethodCallHandlerImpl.java index cb58d19a9a02..47148e9acb51 100644 --- a/packages/camera/android/src/main/java/io/flutter/plugins/camera/MethodCallHandlerImpl.java +++ b/packages/camera/android/src/main/java/io/flutter/plugins/camera/MethodCallHandlerImpl.java @@ -123,6 +123,11 @@ public void onMethodCall(@NonNull MethodCall call, @NonNull final Result result) } break; } + case "setPointOfInterest": + { + result.notImplemented(); + break; + } case "dispose": { if (camera != null) { diff --git a/packages/camera/example/lib/main.dart b/packages/camera/example/lib/main.dart index ce8d37457123..a3876ada35cb 100644 --- a/packages/camera/example/lib/main.dart +++ b/packages/camera/example/lib/main.dart @@ -131,9 +131,17 @@ class _CameraExampleHomeState extends State ); } else { return AspectRatio( - aspectRatio: controller.value.aspectRatio, - child: CameraPreview(controller), - ); + aspectRatio: controller.value.aspectRatio, + child: GestureDetector( + child: CameraPreview(controller), + onTapUp: (TapUpDetails details) { + final RenderBox box = context.findRenderObject(); + final Offset localPoint = + box.globalToLocal(details.globalPosition); + final Offset scaledPoint = + localPoint.scale(1 / box.size.width, 1 / box.size.height); + controller.setPointOfInterest(scaledPoint); + })); } } diff --git a/packages/camera/ios/Classes/CameraPlugin.m b/packages/camera/ios/Classes/CameraPlugin.m index 42cdb6d5fdf9..0986f0bf6e00 100644 --- a/packages/camera/ios/Classes/CameraPlugin.m +++ b/packages/camera/ios/Classes/CameraPlugin.m @@ -865,6 +865,28 @@ - (void)handleMethodCallAsync:(FlutterMethodCall *)call result:(FlutterResult)re }); [cam start]; } + } else if ([@"setPointOfInterest" isEqualToString:call.method]) { + NSNumber *offsetX = call.arguments[@"offsetX"]; + NSNumber *offsetY = call.arguments[@"offsetY"]; + + NSError *error = nil; + [_camera.captureDevice lockForConfiguration:&error]; + if (error) { + result([error flutterError]); + } else { + if ([_camera.captureDevice isFocusPointOfInterestSupported]) { + _camera.captureDevice.focusPointOfInterest = + CGPointMake(offsetY.floatValue, 1 - offsetX.floatValue); + [_camera.captureDevice setFocusMode:AVCaptureFocusModeContinuousAutoFocus]; + } + if ([_camera.captureDevice isExposurePointOfInterestSupported]) { + _camera.captureDevice.exposurePointOfInterest = + CGPointMake(offsetY.floatValue, 1 - offsetX.floatValue); + [_camera.captureDevice setExposureMode:AVCaptureExposureModeContinuousAutoExposure]; + } + [_camera.captureDevice unlockForConfiguration]; + result(@{}); + } } else if ([@"startImageStream" isEqualToString:call.method]) { [_camera startImageStreamWithMessenger:_messenger]; result(nil); diff --git a/packages/camera/lib/camera.dart b/packages/camera/lib/camera.dart index ce9fd9430dde..b45b185adfcd 100644 --- a/packages/camera/lib/camera.dart +++ b/packages/camera/lib/camera.dart @@ -569,6 +569,26 @@ class CameraController extends ValueNotifier { } } + /// Sets the auto focus and auto exposure point. + /// + /// Throws a [CameraException] if the call fails. + Future setPointOfInterest(Offset offset) async { + if (!value.isInitialized || _isDisposed) { + throw CameraException( + 'Uninitialized CameraController.', + 'takePicture was called on uninitialized CameraController', + ); + } + try { + await _channel.invokeMethod( + 'setPointOfInterest', + {'offsetX': offset.dx, 'offsetY': offset.dy}, + ); + } on PlatformException catch (e) { + throw CameraException(e.code, e.message); + } + } + /// Releases the resources of this camera. @override Future dispose() async {