import 'dart:math'; import 'dart:ui' as ui; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; ///SOS雷达扫描View class RadarView extends StatefulWidget { @override _RadarViewState createState() => _RadarViewState(); } class _RadarViewState extends State with SingleTickerProviderStateMixin { AnimationController? _controller; Animation? _animation; @override void initState() { _controller = AnimationController(vsync: this, duration: Duration(seconds: 2)); _animation = Tween(begin: .0, end: pi * 2).animate(_controller!); _controller!.repeat(); super.initState(); } @override void dispose() { _controller!.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return AnimatedBuilder( animation: _animation!, builder: (context, child) { return CustomPaint( painter: RadarPainter(_animation!.value), ); }, ); } } ///SOS雷达扫描动画 class RadarPainter extends CustomPainter { final double angle; final Paint _bgPaint = Paint() ..color = Colors.white ..strokeWidth = 1 ..style = PaintingStyle.stroke; final Paint _paint = Paint()..style = PaintingStyle.fill; int circleCount = 0; RadarPainter(this.angle); @override void paint(Canvas canvas, Size size) { var radius = min(size.width / 2, size.height / 2); // canvas.drawLine(Offset(size.width / 2, size.height / 2 - radius), // Offset(size.width / 2, size.height / 2 + radius), _bgPaint); // canvas.drawLine(Offset(size.width / 2 - radius, size.height / 2), // Offset(size.width / 2 + radius, size.height / 2), _bgPaint); for (var i = 1; i <= circleCount; ++i) { canvas.drawCircle(Offset(size.width / 2, size.height / 2), radius * i / circleCount, _bgPaint); } _paint.shader = ui.Gradient.sweep( Offset(size.width / 2, size.height / 2), [Colors.white.withOpacity(.01), Colors.yellow.withOpacity(.6)], [.0, 1.0], TileMode.clamp, .0, pi / 4); canvas.save(); double r = sqrt(pow(size.width, 2) + pow(size.height, 2)); double startAngle = atan(size.height / size.width); Point p0 = Point(r * cos(startAngle), r * sin(startAngle)); Point px = Point(r * cos(angle + startAngle), r * sin(angle + startAngle)); canvas.translate((p0.x - px.x) / 2, (p0.y - px.y) / 2); canvas.rotate(angle); canvas.drawArc( Rect.fromCircle( center: Offset(size.width / 2, size.height / 2), radius: radius), 0, pi / 4, true, _paint); canvas.restore(); } @override bool shouldRepaint(CustomPainter oldDelegate) { return true; } }