layer_trace.dart 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import 'layer_controller.dart';
  2. class LayerTrace extends GetView<LayerController> {
  3. const LayerTrace({
  4. super.key,
  5. required this.onMapTrace,
  6. required this.color,
  7. });
  8. final List<Offset> onMapTrace;
  9. final Color color;
  10. @override
  11. Widget build(BuildContext context) {
  12. return SizedBox(
  13. width: context.width,
  14. height: context.height,
  15. child: Obx((){
  16. final matrix = controller.mapTransformMatrix.value;
  17. if(matrix.isZero()){
  18. return const SizedBox();
  19. }
  20. final onScreenTrace = onMapTrace.reversed.map((e) =>
  21. controller.mapOffsetToScreen(e)).toList();
  22. return CustomPaint(painter: _LayerTracePainter(onScreenTrace, color));
  23. }),
  24. );
  25. }
  26. }
  27. class _LayerTracePainter extends CustomPainter {
  28. final List<Offset> _points;
  29. final painter = Paint()
  30. ..strokeWidth = 3
  31. ..style = PaintingStyle.stroke
  32. ..isAntiAlias = true;
  33. final Color color;
  34. _LayerTracePainter(this._points, this.color);
  35. @override
  36. void paint(Canvas canvas, Size size) {
  37. if (_points.length > 1 ) {
  38. var alpha = 255;
  39. final lineCount = _points.length - 1;
  40. final alphaStep = (alpha / lineCount).round();
  41. for (var i = 1; i < _points.length; i++) {
  42. final p2 = _points[i];
  43. final p1 = _points[i - 1];
  44. painter.color = color.withAlpha(alpha);
  45. canvas.drawLine(p1, p2, painter);
  46. alpha -= alphaStep;
  47. if (alpha < 0) {
  48. alpha = 0;
  49. }
  50. }
  51. }
  52. }
  53. @override
  54. bool shouldRepaint(_LayerTracePainter oldDelegate) => false;
  55. }