51 lines
1.3 KiB
Dart
51 lines
1.3 KiB
Dart
|
|
import 'package:flutter/material.dart';
|
||
|
|
|
||
|
|
import 'guide_frame.dart';
|
||
|
|
|
||
|
|
/// Circular shooting guide overlay.
|
||
|
|
class GuideOverlay extends StatelessWidget {
|
||
|
|
const GuideOverlay({super.key, required this.size});
|
||
|
|
|
||
|
|
final Size size;
|
||
|
|
|
||
|
|
@override
|
||
|
|
Widget build(BuildContext context) {
|
||
|
|
return CustomPaint(
|
||
|
|
size: size,
|
||
|
|
painter: _GuidePainter(),
|
||
|
|
);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
class _GuidePainter extends CustomPainter {
|
||
|
|
@override
|
||
|
|
void paint(Canvas canvas, Size size) {
|
||
|
|
final rect = GuideFrame.inViewport(size);
|
||
|
|
final dim = Paint()..color = Colors.black.withOpacity(0.45);
|
||
|
|
final path = Path()
|
||
|
|
..addRect(Offset.zero & size)
|
||
|
|
..addOval(rect)
|
||
|
|
..fillType = PathFillType.evenOdd;
|
||
|
|
canvas.drawPath(path, dim);
|
||
|
|
|
||
|
|
final border = Paint()
|
||
|
|
..style = PaintingStyle.stroke
|
||
|
|
..strokeWidth = 2
|
||
|
|
..color = Colors.white70;
|
||
|
|
canvas.drawOval(rect, border);
|
||
|
|
|
||
|
|
// Crosshair ticks
|
||
|
|
final tick = Paint()
|
||
|
|
..style = PaintingStyle.stroke
|
||
|
|
..strokeWidth = 2
|
||
|
|
..color = const Color(0xFFEAB308);
|
||
|
|
final c = rect.center;
|
||
|
|
const len = 14.0;
|
||
|
|
canvas.drawLine(Offset(c.dx - len, c.dy), Offset(c.dx + len, c.dy), tick);
|
||
|
|
canvas.drawLine(Offset(c.dx, c.dy - len), Offset(c.dx, c.dy + len), tick);
|
||
|
|
}
|
||
|
|
|
||
|
|
@override
|
||
|
|
bool shouldRepaint(covariant CustomPainter oldDelegate) => false;
|
||
|
|
}
|