Files
flutterApp/lib/features/home/presentation/widgets/map/HeadingPointer.dart

58 lines
1.9 KiB
Dart
Raw Normal View History

2026-02-25 20:36:46 +08:00
import 'dart:math';
import 'package:flutter/material.dart';
class HeadingMarkerPainter extends CustomPainter {
final double headingAngle; // 航向角(度)
HeadingMarkerPainter({required this.headingAngle});
@override
void paint(Canvas canvas, Size size) {
// 中心点坐标(对应SVG的cx=20, cy=20)
final center = Offset(size.width / 2, size.height / 2);
// 圆圈半径(对应SVG的r=10)
final circleRadius = 10.0;
// ========== 1. 绘制绿色半透明圆圈(SVG的circle) ==========
final circlePaint = Paint()
..color = const Color(0xFF1AFA29)
.withOpacity(0.7) // #1afa29 70%透明度
..style = PaintingStyle.fill;
canvas.drawCircle(center, circleRadius, circlePaint);
// 绘制白色描边(SVG的stroke="#fff" stroke-width="2")
final strokePaint = Paint()
..color = Colors.white
..style = PaintingStyle.stroke
..strokeWidth = 2.0;
canvas.drawCircle(center, circleRadius, strokePaint);
// ========== 2. 绘制航向箭头(SVG的path) ==========
// 保存画布状态(旋转后恢复)
canvas.save();
// 平移+旋转:以圆心为旋转中心,根据航向角旋转(对应SVG的transform)
canvas.translate(center.dx, center.dy);
canvas.rotate(headingAngle * pi / 180); // 角度转弧度
// 箭头路径(对应SVG的d="M0,-8 L4,4 L0,1 L-4,4 Z")
final arrowPath = Path()
..moveTo(0, -8) // 顶部顶点
..lineTo(4, 4) // 右侧点
..lineTo(0, 1) // 中下点
..lineTo(-4, 4) // 左侧点
..close(); // 闭合路径
final arrowPaint = Paint()..color = Colors.white;
canvas.drawPath(arrowPath, arrowPaint);
// 恢复画布状态
canvas.restore();
}
@override
bool shouldRepaint(covariant HeadingMarkerPainter oldDelegate) {
// 航向角变化时重新绘制
return oldDelegate.headingAngle != headingAngle;
}
}