demo3.dart 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. import 'package:flutter/material.dart';
  2. import 'package:flutter/rendering.dart';
  3. import 'package:luojigou_thinking_core/luojigou_thinking_core.dart';
  4. class Demo3 extends StatefulWidget {
  5. const Demo3({Key? key}) : super(key: key);
  6. @override
  7. State<Demo3> createState() => _Demo3State();
  8. }
  9. class _Demo3State extends State<Demo3> {
  10. @override
  11. Widget build(BuildContext context) {
  12. return ColoredBox(
  13. color: Colors.black,
  14. child: SingleChildScrollView(
  15. child: Padding(
  16. padding: const EdgeInsets.only(top: 20,left: 20,right: 20),
  17. child: TrapezoidBox(
  18. mainAxisSpacing: 16,
  19. padding: const EdgeInsets.symmetric(
  20. horizontal: 40,
  21. vertical: 60,
  22. ),
  23. background: Colors.white,
  24. children: const [
  25. _HitTestBox(
  26. size: Size(double.infinity, 300),
  27. ),
  28. _HitTestBox(
  29. size: Size(double.infinity, 100),
  30. ),
  31. _HitTestBox(
  32. size: Size(double.infinity, 200),
  33. ),
  34. _HitTestBox(
  35. size: Size(double.infinity, 400),
  36. ),
  37. _HitTestBox(
  38. size: Size(double.infinity, 200),
  39. ),
  40. _HitTestBox(
  41. size: Size(double.infinity, 200),
  42. ),
  43. // Container(
  44. // width: double.infinity,
  45. // height: 200,
  46. // color: Colors.green,
  47. // ),
  48. // Container(
  49. // width: double.infinity,
  50. // height: 200,
  51. // color: Colors.red,
  52. // ),
  53. // Container(
  54. // width: double.infinity,
  55. // height: 200,
  56. // color: Colors.orange,
  57. // ),
  58. ],
  59. ),
  60. ),
  61. ),
  62. );
  63. }
  64. }
  65. class _HitTestBox extends LeafRenderObjectWidget {
  66. final Size size;
  67. const _HitTestBox({
  68. this.size = Size.zero,
  69. });
  70. @override
  71. RenderObject createRenderObject(BuildContext context) {
  72. return _RenderHitTestBox(size);
  73. }
  74. @override
  75. void updateRenderObject(
  76. BuildContext context, covariant _RenderHitTestBox renderObject) {
  77. renderObject.setSize(size);
  78. }
  79. }
  80. class _RenderHitTestBox extends RenderBox {
  81. _RenderHitTestBox(this._size);
  82. Color _color = Colors.deepPurple;
  83. Size _size;
  84. void setSize(Size value) {
  85. _size = value;
  86. markNeedsLayout();
  87. }
  88. @override
  89. void performResize() {
  90. assert(false);
  91. }
  92. @override
  93. void performLayout() {
  94. size = constraints.constrain(_size);
  95. }
  96. @override
  97. bool hitTestSelf(Offset position) => size.contains(position);
  98. @override
  99. void handleEvent(PointerEvent event, BoxHitTestEntry entry) {
  100. super.handleEvent(event, entry);
  101. if (event is PointerDownEvent) {
  102. _color = Colors.yellow;
  103. } else if (event is PointerUpEvent) {
  104. _color = Colors.deepPurple;
  105. }
  106. markNeedsPaint();
  107. }
  108. @override
  109. void paint(PaintingContext context, Offset offset) {
  110. context.canvas.drawRect(offset & size, Paint()..color = _color);
  111. }
  112. }