import 'dart:math'; import 'package:flutter/material.dart'; /// /// desc: /// class WaterRipple extends StatefulWidget { final Color color; final Duration duration; final Curve curve; final int count; const WaterRipple( {Key? key, this.color = Colors.white, this.count = 3, this.duration = const Duration(milliseconds: 800), this.curve = Curves.linear}) : super(key: key); @override _WaterRippleState createState() => _WaterRippleState(); } class _WaterRippleState extends State with SingleTickerProviderStateMixin { late AnimationController _controller; late Animation _animation; @override void initState() { _controller = AnimationController(vsync: this, duration: widget.duration) ..repeat(); _animation = CurveTween(curve: widget.curve).animate(_controller); super.initState(); } @override void dispose() { _controller.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return AnimatedBuilder( animation: _controller, builder: (context, child) { return CustomPaint( painter: WaterRipplePainter(_animation.value, count: widget.count, color: widget.color), ); }, ); } } class WaterRipplePainter extends CustomPainter { final double progress; final int count; final Color color; Paint _paint = Paint()..style = PaintingStyle.fill; WaterRipplePainter(this.progress, {this.count = 3, this.color = const Color(0xFF0080ff)}); @override void paint(Canvas canvas, Size size) { double radius = min(size.width / 2, size.height / 2); for (int i = count; i >= 0; i--) { final double opacity = (1.0 - ((i + progress) / (count + 1))); final Color _color = color.withOpacity(opacity); _paint..color = _color; double _radius = radius * ((i + progress) / (count + 1)); canvas.drawCircle( Offset(size.width / 2, size.height / 2), _radius, _paint); } } @override bool shouldRepaint(covariant WaterRipplePainter old) { return progress != old.progress || color != old.color || count != old.count; } }