Files
UUVPN/source/lib/widgets/waterrepper.dart
T
Zeus 1bf69048f3 update ios project
update ios project
2024-07-24 11:51:39 +08:00

91 lines
2.1 KiB
Dart

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<WaterRipple>
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;
}
}