Files
MWClash/lib/widgets/loading.dart
chen08209 31de2e51bc Fix windows some issues
Optimize overwrite handle

Optimize access control page

Optimize some details
2025-12-09 16:28:10 +08:00

96 lines
2.4 KiB
Dart

import 'package:flutter/material.dart';
class CommonCircleLoading extends StatefulWidget {
final Color? color;
const CommonCircleLoading({super.key, this.color});
@override
State<CommonCircleLoading> createState() => _CommonCircleLoadingState();
}
class _CommonCircleLoadingState extends State<CommonCircleLoading>
with TickerProviderStateMixin {
late AnimationController _rotateController;
late AnimationController _pointsController;
late Animation<double> _pointsAnimation;
@override
void initState() {
super.initState();
_rotateController = AnimationController(
duration: const Duration(seconds: 3),
vsync: this,
)..repeat();
_pointsController = AnimationController(
duration: const Duration(seconds: 1),
vsync: this,
)..repeat(reverse: true);
_pointsAnimation = Tween<double>(begin: 3.0, end: 9.0).animate(
CurvedAnimation(parent: _pointsController, curve: Curves.easeInOut),
);
}
@override
void dispose() {
_rotateController.dispose();
_pointsController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
final color = widget.color ?? Theme.of(context).colorScheme.primary;
return RepaintBoundary(
child: RotationTransition(
turns: _rotateController,
child: SizedBox.expand(
child: AnimatedBuilder(
animation: _pointsController,
builder: (context, child) {
return CustomPaint(
painter: _StarPainter(
points: _pointsAnimation.value,
color: color,
),
);
},
),
),
),
);
}
}
class _StarPainter extends CustomPainter {
final double points;
final Color color;
final Paint _paint;
_StarPainter({required this.points, required this.color})
: _paint = Paint()..color = color;
@override
void paint(Canvas canvas, Size size) {
final rect = Offset.zero & size;
final starBorder = StarBorder(
points: points,
innerRadiusRatio: 0.8,
pointRounding: 0.5,
valleyRounding: 0.1,
squash: 0.5,
);
final path = starBorder.getOuterPath(rect);
canvas.drawPath(path, _paint);
}
@override
bool shouldRepaint(covariant _StarPainter oldDelegate) {
return oldDelegate.points != points || oldDelegate.color != color;
}
}