touch_gesture.dart 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  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. onPanDown: (details) {
  38. touchState.touchPosition = details.localPosition;
  39. _handleAreaChange(details.localPosition);
  40. application.createPointInfo(
  41. details.localPosition,
  42. PointInfoType.touchDown,
  43. );
  44. },
  45. onPanUpdate: (details) {
  46. touchState.touchPosition = details.localPosition;
  47. _handleAreaChange(details.localPosition);
  48. _lastPosition = details.localPosition;
  49. application.createPointInfo(
  50. details.localPosition,
  51. PointInfoType.touchMove,
  52. );
  53. },
  54. onTapUp: (details) {
  55. touchState.touchPosition = details.localPosition;
  56. setState(() {
  57. displayType = CursorDisplayType.normal;
  58. });
  59. application.createPointInfo(
  60. details.localPosition,
  61. PointInfoType.touchUp,
  62. );
  63. },
  64. onPanEnd: (details) {
  65. application.createPointInfo(
  66. _lastPosition,
  67. PointInfoType.touchUp,
  68. );
  69. setState(() {
  70. displayType = CursorDisplayType.normal;
  71. });
  72. },
  73. child: _buildCursor(),
  74. );
  75. }
  76. Widget _buildCursor() {
  77. switch (displayType) {
  78. case CursorDisplayType.none:
  79. return Container();
  80. case CursorDisplayType.normal:
  81. return Container();
  82. case CursorDisplayType.cross:
  83. return Stack(
  84. children: [
  85. MobileCrossIndicator(
  86. areaRegion: Rect.fromLTRB(
  87. tissueTMPixelRegion.left,
  88. tissueTMPixelRegion.top,
  89. tissueTMPixelRegion.right,
  90. tissueTMPixelRegion.bottom),
  91. ),
  92. ],
  93. );
  94. }
  95. }
  96. void _handleAreaChange(Offset pointerOffset) {
  97. if (ifContainerTissueTM) {
  98. if (tissueTMPixelRegion
  99. .containsPoint(DPoint.parseOffset(pointerOffset))) {
  100. if (displayType != CursorDisplayType.cross) {
  101. setState(() {
  102. displayType = CursorDisplayType.cross;
  103. });
  104. }
  105. } else {
  106. if (displayType != CursorDisplayType.normal) {
  107. setState(() {
  108. displayType = CursorDisplayType.normal;
  109. });
  110. }
  111. }
  112. }
  113. }
  114. void _findMultiRegions() {
  115. final displaySize = application.displaySize;
  116. for (var visual in application.visuals) {
  117. for (var area in visual.visualAreas) {
  118. if (area.visualAreaType == VidUsVisualAreaType.TissueTimeMotion ||
  119. area.visualAreaType == VidUsVisualAreaType.Doppler) {
  120. ifContainerTissueTM = true;
  121. ///TODO 由于布局问题 Left 定位给不准,这里放宽到边界
  122. tissueTMPixelRegion = RectRegion.rect(DRect(
  123. // area.displayRegion.left * displaySize.width,
  124. 0,
  125. area.displayRegion.top * displaySize.height,
  126. // area.displayRegion.width * displaySize.width,
  127. displaySize.width,
  128. area.displayRegion.height * displaySize.height,
  129. ));
  130. }
  131. }
  132. }
  133. }
  134. }