Android 如何从相机中捕获图像,包括覆盖窗口小部件?

Android 如何从相机中捕获图像,包括覆盖窗口小部件?,android,flutter,Android,Flutter,我使用camera包创建了一个摄像头处理程序。结果如下所示: 我希望像时钟和用户配置文件一样的覆盖,除了捕获和返回按钮,都包含在捕获的图像中,可以这样做吗 或者,我应该使用带有条件的屏幕截图,而不是使用捕获功能 提前谢谢 编辑 这是我的相机。dart看起来像: 导入'dart:async'; 导入“dart:io”; 进口“包装:颤振/材料.省道”; 导入“包:摄像机/摄像机.dart”; 导入“package:font_awesome_flatter/font_awesome_flatter

我使用
camera
包创建了一个摄像头处理程序。结果如下所示:

我希望像时钟和用户配置文件一样的覆盖,除了捕获和返回按钮,都包含在捕获的图像中,可以这样做吗

或者,我应该使用带有条件的屏幕截图,而不是使用捕获功能

提前谢谢

编辑

这是我的
相机。dart
看起来像:

导入'dart:async';
导入“dart:io”;
进口“包装:颤振/材料.省道”;
导入“包:摄像机/摄像机.dart”;
导入“package:font_awesome_flatter/font_awesome_flatter.dart”;
导入“包:intl/intl.dart”;
导入“package:path_provider/path_provider.dart”;
列出摄像机;
类CameraPage扩展StatefulWidget{
最终int cameraIdx;
摄影({
关键点,
@需要这个.cameraIdx,
}):super(key:key);
@凌驾
_CameraPageState createState()=>\u CameraPageState();
}
类_CameraPageState扩展状态{
摄像机控制器;
列出摄像机;
int-selectedCameraIdx;
字符串图像路径;
字符串_timeString;
定时器(u定时器),;
void _getTime(){
final DateTime now=DateTime.now();
最终字符串formattedDateTime=\u FormattDateTime(现在);
设置状态(){
_timeString=formattedDateTime;
});
}
字符串\u formatDateTime(DateTime DateTime)=>
DateFormat('HH:mm:ss')。格式(dateTime);
字符串时间戳()=>DateTime.now().millissecondssinceepoch.toString();
//初始化摄像机控制器
Future _initCameraController(CameraDescription CameraDescription)异步{
如果(控制器!=null){
wait controller.dispose();
}
//通过高分辨率预设的摄像机描述设置控制器
控制器=CameraController(cameraDescription,ResolutionPreset.high);
//如果控制器已更新,则更新UI。
controller.addListener(){
//安装此小部件后,清除状态
如果(本安装){
setState((){});
}
if(controller.value.hasError){
打印('Camera error${controller.value.errorDescription}');
}
});
// 6
试一试{
等待控制器初始化();
}关于CameraException捕获(e){
印刷品(e);
}
如果(本安装){
setState((){});
}
}
Future takePicture()异步{
如果(!controller.value.isInitialized){
返回null;
}
最终目录extDir=wait getExternalStorageDirectory();
最终字符串dirPath='${extDir.path}/Pictures/flatter_test';
等待目录(dirPath).create(递归:true);
最终字符串filePath='$dirPath/${timestamp()}.jpg';
if(controller.value.picture){
//捕获已挂起,请不要执行任何操作。
返回null;
}
试一试{
等待控制器。拍摄照片(文件路径);
}关于CameraException捕获(e){
_showCameraException(e);
返回null;
}
返回文件路径;
}
无效日志错误(字符串代码、字符串消息)=>
打印('错误:$code\n错误消息:$Message');
void\u showCameraException(CameraException e){
日志错误(e.代码,e.说明);
}
void onCaptureButtonPressed(){
takePicture()。然后((字符串文件路径){
打印(文件路径);
如果(已安装){
设置状态(){
imagePath=filePath;
});
}
});
}
@凌驾
void initState(){
super.initState();
//检查摄像机是否可用
availableCameras()。然后((availableCameras){
摄像机=可用摄像机;
如果(摄影机长度>0){
设置状态(){
//选择“前摄像头”作为默认设置
如果(widget.cameraIdx!=null){
selectedCameraIdx=widget.cameraIdx;
}否则{
selectedCameraIdx=1;
}
});
_初始化CameraController(cameras[selectedCameraIdx]),然后((void v){});
}否则{
打印(“无可用照相机”);
}
}).catchError((err){
//打印错误(如果有)
打印('Error:$err.code\n错误消息:$err.Message');
});
_timeString=_formatDateTime(DateTime.now());
_timer=timer.periodic(持续时间(秒:1),(timer t)=>\u getTime());
}
@凌驾
无效处置(){
控制器?.dispose();
_timer.cancel();
super.dispose();
}
@凌驾
小部件构建(构建上下文){
最终大小=MediaQuery.of(context).size;
最终偏差=尺寸.宽度/尺寸.高度;
如果(!controller.value.isInitialized){
返回容器();
}
返回脚手架(
主体:堆栈(
儿童:[
变换比例(
比例:controller.value.aspectRatio/deviceRatio,
儿童:中心(
孩子:AspectRatio(
aspectRatio:controller.value.aspectRatio,
子项:CameraPreview(控制器),
),
),
),
对齐(
对齐:alignment.topCenter,
子:容器(
宽度:double.infinity,
高度:110.0,
填充:仅限边缘设置(右侧:20.0),
孩子:填充(
填充:仅限边缘设置(顶部:40.0,右侧:0.0),
孩子:排(
mainAxisAlignment:mainAxisAlignment.spaceBetween,
crossAxisAlignment:crossAxisAlignment.center,
儿童:[
手势检测器(
孩子:填充(
填充:仅限边缘设置(左:20.0),
子:图标(
FontAwesomeIcons.arrow左,
颜色:颜色,白色,
尺寸:30.0,
),
),
onTap:(){
Navigator.of(context.pop();
},
),
划船(