Przeglądaj źródła

优化全屏的30s心电图像

gavin.chen 1 rok temu
rodzic
commit
5d11a7838f

+ 2 - 2
lib/pages/medical/widgets/ecg_view/view.dart

@@ -18,9 +18,9 @@ class EcgView extends GetView<EcgViewController> {
             newPoints: controller.newPointsToDraw,
             oldPoints: controller.oldPointsToDraw,
             xDataCount: controller.xDataCount,
-            yMax: 200,
+            yMax: 300,
           ),
-          painter: GridBackgroundPainter(3 * 25, 32),
+          painter: GridBackgroundPainter(3 * 25),
           size: Size(width, height),
         ),
       ),

+ 3 - 0
lib/pages/medical/widgets/ecg_view/widgets/ecg_painter_for_all.dart

@@ -7,12 +7,15 @@ class EcgPainterForAll extends CustomPainter {
   /// 横坐标数据量(横轴一共多少个点) 30s * 125 = 3750
   final int xDataCount = 3750;
 
+  final int yGridNumsPerMv; // 多少格是一毫伏特
+
   /// 纵坐标最大值
   final double yMax;
 
   EcgPainterForAll({
     required this.allPoints,
     required this.yMax,
+    this.yGridNumsPerMv = 5,
   });
 
   @override

+ 1 - 1
lib/pages/medical/widgets/ecg_view/widgets/full_screen_ecg_data_dialog.dart

@@ -14,7 +14,7 @@ class FullScreenEcgDataDialog extends GetView<EcgViewController> {
     final ScrollController scrollController = ScrollController();
     return Container(
       width: Get.width * 0.9 / scale,
-      height: Get.height * 0.9 / scale,
+      height: 240 * 3,
       decoration: BoxDecoration(
         color: Colors.white,
         borderRadius: BorderRadius.circular(10),

+ 13 - 6
lib/pages/medical/widgets/ecg_view/widgets/grid_background_painter.dart

@@ -5,9 +5,8 @@ import 'package:flutter/material.dart';
 /// 入参:yGridNums y轴方格数
 class GridBackgroundPainter extends CustomPainter {
   final int xGridNums;
-  final int yGridNums;
 
-  GridBackgroundPainter(this.xGridNums, this.yGridNums);
+  GridBackgroundPainter(this.xGridNums);
 
   @override
   void paint(Canvas canvas, Size size) {
@@ -18,6 +17,9 @@ class GridBackgroundPainter extends CustomPainter {
 
     final double xGridSize = size.width / xGridNums;
     final double yGridSize = xGridSize;
+    final int yGridNums = (size.height / yGridSize).ceil();
+
+    final double centerY = size.height / 2;
 
     for (int i = 0; i < xGridNums; i++) {
       final offsetX = i * xGridSize;
@@ -28,11 +30,16 @@ class GridBackgroundPainter extends CustomPainter {
       );
     }
 
-    for (int i = 0; i < yGridNums; i++) {
-      final offsetY = i * yGridSize;
+    for (int i = 0; i < yGridNums / 2; i++) {
+      final offsetY = (i * yGridSize);
+      canvas.drawLine(
+        Offset(0, centerY + offsetY),
+        Offset(size.width, centerY + offsetY),
+        gridPaint,
+      );
       canvas.drawLine(
-        Offset(0, offsetY),
-        Offset(size.width, offsetY),
+        Offset(0, centerY - offsetY),
+        Offset(size.width, centerY - offsetY),
         gridPaint,
       );
     }

+ 70 - 9
lib/pages/medical/widgets/ecg_view/widgets/grid_background_painter_for_all.dart

@@ -3,9 +3,10 @@ import 'package:flutter/material.dart';
 /// 绘制30s完整心电的背景方格
 class GridBackgroundPainterForAll extends CustomPainter {
   final int xGridNums = 750; // 1秒25格,共30秒
-  final int yGridNums = 120;
 
-  GridBackgroundPainterForAll();
+  final int yGridNumsPerMv; // 多少格是一毫伏特 [暂未用到该参数]
+
+  GridBackgroundPainterForAll({this.yGridNumsPerMv = 5});
 
   @override
   void paint(Canvas canvas, Size size) {
@@ -16,6 +17,10 @@ class GridBackgroundPainterForAll extends CustomPainter {
 
     final double xGridSize = size.width / xGridNums;
     final double yGridSize = xGridSize;
+    final double centerY = size.height / 2;
+
+    /// 计算 y 轴方格数
+    final int yGridNums = (size.height / yGridSize).ceil();
 
     for (int i = 0; i < xGridNums; i++) {
       final offsetX = i * xGridSize;
@@ -26,11 +31,16 @@ class GridBackgroundPainterForAll extends CustomPainter {
       );
     }
 
-    for (int i = 0; i < yGridNums; i++) {
-      final offsetY = i * yGridSize;
+    for (int i = 0; i < yGridNums / 2; i++) {
+      final offsetY = (i * yGridSize);
+      canvas.drawLine(
+        Offset(0, centerY + offsetY),
+        Offset(size.width, centerY + offsetY),
+        gridPaint,
+      );
       canvas.drawLine(
-        Offset(0, offsetY),
-        Offset(size.width, offsetY),
+        Offset(0, centerY - offsetY),
+        Offset(size.width, centerY - offsetY),
         gridPaint,
       );
     }
@@ -59,6 +69,14 @@ class GridBackgroundPainterForAll extends CustomPainter {
       ..style = PaintingStyle.stroke
       ..strokeWidth = 2.0;
     for (int i = 0; i < xGridNums; i++) {
+      if (i % 25 == 0) {
+        final offsetX = i * xGridSize;
+        canvas.drawLine(
+          Offset(offsetX, 0),
+          Offset(offsetX, size.height),
+          boldLinePaint,
+        );
+      }
       if (i % 125 == 0) {
         final offsetX = i * xGridSize;
         canvas.drawLine(
@@ -73,8 +91,8 @@ class GridBackgroundPainterForAll extends CustomPainter {
             text: '${i ~/ 25}秒',
             style: TextStyle(
               height: 1,
-              color: const Color.fromARGB(255, 121, 121, 121),
-              fontSize: 16,
+              color: const Color.fromARGB(255, 99, 99, 99),
+              fontSize: 25,
               background: Paint()..color = Colors.white.withOpacity(0.5),
             ),
           ),
@@ -83,10 +101,53 @@ class GridBackgroundPainterForAll extends CustomPainter {
         textPainter.layout();
         textPainter.paint(
           canvas,
-          Offset(offsetX + 5, size.height - 20),
+          Offset(offsetX + 5, size.height - 30),
         );
       }
     }
+
+    /// 绘制电势差标识
+    const tagStartGridX = 5;
+    const tagStartGridY = -30;
+    final tagPointA =
+        Offset(xGridSize * tagStartGridX, centerY + yGridSize * tagStartGridY);
+    final tagPointB = Offset(
+        xGridSize * (tagStartGridX + 1), centerY + yGridSize * tagStartGridY);
+    final tagPointC = Offset(xGridSize * (tagStartGridX + 1),
+        centerY + yGridSize * (tagStartGridY - 5));
+    final tagPointD = Offset(xGridSize * (tagStartGridX + 3),
+        centerY + yGridSize * (tagStartGridY - 5));
+    final tagPointE = Offset(
+        xGridSize * (tagStartGridX + 3), centerY + yGridSize * tagStartGridY);
+    final tagPointF = Offset(
+        xGridSize * (tagStartGridX + 4), centerY + yGridSize * tagStartGridY);
+
+    final tagPaint = Paint()
+      ..color = const Color.fromARGB(255, 99, 99, 99)
+      ..style = PaintingStyle.stroke
+      ..strokeWidth = 3.0;
+    canvas.drawLine(tagPointA, tagPointB, tagPaint);
+    canvas.drawLine(tagPointB, tagPointC, tagPaint);
+    canvas.drawLine(tagPointC, tagPointD, tagPaint);
+    canvas.drawLine(tagPointD, tagPointE, tagPaint);
+    canvas.drawLine(tagPointE, tagPointF, tagPaint);
+    final textPainter = TextPainter(
+      text: TextSpan(
+        text: '1mV',
+        style: TextStyle(
+          height: 1,
+          color: const Color.fromARGB(255, 99, 99, 99),
+          fontSize: 20,
+          background: Paint()..color = Colors.white.withOpacity(0.5),
+        ),
+      ),
+      textDirection: TextDirection.ltr,
+    );
+    textPainter.layout();
+    textPainter.paint(
+      canvas,
+      Offset(tagPointA.dx - 8, tagPointA.dy + 10),
+    );
   }
 
   @override