demo2.dart 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. import 'dart:ui';
  2. import 'package:flutter/gestures.dart';
  3. import 'package:flutter/material.dart';
  4. import 'package:flutter/rendering.dart';
  5. class Demo2 extends StatefulWidget {
  6. const Demo2({Key? key}) : super(key: key);
  7. @override
  8. State<Demo2> createState() => _Demo2State();
  9. }
  10. class _Demo2State extends State<Demo2> {
  11. late ScrollController _scrollController;
  12. @override
  13. void initState() {
  14. super.initState();
  15. _scrollController = ScrollController();
  16. }
  17. @override
  18. Widget build(BuildContext context) {
  19. return Row(
  20. children: [
  21. ColoredBox(
  22. color: const Color(0xFFC8DDFF),
  23. child: SizedBox(
  24. width: 55,
  25. child: ListView.builder(
  26. itemBuilder: (context, index) {
  27. return CustomPaint(
  28. painter: index == 2 ? _Painter() : null,
  29. child: SizedBox(
  30. width: double.infinity,
  31. height: 100,
  32. child: Center(child: Text("Hello $index")),
  33. ),
  34. );
  35. },
  36. ),
  37. ),
  38. ),
  39. Expanded(
  40. child: Column(
  41. children: [
  42. Expanded(
  43. child: Container(
  44. color: Colors.yellow,
  45. ),
  46. ),
  47. const Expanded(
  48. child: TestWidget(
  49. child: TestWidget(),
  50. ),
  51. ),
  52. Expanded(
  53. child: Container(
  54. color: Colors.lightGreen,
  55. ),
  56. ),
  57. Expanded(
  58. child: Container(
  59. color: Colors.redAccent,
  60. ),
  61. ),
  62. ],
  63. ),
  64. ),
  65. ],
  66. );
  67. }
  68. }
  69. const double _width = 18.74;
  70. const double _height = 158.41;
  71. class _Painter extends CustomPainter {
  72. @override
  73. void paint(Canvas canvas, Size size) {
  74. canvas.drawCircle(
  75. Offset(size.width - 5 - 2, size.height / 2),
  76. 2,
  77. Paint()..color = Colors.green,
  78. );
  79. var path = Path();
  80. path.reset();
  81. path.moveTo(size.width, size.height / 2 - 20);
  82. path.lineTo(size.width + 20, size.height / 2);
  83. path.lineTo(size.width, size.height / 2 + 20);
  84. path.close();
  85. canvas.drawPath(
  86. path,
  87. Paint()
  88. ..color = Colors.blue
  89. ..style = PaintingStyle.fill,
  90. );
  91. // canvas.drawRect(Offset.zero & size, Paint()..color = Colors.green);
  92. }
  93. @override
  94. bool shouldRepaint(covariant CustomPainter oldDelegate) => true;
  95. }
  96. class TestWidget extends SingleChildRenderObjectWidget {
  97. const TestWidget({
  98. Key? key,
  99. Widget? child,
  100. }) : super(key: key, child: child);
  101. @override
  102. RenderObject createRenderObject(BuildContext context) {
  103. return _RenderTest();
  104. }
  105. }
  106. class _RenderTest extends RenderBox with RenderObjectWithChildMixin<RenderBox> {
  107. @override
  108. void performLayout() {
  109. child?.layout(constraints.deflate(const EdgeInsets.all(20)));
  110. size = constraints.constrain(Size.infinite);
  111. }
  112. @override
  113. Size computeDryLayout(BoxConstraints constraints) {
  114. return constraints.constrain(Size.infinite);
  115. Listener listener;
  116. }
  117. @override
  118. void paint(PaintingContext context, Offset offset) {
  119. super.paint(context, offset);
  120. Color color;
  121. if (parent is _RenderTest) {
  122. if (_touchOffset != null) {
  123. color = Colors.black;
  124. } else {
  125. color = Colors.red;
  126. }
  127. } else {
  128. if (_touchOffset != null) {
  129. color = Colors.tealAccent;
  130. } else {
  131. color = Colors.deepPurple;
  132. }
  133. }
  134. context.canvas.drawRect(offset & size, Paint()
  135. ..color = color);
  136. if (child != null) {
  137. context.paintChild(child!, offset);
  138. }
  139. }
  140. @override
  141. bool hitTestChildren(BoxHitTestResult result, {required Offset position}) {
  142. if(child != null){
  143. return child!.hitTest(result, position: position);
  144. }
  145. return super.hitTestChildren(result, position: position);
  146. }
  147. @override
  148. bool hitTestSelf(Offset position) => size.contains(position);
  149. Offset? _touchOffset;
  150. GestureRecognizer gestureDetector = TapGestureRecognizer()
  151. ..onTap = () {
  152. debugPrint("TapGestureRecognizer onTap");
  153. }
  154. ..onTapDown = (details) {
  155. debugPrint("TapGestureRecognizer onTapDown");
  156. }
  157. ..onTapUp = (details) {
  158. debugPrint("TapGestureRecognizer onTapUp");
  159. }
  160. ..onTapCancel = () {
  161. debugPrint("TapGestureRecognizer onTapCancel");
  162. };
  163. @override
  164. void handleEvent(PointerEvent event, covariant HitTestEntry entry) {
  165. debugPrint(event.runtimeType.toString());
  166. debugPrint(event.position.toString());
  167. if (event is PointerDownEvent) {
  168. _touchOffset = event.localPosition;
  169. gestureDetector.addPointer(event);
  170. } else if (event is PointerMoveEvent) {
  171. _touchOffset = event.localPosition;
  172. } else {
  173. _touchOffset = null;
  174. }
  175. markNeedsPaint();
  176. }
  177. }