123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- import 'package:camera/camera.dart';
- import 'package:fis_jsonrpc/rpc.dart';
- import 'package:flutter/material.dart';
- import 'package:get/get.dart';
- import 'package:vitalapp/architecture/utils/advance_debounce.dart';
- import 'package:vitalapp/components/appbar.dart';
- import 'controller_plus.dart';
- import 'index.dart';
- import 'widgets/widgets.dart';
- class FacialRecognitionPage extends GetView<FacialRecognitionController> {
- const FacialRecognitionPage({
- Key? key,
- required this.mode,
- this.patientInfo,
- }) : super(key: key);
- final FacialRecognitionMode mode;
- final PatientDTO? patientInfo;
- @override
- Widget build(BuildContext context) {
- return GetBuilder<FacialRecognitionController>(
- init: FacialRecognitionControllerPlus(
- mode: mode,
- patientInfo: patientInfo,
- ),
- builder: (_) {
- return Scaffold(
- appBar: VAppBar(
- titleText:
- mode == FacialRecognitionMode.faceInput ? "人像采集" : "人脸识别",
- ),
- body: SafeArea(
- child: Obx(
- () => controller.state.isCameraReady
- ? _buildCameraArea()
- : const Center(
- child: CircularProgressIndicator(
- valueColor: AlwaysStoppedAnimation<Color>(Colors.blue),
- ),
- ),
- ),
- ),
- );
- },
- );
- }
- Widget _buildCameraArea() {
- return Row(
- children: [
- Expanded(
- child: ClipRRect(
- child: LayoutBuilder(builder: (context, constraints) {
- return Stack(
- children: <Widget>[
- OverflowBox(
- maxHeight: constraints.maxHeight,
- maxWidth: 2000,
- child: Container(
- color: Colors.black,
- child: Center(
- child: _cameraPreviewWidget(),
- ),
- ),
- ),
- const Center(child: CameraForFace()),
- Align(
- alignment: Alignment.bottomRight,
- child: _switchCameraLens(),
- ),
- const ImageDetectingDialog(),
- ],
- );
- }),
- ),
- ),
- ],
- );
- }
- /// 相机预览
- Widget _cameraPreviewWidget() {
- final CameraController? cameraController = controller.kCameraController;
- if (cameraController == null || !cameraController.value.isInitialized) {
- /// 旋转loading
- return const Center(
- child: CircularProgressIndicator(),
- );
- } else {
- return Listener(
- onPointerDown: (_) => controller.pointers++,
- onPointerUp: (_) => controller.pointers--,
- child: CameraPreview(
- cameraController,
- child: LayoutBuilder(
- builder: (BuildContext context, BoxConstraints constraints) {
- return GestureDetector(
- behavior: HitTestBehavior.opaque,
- onScaleStart: controller.handleScaleStart,
- onScaleUpdate: controller.handleScaleUpdate,
- onTapDown: (TapDownDetails details) =>
- controller.onViewFinderTap(details, constraints),
- child: const FaceBoundingBox(),
- );
- },
- ),
- ),
- );
- }
- }
- Widget _switchCameraLens() {
- return Obx(() {
- if (controller.state.isRunningFaceRecognition) {
- return Container();
- }
- return GestureDetector(
- onTap: () {
- advanceDebounce(controller.switchCameraLens, "capture", 1500);
- },
- child: Container(
- padding: const EdgeInsets.all(10.0),
- // padding: const EdgeInsets.all(10),
- decoration: BoxDecoration(
- color: Colors.black.withOpacity(0.2),
- borderRadius: BorderRadius.circular(10),
- ),
- margin: const EdgeInsets.symmetric(horizontal: 40.0, vertical: 20.0),
- child: Column(
- mainAxisSize: MainAxisSize.min,
- children: [
- const Icon(
- Icons.camera_rear,
- size: 30,
- color: Colors.white,
- ),
- const SizedBox(height: 10),
- Text(
- controller.state.isUsingFrontCamera ? "切换为后置" : "切换为前置",
- style: const TextStyle(color: Colors.white),
- )
- ],
- ),
- ),
- );
- });
- }
- }
|