touch_gesture.dart 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. import 'package:fis_measure/interfaces/date_types/point.dart';
  2. import 'package:fis_measure/interfaces/date_types/rect.dart';
  3. import 'package:fis_measure/interfaces/date_types/rect_region.dart';
  4. import 'package:fis_measure/interfaces/process/workspace/application.dart';
  5. import 'package:fis_measure/interfaces/process/workspace/point_info.dart';
  6. import 'package:fis_measure/view/gesture/cross_position_indicator.dart';
  7. import 'package:fis_measure/view/gesture/mouse_gesture.dart';
  8. import 'package:fis_measure/view/gesture/positioned_touch_cursor.dart';
  9. import 'package:flutter/material.dart';
  10. import 'package:get/get.dart';
  11. import 'package:vid/us/vid_us_visual_area_type.dart';
  12. class MeasureTouchGesturePanel extends StatefulWidget {
  13. const MeasureTouchGesturePanel({Key? key}) : super(key: key);
  14. @override
  15. State<StatefulWidget> createState() => _MeasureTouchGesturePanelState();
  16. }
  17. class _MeasureTouchGesturePanelState extends State<MeasureTouchGesturePanel> {
  18. late final application = Get.find<IApplication>();
  19. final touchState = Get.find<ITouchPointState>();
  20. CursorDisplayType displayType = CursorDisplayType.none;
  21. RectRegion tissueTMPixelRegion = RectRegion();
  22. bool ifContainerTissueTM = false;
  23. Offset _lastPosition = Offset.zero;
  24. @override
  25. void initState() {
  26. _findMultiRegions();
  27. super.initState();
  28. }
  29. @override
  30. void dispose() {
  31. super.dispose();
  32. }
  33. @override
  34. Widget build(BuildContext context) {
  35. return GestureDetector(
  36. behavior: HitTestBehavior.opaque,
  37. onTapDown: (details) {
  38. touchState.mousePosition = details.localPosition;
  39. _handleAreaChange(details.localPosition);
  40. application.createPointInfo(
  41. details.localPosition,
  42. PointInfoType.touchDown,
  43. );
  44. },
  45. onPanDown: (details) {
  46. touchState.mousePosition = details.localPosition;
  47. _handleAreaChange(details.localPosition);
  48. application.createPointInfo(
  49. details.localPosition,
  50. PointInfoType.touchDown,
  51. );
  52. },
  53. onPanUpdate: (details) {
  54. touchState.mousePosition = details.localPosition;
  55. _handleAreaChange(details.localPosition);
  56. _lastPosition = details.localPosition;
  57. application.createPointInfo(
  58. details.localPosition,
  59. PointInfoType.touchMove,
  60. );
  61. },
  62. onTapUp: (details) {
  63. touchState.mousePosition = details.localPosition;
  64. setState(() {
  65. displayType = CursorDisplayType.normal;
  66. });
  67. application.createPointInfo(
  68. details.localPosition,
  69. PointInfoType.touchUp,
  70. );
  71. },
  72. onPanEnd: (details) {
  73. application.createPointInfo(
  74. _lastPosition,
  75. PointInfoType.touchUp,
  76. );
  77. setState(() {
  78. displayType = CursorDisplayType.normal;
  79. });
  80. },
  81. child: _buildCursor(),
  82. );
  83. }
  84. Widget _buildCursor() {
  85. switch (displayType) {
  86. case CursorDisplayType.none:
  87. return Container();
  88. case CursorDisplayType.normal:
  89. return Container();
  90. case CursorDisplayType.cross:
  91. return Stack(
  92. children: [
  93. MobileCrossIndicator(
  94. areaRegion: Rect.fromLTRB(
  95. tissueTMPixelRegion.left,
  96. tissueTMPixelRegion.top,
  97. tissueTMPixelRegion.right,
  98. tissueTMPixelRegion.bottom),
  99. ),
  100. ],
  101. );
  102. }
  103. }
  104. void _handleAreaChange(Offset pointerOffset) {
  105. if (ifContainerTissueTM) {
  106. if (tissueTMPixelRegion
  107. .containsPoint(DPoint.parseOffset(pointerOffset))) {
  108. if (displayType != CursorDisplayType.cross) {
  109. setState(() {
  110. displayType = CursorDisplayType.cross;
  111. });
  112. }
  113. } else {
  114. if (displayType != CursorDisplayType.normal) {
  115. setState(() {
  116. displayType = CursorDisplayType.normal;
  117. });
  118. }
  119. }
  120. }
  121. }
  122. void _findMultiRegions() {
  123. final displaySize = application.displaySize;
  124. for (var visual in application.visuals) {
  125. for (var area in visual.visualAreas) {
  126. if (area.visualAreaType == VidUsVisualAreaType.TissueTimeMotion ||
  127. area.visualAreaType == VidUsVisualAreaType.Doppler) {
  128. ifContainerTissueTM = true;
  129. ///TODO 由于布局问题 Left 定位给不准,这里放宽到边界
  130. tissueTMPixelRegion = RectRegion.rect(DRect(
  131. // area.displayRegion.left * displaySize.width,
  132. 0,
  133. area.displayRegion.top * displaySize.height,
  134. // area.displayRegion.width * displaySize.width,
  135. displaySize.width,
  136. area.displayRegion.height * displaySize.height,
  137. ));
  138. }
  139. }
  140. }
  141. }
  142. }