最近在写纯净flutter的相机功能,但是发现flutter官方的相机库还是需要很多需要封装的东西,所以就写成了一个开源库。
PS:拍照加水印的功能正在筹备开发ing
首先引入依赖
flutter_camerax:
git:
url: https://github.com/cgztzero/FlutterCameraX.git
1.第一步创建一个相机Controller,之后相机所有的操作都是通过Controller来执行
final CameraXController _controller = CameraXController();
2.第二步在页面中创建相机预览widget,并和Controller绑定,相机预览的widget默认支持双指缩放
CameraPreviewWidget(
cameraController: _controller,
cameraOption: CameraOption(camera: CameraType.back),//相机参数,可以不设置
width: 100,//预览的宽高,基本上可以不设置,规则跟Container一样
height: 100,
cameraCallBack: (int? code, String? message) {
//相机错误的回调,可以不设置
},
//切换摄像头,初始化等耗时操作的loading,可以自定义
loadingWidget: const SizedBox(
width: 50,
height: 50,
child: CircularProgressIndicator(),
),
)
3.之后就可以通过Controller进行相关操作了,Controller可以通过引用在任何widget中进行操作
拍照功能
_button(
text: 'TakePicture',
onTap: () async {
final image = await _controller.takePicture();
debugPrint('image file path:${image?.path}');
},
)
录像功能
if (_controller.isRecording()) {
_controller.stopRecording();
} else {
_controller.startVideoRecording(
max: 60,//视频录制最长时间,单位秒,不设置则没有限制
onRecordFinish: (file) => debugPrint('video file path:${file.path}'),
);
}
切换摄像头
_button(text: 'switch', onTap: () => _controller.switchCamera()),
相机一些初始化参数,基础开发可以不传,可以使用默认的就行
CameraOption(
camera: CameraType.back,//摄像头类型 默认back
resolutionPresetType: ResolutionPresetType.veryHigh,//图片质量 默认high
enableAudio: true,//是否可以录音 默认false
flashType: FlashType.auto,//闪光灯 默认auto
)
扫描二维码功能只需要在widget中新增一个回调即可
CameraPreviewWidget(
cameraController: _controller,
onScanSuccess: (list) {
//遍历List即可,因为一张图片里可能有多个二维码
for (var barcode in list) {
//value是二维码的内容,boundingBox是二维码图片的坐标
debugPrint('barcode value:${barcode.value} - box:${barcode.boundingBox}');
}
},
)
也可以用Controller暂停/开启预览
_controller.pausePreview();
_controller.resumePreview();
封装后flutter相机开发的代码量瞬间下降了不少,而且Controller和Widget进行了拆分,使得功能和布局也解耦了。
最后是GitHub地址:https://github.com/cgztzero/FlutterCameraX
欢迎各位多多交流,多多提bug和需求~~
寒冬中抱团取暖,如果北京有合适的flutter或者Android岗位麻烦各位同学可以帮忙推荐~