165 scan area iosflutter-beta
| @@ -64,12 +64,16 @@ class _QRViewExampleState extends State<QRViewExample> { | |||||
| Barcode result; | Barcode result; | ||||
| QRViewController controller; | QRViewController controller; | ||||
| /// Overriding reassemble and pausing the camera | |||||
| /// ensures us that hot reload won't give a black screen | |||||
| // In order to get hot reload to work we need to pause the camera if the platform | |||||
| // is android, or resume the camera if the platform is iOS. | |||||
| @override | @override | ||||
| void reassemble() { | void reassemble() { | ||||
| super.reassemble(); | super.reassemble(); | ||||
| controller.pauseCamera(); | |||||
| if (Platform.isAndroid) { | |||||
| controller.pauseCamera(); | |||||
| } else if (Platform.isIOS) { | |||||
| controller.resumeCamera(); | |||||
| } | |||||
| } | } | ||||
| @override | @override | ||||
| @@ -47,12 +47,16 @@ class _QRViewExampleState extends State<QRViewExample> { | |||||
| QRViewController controller; | QRViewController controller; | ||||
| final GlobalKey qrKey = GlobalKey(debugLabel: 'QR'); | final GlobalKey qrKey = GlobalKey(debugLabel: 'QR'); | ||||
| /// Overriding reassemble and pausing the camera | |||||
| /// ensures us that hot reload won't give a black screen | |||||
| // In order to get hot reload to work we need to pause the camera if the platform | |||||
| // is android, or resume the camera if the platform is iOS. | |||||
| @override | @override | ||||
| void reassemble() { | void reassemble() { | ||||
| super.reassemble(); | super.reassemble(); | ||||
| controller.pauseCamera(); | |||||
| if (Platform.isAndroid) { | |||||
| controller.pauseCamera(); | |||||
| } else if (Platform.isIOS) { | |||||
| controller.resumeCamera(); | |||||
| } | |||||
| } | } | ||||
| @override | @override | ||||
| @@ -69,7 +73,8 @@ class _QRViewExampleState extends State<QRViewExample> { | |||||
| mainAxisAlignment: MainAxisAlignment.spaceEvenly, | mainAxisAlignment: MainAxisAlignment.spaceEvenly, | ||||
| children: <Widget>[ | children: <Widget>[ | ||||
| if (result != null) | if (result != null) | ||||
| Text('Barcode Type: ${describeEnum(result.format)} Data: ${result.code}') | |||||
| Text( | |||||
| 'Barcode Type: ${describeEnum(result.format)} Data: ${result.code}') | |||||
| else | else | ||||
| Text('Scan a code'), | Text('Scan a code'), | ||||
| Row( | Row( | ||||
| @@ -162,11 +167,17 @@ class _QRViewExampleState extends State<QRViewExample> { | |||||
| } | } | ||||
| Widget _buildQrView(BuildContext context) { | Widget _buildQrView(BuildContext context) { | ||||
| // For this example we check how width or tall the device is and change the scanArea and overlay accordingly. | |||||
| var scanArea = (MediaQuery.of(context).size.width < 400 || | |||||
| MediaQuery.of(context).size.height < 400) | |||||
| ? 150.0 | |||||
| : 300.0; | |||||
| // To ensure the Scanner view is properly sizes after rotation | // To ensure the Scanner view is properly sizes after rotation | ||||
| // we need to listen for Flutter SizeChanged notification and update controller | // we need to listen for Flutter SizeChanged notification and update controller | ||||
| return NotificationListener<SizeChangedLayoutNotification>( | return NotificationListener<SizeChangedLayoutNotification>( | ||||
| onNotification: (notification) { | onNotification: (notification) { | ||||
| Future.microtask(() => controller?.updateDimensions(qrKey)); | |||||
| Future.microtask( | |||||
| () => controller?.updateDimensions(qrKey, scanArea: scanArea)); | |||||
| return false; | return false; | ||||
| }, | }, | ||||
| child: SizeChangedLayoutNotifier( | child: SizeChangedLayoutNotifier( | ||||
| @@ -179,7 +190,7 @@ class _QRViewExampleState extends State<QRViewExample> { | |||||
| borderRadius: 10, | borderRadius: 10, | ||||
| borderLength: 30, | borderLength: 30, | ||||
| borderWidth: 10, | borderWidth: 10, | ||||
| cutOutSize: 300, | |||||
| cutOutSize: scanArea, | |||||
| ), | ), | ||||
| ))); | ))); | ||||
| } | } | ||||
| @@ -201,6 +212,7 @@ class _QRViewExampleState extends State<QRViewExample> { | |||||
| } | } | ||||
| ``` | ``` | ||||
| @@ -384,7 +384,7 @@ | |||||
| "$(inherited)", | "$(inherited)", | ||||
| "$(PROJECT_DIR)/Flutter", | "$(PROJECT_DIR)/Flutter", | ||||
| ); | ); | ||||
| PRODUCT_BUNDLE_IDENTIFIER = dev.steenbakker.capture; | |||||
| PRODUCT_BUNDLE_IDENTIFIER = dev.steenbakker.qr; | |||||
| PRODUCT_NAME = "$(TARGET_NAME)"; | PRODUCT_NAME = "$(TARGET_NAME)"; | ||||
| PROVISIONING_PROFILE_SPECIFIER = ""; | PROVISIONING_PROFILE_SPECIFIER = ""; | ||||
| SWIFT_VERSION = 4.0; | SWIFT_VERSION = 4.0; | ||||
| @@ -522,7 +522,7 @@ | |||||
| "$(inherited)", | "$(inherited)", | ||||
| "$(PROJECT_DIR)/Flutter", | "$(PROJECT_DIR)/Flutter", | ||||
| ); | ); | ||||
| PRODUCT_BUNDLE_IDENTIFIER = dev.steenbakker.capture; | |||||
| PRODUCT_BUNDLE_IDENTIFIER = dev.steenbakker.qr; | |||||
| PRODUCT_NAME = "$(TARGET_NAME)"; | PRODUCT_NAME = "$(TARGET_NAME)"; | ||||
| PROVISIONING_PROFILE_SPECIFIER = ""; | PROVISIONING_PROFILE_SPECIFIER = ""; | ||||
| SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; | ||||
| @@ -553,7 +553,7 @@ | |||||
| "$(inherited)", | "$(inherited)", | ||||
| "$(PROJECT_DIR)/Flutter", | "$(PROJECT_DIR)/Flutter", | ||||
| ); | ); | ||||
| PRODUCT_BUNDLE_IDENTIFIER = dev.steenbakker.capture; | |||||
| PRODUCT_BUNDLE_IDENTIFIER = dev.steenbakker.qr; | |||||
| PRODUCT_NAME = "$(TARGET_NAME)"; | PRODUCT_NAME = "$(TARGET_NAME)"; | ||||
| PROVISIONING_PROFILE_SPECIFIER = ""; | PROVISIONING_PROFILE_SPECIFIER = ""; | ||||
| SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; | ||||
| @@ -1,3 +1,5 @@ | |||||
| import 'dart:io'; | |||||
| import 'package:flutter/foundation.dart'; | import 'package:flutter/foundation.dart'; | ||||
| import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||||
| import 'package:qr_code_scanner/qr_code_scanner.dart'; | import 'package:qr_code_scanner/qr_code_scanner.dart'; | ||||
| @@ -25,10 +27,16 @@ class _QRViewExampleState extends State<QRViewExample> { | |||||
| QRViewController controller; | QRViewController controller; | ||||
| final GlobalKey qrKey = GlobalKey(debugLabel: 'QR'); | final GlobalKey qrKey = GlobalKey(debugLabel: 'QR'); | ||||
| // In order to get hot reload to work we need to pause the camera if the platform | |||||
| // is android, or resume the camera if the platform is iOS. | |||||
| @override | @override | ||||
| void reassemble() { | void reassemble() { | ||||
| super.reassemble(); | super.reassemble(); | ||||
| controller.pauseCamera(); | |||||
| if (Platform.isAndroid) { | |||||
| controller.pauseCamera(); | |||||
| } else if (Platform.isIOS) { | |||||
| controller.resumeCamera(); | |||||
| } | |||||
| } | } | ||||
| @override | @override | ||||
| @@ -139,11 +147,17 @@ class _QRViewExampleState extends State<QRViewExample> { | |||||
| } | } | ||||
| Widget _buildQrView(BuildContext context) { | Widget _buildQrView(BuildContext context) { | ||||
| // For this example we check how width or tall the device is and change the scanArea and overlay accordingly. | |||||
| var scanArea = (MediaQuery.of(context).size.width < 400 || | |||||
| MediaQuery.of(context).size.height < 400) | |||||
| ? 150.0 | |||||
| : 300.0; | |||||
| // To ensure the Scanner view is properly sizes after rotation | // To ensure the Scanner view is properly sizes after rotation | ||||
| // we need to listen for Flutter SizeChanged notification and update controller | // we need to listen for Flutter SizeChanged notification and update controller | ||||
| return NotificationListener<SizeChangedLayoutNotification>( | return NotificationListener<SizeChangedLayoutNotification>( | ||||
| onNotification: (notification) { | onNotification: (notification) { | ||||
| Future.microtask(() => controller?.updateDimensions(qrKey)); | |||||
| Future.microtask( | |||||
| () => controller?.updateDimensions(qrKey, scanArea: scanArea)); | |||||
| return false; | return false; | ||||
| }, | }, | ||||
| child: SizeChangedLayoutNotifier( | child: SizeChangedLayoutNotifier( | ||||
| @@ -156,7 +170,7 @@ class _QRViewExampleState extends State<QRViewExample> { | |||||
| borderRadius: 10, | borderRadius: 10, | ||||
| borderLength: 30, | borderLength: 30, | ||||
| borderWidth: 10, | borderWidth: 10, | ||||
| cutOutSize: 300, | |||||
| cutOutSize: scanArea, | |||||
| ), | ), | ||||
| ))); | ))); | ||||
| } | } | ||||
| @@ -53,7 +53,6 @@ public class QRView:NSObject,FlutterPlatformView { | |||||
| default: | default: | ||||
| return | return | ||||
| } | } | ||||
| guard let stringValue = code.stringValue else { continue } | guard let stringValue = code.stringValue else { continue } | ||||
| let result = ["code": stringValue, "type": typeString] | let result = ["code": stringValue, "type": typeString] | ||||
| self?.channel.invokeMethod("onRecognizeQR", arguments: result) | self?.channel.invokeMethod("onRecognizeQR", arguments: result) | ||||
| @@ -74,7 +73,7 @@ public class QRView:NSObject,FlutterPlatformView { | |||||
| switch(call.method){ | switch(call.method){ | ||||
| case "setDimensions": | case "setDimensions": | ||||
| let arguments = call.arguments as! Dictionary<String, Double> | let arguments = call.arguments as! Dictionary<String, Double> | ||||
| self?.setDimensions(width: arguments["width"] ?? 0,height: arguments["height"] ?? 0) | |||||
| self?.setDimensions(width: arguments["width"] ?? 0, height: arguments["height"] ?? 0, scanArea: arguments["scanArea"] ?? 0) | |||||
| case "flipCamera": | case "flipCamera": | ||||
| self?.flipCamera() | self?.flipCamera() | ||||
| case "toggleFlash": | case "toggleFlash": | ||||
| @@ -91,15 +90,24 @@ public class QRView:NSObject,FlutterPlatformView { | |||||
| return previewView | return previewView | ||||
| } | } | ||||
| func setDimensions(width: Double, height: Double) -> Void { | |||||
| func setDimensions(width: Double, height: Double, scanArea: Double) -> Void { | |||||
| previewView.frame = CGRect(x: 0, y: 0, width: width, height: height) | previewView.frame = CGRect(x: 0, y: 0, width: width, height: height) | ||||
| let midX = self.view().bounds.midX | |||||
| let midY = self.view().bounds.midY | |||||
| if let sc: MTBBarcodeScanner = scanner { | if let sc: MTBBarcodeScanner = scanner { | ||||
| if let previewLayer = sc.previewLayer { | if let previewLayer = sc.previewLayer { | ||||
| previewLayer.frame = previewView.bounds; | previewLayer.frame = previewView.bounds; | ||||
| } | } | ||||
| } else { | } else { | ||||
| scanner = MTBBarcodeScanner(previewView: previewView) | scanner = MTBBarcodeScanner(previewView: previewView) | ||||
| if (scanArea != 0) { | |||||
| scanner?.didStartScanningBlock = { | |||||
| self.scanner?.scanRect = CGRect(x: Double(midX) - (scanArea / 2), y: Double(midY) - (scanArea / 2), width: scanArea, height: scanArea) | |||||
| } | |||||
| } | |||||
| MTBBarcodeScanner.requestCameraPermission(success: isCameraAvailable) | MTBBarcodeScanner.requestCameraPermission(success: isCameraAvailable) | ||||
| } | } | ||||
| } | } | ||||
| @@ -3,6 +3,7 @@ import 'dart:async'; | |||||
| import 'package:flutter/foundation.dart'; | import 'package:flutter/foundation.dart'; | ||||
| import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||||
| import 'package:flutter/services.dart'; | import 'package:flutter/services.dart'; | ||||
| import 'package:qr_code_scanner/qr_code_scanner.dart'; | |||||
| typedef QRViewCreatedCallback = void Function(QRViewController); | typedef QRViewCreatedCallback = void Function(QRViewController); | ||||
| @@ -110,7 +111,7 @@ class _QRViewState extends State<QRView> { | |||||
| Widget build(BuildContext context) { | Widget build(BuildContext context) { | ||||
| return Stack( | return Stack( | ||||
| children: [ | children: [ | ||||
| _getPlatformQrView(), | |||||
| _getPlatformQrView(widget.key), | |||||
| if (widget.overlay != null) | if (widget.overlay != null) | ||||
| Container( | Container( | ||||
| padding: widget.overlayMargin, | padding: widget.overlayMargin, | ||||
| @@ -124,7 +125,7 @@ class _QRViewState extends State<QRView> { | |||||
| ); | ); | ||||
| } | } | ||||
| Widget _getPlatformQrView() { | |||||
| Widget _getPlatformQrView(GlobalKey key) { | |||||
| Widget _platformQrView; | Widget _platformQrView; | ||||
| switch (defaultTargetPlatform) { | switch (defaultTargetPlatform) { | ||||
| case TargetPlatform.android: | case TargetPlatform.android: | ||||
| @@ -137,7 +138,9 @@ class _QRViewState extends State<QRView> { | |||||
| _platformQrView = UiKitView( | _platformQrView = UiKitView( | ||||
| viewType: 'net.touchcapture.qr.flutterqr/qrview', | viewType: 'net.touchcapture.qr.flutterqr/qrview', | ||||
| onPlatformViewCreated: _onPlatformViewCreated, | onPlatformViewCreated: _onPlatformViewCreated, | ||||
| creationParams: _CreationParams.fromWidget(0, 0).toMap(), | |||||
| creationParams: | |||||
| _CreationParams.fromWidget(MediaQuery.of(context).size.width, 400) | |||||
| .toMap(), | |||||
| creationParamsCodec: StandardMessageCodec(), | creationParamsCodec: StandardMessageCodec(), | ||||
| ); | ); | ||||
| break; | break; | ||||
| @@ -152,7 +155,9 @@ class _QRViewState extends State<QRView> { | |||||
| if (widget.onQRViewCreated == null) { | if (widget.onQRViewCreated == null) { | ||||
| return; | return; | ||||
| } | } | ||||
| widget.onQRViewCreated(QRViewController._(id, widget.key)); | |||||
| widget.onQRViewCreated(QRViewController._( | |||||
| id, widget.key, (widget.overlay as QrScannerOverlayShape).cutOutSize)); | |||||
| } | } | ||||
| } | } | ||||
| @@ -178,9 +183,9 @@ class _CreationParams { | |||||
| } | } | ||||
| class QRViewController { | class QRViewController { | ||||
| QRViewController._(int id, GlobalKey qrKey) | |||||
| QRViewController._(int id, GlobalKey qrKey, double scanArea) | |||||
| : _channel = MethodChannel('net.touchcapture.qr.flutterqr/qrview_$id') { | : _channel = MethodChannel('net.touchcapture.qr.flutterqr/qrview_$id') { | ||||
| updateDimensions(qrKey); | |||||
| updateDimensions(qrKey, scanArea: scanArea); | |||||
| _channel.setMethodCallHandler( | _channel.setMethodCallHandler( | ||||
| (call) async { | (call) async { | ||||
| switch (call.method) { | switch (call.method) { | ||||
| @@ -231,11 +236,14 @@ class QRViewController { | |||||
| _scanUpdateController.close(); | _scanUpdateController.close(); | ||||
| } | } | ||||
| void updateDimensions(GlobalKey key) { | |||||
| void updateDimensions(GlobalKey key, {double scanArea}) { | |||||
| if (defaultTargetPlatform == TargetPlatform.iOS) { | if (defaultTargetPlatform == TargetPlatform.iOS) { | ||||
| final RenderBox renderBox = key.currentContext.findRenderObject(); | final RenderBox renderBox = key.currentContext.findRenderObject(); | ||||
| _channel.invokeMethod('setDimensions', | |||||
| {'width': renderBox.size.width, 'height': renderBox.size.height}); | |||||
| _channel.invokeMethod('setDimensions', { | |||||
| 'width': renderBox.size.width, | |||||
| 'height': renderBox.size.height, | |||||
| 'scanArea': scanArea ?? 0 | |||||
| }); | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||