import 'layer_controller.dart'; class LayerTrace extends GetView { const LayerTrace({ super.key, required this.onMapTrace, required this.color, }); final List onMapTrace; final Color color; @override Widget build(BuildContext context) { return SizedBox( width: context.width, height: context.height, child: Obx((){ final matrix = controller.mapTransformMatrix.value; if(matrix.isZero()){ return const SizedBox(); } final onScreenTrace = onMapTrace.reversed.map((e) => controller.mapOffsetToScreen(e)).toList(); return CustomPaint(painter: _LayerTracePainter(onScreenTrace, color)); }), ); } } class _LayerTracePainter extends CustomPainter { final List _points; final painter = Paint() ..strokeWidth = 3 ..style = PaintingStyle.stroke ..isAntiAlias = true; final Color color; _LayerTracePainter(this._points, this.color); @override void paint(Canvas canvas, Size size) { if (_points.length > 1 ) { var alpha = 255; final lineCount = _points.length - 1; final alphaStep = (alpha / lineCount).round(); for (var i = 1; i < _points.length; i++) { final p2 = _points[i]; final p1 = _points[i - 1]; painter.color = color.withAlpha(alpha); canvas.drawLine(p1, p2, painter); alpha -= alphaStep; if (alpha < 0) { alpha = 0; } } } } @override bool shouldRepaint(_LayerTracePainter oldDelegate) => false; }