import 'package:flutter/material.dart'; class MyCircularProgressIndicator extends StatefulWidget { final Color backgroundColor; final double size; final Color progressColor; final double strokeWidth; const MyCircularProgressIndicator({ super.key, this.backgroundColor = Colors.transparent, this.size = 110, this.progressColor = Colors.blue, this.strokeWidth = 3.0, }); @override State createState() => _MyCircularProgressIndicatorState(); } class _MyCircularProgressIndicatorState extends State with SingleTickerProviderStateMixin { late AnimationController _controller; late Animation _scaleAnimation; late Animation _rotationAnimation; @override void initState() { super.initState(); _controller = AnimationController( duration: const Duration(seconds: 2), vsync: this, )..repeat(reverse: true); _scaleAnimation = Tween( begin: 0.95, end: 1.05, ).animate(CurvedAnimation( parent: _controller, curve: Curves.easeInOut, )); _rotationAnimation = Tween( begin: 0, end: 2, ).animate(CurvedAnimation( parent: _controller, curve: Curves.linear, )); } @override void dispose() { _controller.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return Center( child: AnimatedBuilder( animation: _controller, builder: (context, child) { return Transform.scale( scale: _scaleAnimation.value, child: Container( width: widget.size, height: widget.size, decoration: BoxDecoration( color: widget.backgroundColor, shape: BoxShape.circle, boxShadow: [ BoxShadow( color: widget.progressColor.withAlpha(30), blurRadius: 12, spreadRadius: 2, ), ], ), child: Stack( alignment: Alignment.center, children: [ // Outer rotating progress indicator Transform.rotate( angle: _rotationAnimation.value * 3.14, child: CircularProgressIndicator( strokeWidth: widget.strokeWidth, valueColor: AlwaysStoppedAnimation( widget.progressColor, ), ), ), // Inner static progress indicator CircularProgressIndicator( strokeWidth: widget.strokeWidth * 0.7, valueColor: AlwaysStoppedAnimation( widget.progressColor.withAlpha(150), ), ), // Logo container with scale animation ScaleTransition( scale: Tween( begin: 0.9, end: 1.0, ).animate(CurvedAnimation( parent: _controller, curve: Curves.easeInOut, )), child: Container( width: widget.size * 0.7, height: widget.size * 0.7, decoration: BoxDecoration( shape: BoxShape.circle, color: widget.backgroundColor, ), child: Image.asset( 'assets/images/logo.gif', fit: BoxFit.contain, ), ), ), ], ), ), ); }, ), ); } }