فهرست منبع

update(mobile): 优化移动端测量截图保存

gavin.chen 2 سال پیش
والد
کامیت
175dbcf823

+ 2 - 0
lib/utils/prompt_box.dart

@@ -103,6 +103,7 @@ class PromptBox {
   static void snackbar(
     String message, {
     String? title,
+    Color? textColor = Colors.black,
     PromptBoxSnackbarPosition position = PromptBoxSnackbarPosition.Top,
   }) {
     final isTop = PromptBoxSnackbarPosition.Top == position;
@@ -110,6 +111,7 @@ class PromptBox {
     Get.snackbar(
       title ?? i18nBook.common.tip.t, // TODO:
       message,
+      colorText: textColor,
       maxWidth: kIsMobile ? Sizer.ins.size.width - 40 : 400,
       snackPosition: isTop ? SnackPosition.TOP : SnackPosition.BOTTOM,
       margin: isTop

+ 10 - 5
lib/view/measure/measure_tool.dart

@@ -1,3 +1,4 @@
+import 'package:fis_common/logger/logger.dart';
 import 'package:fis_jsonrpc/rpc.dart';
 import 'package:fis_measure/interfaces/process/items/item.dart';
 import 'package:fis_measure/interfaces/process/items/item_metas.dart';
@@ -50,11 +51,15 @@ class LeftSiderSelectMeasureState extends FState<LeftSiderSelectMeasure> {
   /// 切换测量项
   void changeItem(ItemMeta itemMeta) {
     activeName = itemMeta.name;
-    application.switchItem(itemMeta);
-    final item = application.activeMeasureItem!;
-    if (item is ITopMeasureItem) {
-      item.switchChild(0);
-      item.workingChildChanged.addListener(workingChildChanged);
+    try {
+      application.switchItem(itemMeta);
+      final item = application.activeMeasureItem!;
+      if (item is ITopMeasureItem) {
+        item.switchChild(0);
+        item.workingChildChanged.addListener(workingChildChanged);
+      }
+    } catch (e) {
+      logger.e("changeItem failed", e);
     }
     if (mounted) {
       setState(() {});

+ 24 - 9
lib/view/mobile_view/mobile_measure_main_view.dart

@@ -14,6 +14,7 @@ import 'package:fis_measure/process/workspace/measure_handler.dart';
 import 'package:fis_measure/process/workspace/third_part/application.dart';
 import 'package:fis_measure/process/workspace/third_part/calibration_controller.dart';
 import 'package:fis_measure/utils/canvas.dart';
+import 'package:fis_measure/utils/prompt_box.dart';
 import 'package:fis_measure/values/colors.dart';
 import 'package:fis_measure/view/button_group/button_group.dart';
 import 'package:fis_measure/view/gesture/annotation/annotation_gesture.dart';
@@ -79,7 +80,7 @@ class _MobileMeasureMainViewState extends State<MobileMeasureMainView> {
   IStandardLineCalibrationController? standardLineCalibrationController;
 
   final playerKey = GlobalKey();
-  final _key = GlobalKey();
+  final _ImageCaptureAreakey = GlobalKey();
 
   bool get inAnnotation =>
       application.currentOperateType == MeasureOperateType.annotation;
@@ -175,18 +176,22 @@ class _MobileMeasureMainViewState extends State<MobileMeasureMainView> {
     );
     await Future.delayed(const Duration(milliseconds: 10), () async {
       final RenderRepaintBoundary? boundary =
-          _key.currentContext?.findRenderObject() as RenderRepaintBoundary?;
+          _ImageCaptureAreakey.currentContext?.findRenderObject()
+              as RenderRepaintBoundary?;
 
       if (boundary != null) {
         final image = await boundary.toImage();
         final byteData = await image.toByteData(format: ImageByteFormat.png);
         final pngBytes = byteData!.buffer.asUint8List();
-        Get.dialog(
-          CaptureImage(
-            bytes: pngBytes,
-          ),
-          transitionCurve: Curves.bounceInOut,
-        );
+        // Get.dialog(
+        //   CaptureImage(
+        //     bytes: pngBytes,
+        //   ),
+        //   transitionCurve: Curves.bounceInOut,
+        // );
+        PromptBox.snackbar("保存位置:测量图像",
+            title: "截图保存成功",
+            textColor: const Color.fromARGB(255, 219, 219, 219));
         await measureData.saveImage.call(
           pngBytes,
           measureData.measureImageData.patientCode ?? '',
@@ -338,10 +343,16 @@ class _MobileMeasureMainViewState extends State<MobileMeasureMainView> {
           alignment: Alignment.bottomCenter,
           children: [
             RepaintBoundary(
-              key: _key,
+              key: _ImageCaptureAreakey,
               child: CustomMultiChildLayout(
                 delegate: _LayerLayoutDelegate(),
                 children: [
+                  LayoutId(
+                    id: _LayerLayoutIds.background,
+                    child: Container(
+                      color: MeasureColors.Background,
+                    ),
+                  ),
                   LayoutId(
                     id: _LayerLayoutIds.player,
                     child: VidPlayer(
@@ -440,6 +451,7 @@ class _LayerLayoutDelegate extends MultiChildLayoutDelegate {
     /// 同步图像显示尺寸
     application.displaySize = renderSize;
 
+    layoutLayer(_LayerLayoutIds.background, Offset.zero, size);
     layoutLayer(_LayerLayoutIds.player, offset, renderSize);
 
     /// 其他层按播放器尺寸位置层叠布局
@@ -498,6 +510,9 @@ class _LayerLayoutDelegate extends MultiChildLayoutDelegate {
 }
 
 enum _LayerLayoutIds {
+  /// 黑色背景层
+  background,
+
   /// 播放器
   player,
 

+ 45 - 10
lib/view/mobile_view/mobile_right_panel/mobile_measure_tool.dart

@@ -1,8 +1,11 @@
+import 'package:fis_measure/interfaces/process/items/item_metas.dart';
+import 'package:fis_measure/interfaces/process/items/types.dart';
 import 'package:fis_measure/process/workspace/measure_3d_view_controller.dart';
 import 'package:fis_measure/view/measure/measure_tool.dart';
 import 'package:fis_ui/index.dart';
 import 'package:flutter/material.dart';
 import 'package:get/get.dart';
+import 'package:vid/us/vid_us_unit.dart';
 
 /// 移动端测量项选择器(继承自 测量项页面)
 class MobileMeasureSelector extends LeftSiderSelectMeasure {
@@ -20,17 +23,41 @@ class _MobileMeasureSelector extends LeftSiderSelectMeasureState {
     MobileMeasureBtn(
       icon: Icons.linear_scale,
       displayName: '距离',
-      modeName: 'Distance',
+      itemMeta: ItemMeta(
+        MeasureTypes.Distance,
+        measureType: MeasureTypes.Distance,
+        description: MeasureTypes.Distance,
+        briefAnnotation: "D",
+        outputs: [
+          ItemOutputMeta(MeasureTypes.Distance, "Distance", VidUsUnit.cm),
+        ],
+      ),
     ),
     MobileMeasureBtn(
       icon: Icons.border_style,
       displayName: '周长',
-      modeName: 'Perimeter',
+      itemMeta: ItemMeta(
+        MeasureTypes.Perimeter,
+        measureType: MeasureTypes.Perimeter,
+        description: MeasureTypes.Perimeter,
+        briefAnnotation: "P",
+        outputs: [
+          ItemOutputMeta(MeasureTypes.Perimeter, "Perimeter", VidUsUnit.cm),
+        ],
+      ),
     ),
     MobileMeasureBtn(
       icon: Icons.format_shapes,
       displayName: '面积',
-      modeName: 'Area',
+      itemMeta: ItemMeta(
+        MeasureTypes.Area,
+        measureType: MeasureTypes.Area,
+        description: MeasureTypes.Area,
+        briefAnnotation: "A",
+        outputs: [
+          ItemOutputMeta(MeasureTypes.Area, "Area", VidUsUnit.cm2),
+        ],
+      ),
     ),
   ];
 
@@ -45,21 +72,29 @@ class _MobileMeasureSelector extends LeftSiderSelectMeasureState {
           children: [
             const FSizedBox(height: 30),
             ...mobileMeasureBtnList.map((e) {
-              return _buildMeasureBtn(
-                  e.modeName, e.modeName == activeName, e.displayName, e.icon);
+              return _buildMeasureBtn(e.itemMeta, e.itemMeta.name == activeName,
+                  e.displayName, e.icon);
             }).toList(),
           ]),
     );
   }
 
   FWidget _buildMeasureBtn(
-      String modeName, bool ifActive, String displayName, IconData icon) {
+      ItemMeta itemMeta, bool ifActive, String displayName, IconData icon) {
     return FInkWell(
       onTap: () {
         if (ifActive) {
-          changeItem("None");
+          changeItem(
+            ItemMeta(
+              "None",
+              description: "None",
+              outputs: [
+                ItemOutputMeta("None", "None", VidUsUnit.cm2),
+              ],
+            ),
+          );
         } else {
-          changeItem(modeName);
+          changeItem(itemMeta);
         }
       },
       child: Container(
@@ -106,9 +141,9 @@ class _MobileMeasureSelector extends LeftSiderSelectMeasureState {
 }
 
 class MobileMeasureBtn {
-  String modeName;
+  ItemMeta itemMeta;
   String displayName;
   IconData icon;
   MobileMeasureBtn(
-      {required this.modeName, required this.displayName, required this.icon});
+      {required this.itemMeta, required this.displayName, required this.icon});
 }