|
@@ -0,0 +1,59 @@
|
|
|
+import 'package:flutter/material.dart';
|
|
|
+import 'package:flutter/rendering.dart';
|
|
|
+
|
|
|
+class TrapezoidBox extends MultiChildRenderObjectWidget {
|
|
|
+ TrapezoidBox({
|
|
|
+ Key? key,
|
|
|
+ required List<Widget> children,
|
|
|
+ }) : super(key: key, children: children);
|
|
|
+
|
|
|
+ @override
|
|
|
+ RenderObject createRenderObject(BuildContext context) {
|
|
|
+ return _RenderTrapezoidBox();
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+class TrapezoidParentData extends ContainerBoxParentData<RenderBox> {
|
|
|
+ Offset a = Offset.zero;
|
|
|
+ Offset b = Offset.zero;
|
|
|
+ Offset c = Offset.zero;
|
|
|
+ Offset d = Offset.zero;
|
|
|
+}
|
|
|
+
|
|
|
+class _RenderTrapezoidBox extends RenderBox
|
|
|
+ with
|
|
|
+ ContainerRenderObjectMixin<RenderBox, TrapezoidParentData>,
|
|
|
+ RenderBoxContainerDefaultsMixin<RenderBox, TrapezoidParentData> {
|
|
|
+ @override
|
|
|
+ void setupParentData(covariant RenderObject child) {
|
|
|
+ if (child.parentData is! TrapezoidParentData) {
|
|
|
+ child.parentData = TrapezoidParentData();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @override
|
|
|
+ void performLayout() {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ @override
|
|
|
+ void paint(PaintingContext context, Offset offset) {
|
|
|
+ for (var child in getChildrenAsList()) {
|
|
|
+ _paintChild(context, offset, child);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ void _paintChild(PaintingContext context, Offset offset, RenderBox child) {
|
|
|
+ TrapezoidParentData parentData = child.parentData as TrapezoidParentData;
|
|
|
+
|
|
|
+ context.canvas.save();
|
|
|
+ Path path = Path();
|
|
|
+ path.moveTo(parentData.a.dx, parentData.a.dy);
|
|
|
+ path.lineTo(parentData.b.dx, parentData.b.dy);
|
|
|
+ path.lineTo(parentData.c.dx, parentData.c.dy);
|
|
|
+ path.lineTo(parentData.d.dx, parentData.d.dy);
|
|
|
+ path.close();
|
|
|
+ context.canvas.clipPath(path);
|
|
|
+ context.canvas.restore();
|
|
|
+ }
|
|
|
+}
|