57 lines
No EOL
2.4 KiB
Dart
57 lines
No EOL
2.4 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:provider/provider.dart';
|
|
import '../core/theme_manager.dart'; // Import aggiornato
|
|
import 'dart:math' as math;
|
|
|
|
class AnimatedCyberBorder extends StatefulWidget {
|
|
final Widget child;
|
|
const AnimatedCyberBorder({super.key, required this.child});
|
|
@override
|
|
State<AnimatedCyberBorder> createState() => _AnimatedCyberBorderState();
|
|
}
|
|
|
|
class _AnimatedCyberBorderState extends State<AnimatedCyberBorder> with SingleTickerProviderStateMixin {
|
|
late AnimationController _controller;
|
|
@override
|
|
void initState() { super.initState(); _controller = AnimationController(vsync: this, duration: const Duration(seconds: 3))..repeat(); }
|
|
@override
|
|
void dispose() { _controller.dispose(); super.dispose(); }
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final theme = context.watch<ThemeManager>().currentColors;
|
|
return AnimatedBuilder(
|
|
animation: _controller,
|
|
builder: (context, child) {
|
|
return CustomPaint(
|
|
painter: CyberBorderPainter(animationValue: _controller.value, color1: theme.playerBlue, color2: theme.playerRed),
|
|
child: Container(
|
|
decoration: BoxDecoration(color: theme.background.withOpacity(0.9), borderRadius: BorderRadius.circular(15), boxShadow: [BoxShadow(color: theme.playerBlue.withOpacity(0.3), blurRadius: 25, spreadRadius: 2)]),
|
|
padding: const EdgeInsets.all(3),
|
|
child: widget.child,
|
|
),
|
|
);
|
|
},
|
|
child: widget.child,
|
|
);
|
|
}
|
|
}
|
|
|
|
class CyberBorderPainter extends CustomPainter {
|
|
final double animationValue;
|
|
final Color color1;
|
|
final Color color2;
|
|
CyberBorderPainter({required this.animationValue, required this.color1, required this.color2});
|
|
|
|
@override
|
|
void paint(Canvas canvas, Size size) {
|
|
final rect = Offset.zero & size;
|
|
final RRect rrect = RRect.fromRectAndRadius(rect, const Radius.circular(15));
|
|
final Paint paint = Paint()
|
|
..shader = SweepGradient(colors: [color1, color2, color1, color2, color1], stops: const [0.0, 0.25, 0.5, 0.75, 1.0], transform: GradientRotation(animationValue * 2 * math.pi)).createShader(rect)
|
|
..style = PaintingStyle.stroke
|
|
..strokeWidth = 4.0
|
|
..maskFilter = const MaskFilter.blur(BlurStyle.solid, 4);
|
|
canvas.drawRRect(rrect, paint);
|
|
}
|
|
@override bool shouldRepaint(covariant CyberBorderPainter oldDelegate) => oldDelegate.animationValue != animationValue;
|
|
} |