Flutter动态动画条码扫描插件flutter_animated_barcode_scanner的使用
Flutter动态动画条码扫描插件flutter_animated_barcode_scanner的使用
这个插件使得在您的移动应用中添加条码扫描功能变得非常简单。它包含了一个带有动画的条码查找器,引导用户轻松扫描条码,并且会高亮显示每个找到的条码。这是一个强大的工具,可以让您的应用更加出色!
更多由 Romantic Developer 提供的插件可以在 这里 查看。
关键特性
- 简易动画条码扫描:通过最少的设置即可快速为您的应用添加条码扫描功能。
- 酷炫动画查找器:一个动画查找器帮助用户轻松扫描条码。
- 智能条码高亮:自动在所有检测到的条码周围显示矩形。
- 可定制化:更改扫描器的外观和行为以匹配您的应用风格。
- 广泛的条码支持:适用于多种类型的条码,满足各种需求。
- 高性能:快速准确的条码扫描确保了流畅的用户体验。
使用方法
完整的实现可以在 这里 的项目中查看。
BarcodeScannerPreviewWrapper(
barcodeScannerPreview: BarcodeScannerPreview(
cameraControllerBuilder: () async => CameraController(
(await availableCameras()).first,
Platform.isAndroid
? ResolutionPreset.high
: ResolutionPreset.medium,
enableAudio: false,
imageFormatGroup: ImageFormatGroup.bgra8888,
fps: 25,
),
originalPreferredOrientations: [
DeviceOrientation.portraitUp,
DeviceOrientation.landscapeLeft,
],
barcodesBuilder: (context, barcodes) {
return Stack(
children: barcodes
.map(
(e) => BasicBarcodeRectangle(
cornerPoints: e.cornerPoints,
imageSize: e.imageSize,
color: Colors.green,
strokeWidth: 2,
),
)
.toList(growable: false),
);
},
onCameraIsReady: (controller) {},
onBarcodesFound: (barcodes) {},
onCameraIsStreaming: (image) {},
onFailedToProcessBarcode: (image, error, stace) {},
),
mode: BarcodeScannerPreviewMode.square,
finderWidget: AnimatedBarcodeFinder(
lineColor: Colors.lightGreen,
borderColor: Colors.lightGreenAccent,
borderStrokeWidth: 4,
lineStrokeWidth: 4,
),
),
开发环境
[!] Flutter (Channel stable, 3.24.3, on Microsoft Windows [Version 10.0.19045.5131], locale en-US)
• Flutter version 3.24.3 on channel stable at C:\Users\admin\fvm\default
• Upstream repository https://github.com/flutter/flutter.git
• Framework revision 2663184aa7 (3 months ago), 2024-09-11 16:27:48 -0500
• Engine revision 36335019a8
• Dart version 3.5.3
• DevTools version 2.37.3
完整示例代码
import 'dart:io';
import 'package:camera/camera.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_animated_barcode_scanner/flutter_animated_barcode_scanner.dart';
const kPreferredOrientations = [
DeviceOrientation.portraitUp,
DeviceOrientation.landscapeLeft,
];
void main() {
WidgetsFlutterBinding.ensureInitialized();
SystemChrome.setPreferredOrientations(kPreferredOrientations);
runApp(MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'Example',
theme: ThemeData.from(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.blue)),
initialRoute: '/',
routes: {
'/': (context) => HomeScreen(),
'/barcodeScanner': (context) => BarcodeScannerScreen(),
'/dummy': (context) => DummyScreen(),
},
);
}
}
class BarcodeScannerScreen extends StatefulWidget {
const BarcodeScannerScreen({super.key});
[@override](/user/override)
State<BarcodeScannerScreen> createState() => _BarcodeScannerScreenState();
}
class _BarcodeScannerScreenState extends State<BarcodeScannerScreen> {
BarcodeScannerPreviewMode mode = BarcodeScannerPreviewMode.square;
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Barcode Scanner'),
actions: BarcodeScannerPreviewMode.values
.map(
(e) => TextButton(
child: Text(e.name),
onPressed: () {
setState(() {
mode = e;
});
},
),
)
.toList(growable: false),
),
body: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Expanded(
child: SingleChildScrollView(
//因为全屏模式下,预览尺寸大于屏幕尺寸。
child: BarcodeScannerPreviewWrapper(
barcodeScannerPreview: BarcodeScannerPreview(
cameraControllerBuilder: () async => CameraController(
(await availableCameras()).first,
Platform.isAndroid
? ResolutionPreset.high
: ResolutionPreset.medium,
enableAudio: false,
imageFormatGroup: ImageFormatGroup.bgra8888,
fps: 25,
),
originalPreferredOrientations: kPreferredOrientations,
barcodesBuilder: (context, barcodes) {
return Stack(
children: barcodes
.map(
(e) => BasicBarcodeRectangle(
cornerPoints: e.cornerPoints,
imageSize: e.imageSize,
color: Colors.green,
strokeWidth: 2,
),
)
.toList(growable: false),
);
},
onCameraIsReady: (controller) {},
onBarcodesFound: (barcodes) {},
onCameraIsStreaming: (image) {},
onFailedToProcessBarcode: (image, error, stace) {},
),
mode: mode,
finderWidget: AnimatedBarcodeFinder(
lineColor: Colors.lightGreen,
borderColor: Colors.lightGreenAccent,
borderStrokeWidth: 4,
lineStrokeWidth: 4,
),
),
),
),
FilledButton(
onPressed: () {
Navigator.pushNamed(context, '/dummy');
},
child: Text('Next'),
),
],
),
);
}
}
class HomeScreen extends StatelessWidget {
const HomeScreen({super.key});
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Example'),
),
body: Column(
children: [
FilledButton(
onPressed: () {
Navigator.pushNamed(context, '/barcodeScanner');
},
child: Text('Open barcode scanner'),
),
FilledButton(
onPressed: () {
if (MediaQuery.of(context).orientation == Orientation.portrait) {
SystemChrome.setPreferredOrientations(
kPreferredOrientations.reversed.toList(growable: false));
} else {
SystemChrome.setPreferredOrientations(kPreferredOrientations);
}
},
child: const Text('Toggle Orientation'),
),
],
),
);
}
}
class DummyScreen extends StatelessWidget {
const DummyScreen({super.key});
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('DummyScreen'),
),
body: Placeholder(),
);
}
}
更多关于Flutter动态动画条码扫描插件flutter_animated_barcode_scanner的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
1 回复
更多关于Flutter动态动画条码扫描插件flutter_animated_barcode_scanner的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中使用flutter_animated_barcode_scanner
插件来实现动态动画条码扫描的一个示例代码案例。
首先,确保你已经在pubspec.yaml
文件中添加了flutter_animated_barcode_scanner
依赖:
dependencies:
flutter:
sdk: flutter
flutter_animated_barcode_scanner: ^x.y.z # 请替换为最新版本号
然后运行flutter pub get
来安装依赖。
接下来是示例代码,展示如何在你的Flutter应用中实现动态动画条码扫描:
import 'package:flutter/material.dart';
import 'package:flutter_animated_barcode_scanner/flutter_animated_barcode_scanner.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Flutter Animated Barcode Scanner Example'),
),
body: Center(
child: AnimatedBarcodeScannerExample(),
),
),
);
}
}
class AnimatedBarcodeScannerExample extends StatefulWidget {
@override
_AnimatedBarcodeScannerExampleState createState() => _AnimatedBarcodeScannerExampleState();
}
class _AnimatedBarcodeScannerExampleState extends State<AnimatedBarcodeScannerExample> {
String scannedResult = '';
@override
Widget build(BuildContext context) {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
AnimatedBarcodeScanner(
onResult: (result) {
setState(() {
scannedResult = result;
});
},
onError: (error) {
print('Error scanning barcode: $error');
},
// 自定义扫描动画配置
scanAnimationBuilder: (context, controller) {
return AnimatedBuilder(
animation: controller,
child: Icon(Icons.scan_horizontal, size: 100),
builder: (context, child) {
return Transform.rotate(
angle: controller.value * 2.0 * 3.141592653589793,
child: child,
);
},
);
},
// 其他参数如高度、宽度、边框颜色等可以根据需要调整
height: 200,
width: 200,
borderColor: Colors.blue,
borderWidth: 2.0,
bezelColor: Colors.grey,
bezelWidth: 4.0,
enableTorch: true, // 是否启用闪光灯
torchColor: Colors.amber,
),
SizedBox(height: 20),
Text('Scanned Result: $scannedResult'),
],
);
}
}
在这个示例中:
AnimatedBarcodeScanner
组件用于显示和扫描条码。onResult
回调用于处理扫描到的条码结果。onError
回调用于处理扫描错误。scanAnimationBuilder
用于自定义扫描动画。在这个例子中,我们创建了一个简单的旋转动画。- 其他参数如
height
,width
,borderColor
,borderWidth
,bezelColor
,bezelWidth
,enableTorch
,torchColor
等允许你进一步自定义扫描器的外观和行为。
确保在实际项目中根据需要进行调整,并测试不同的设备和条码类型以确保兼容性和性能。