I was searching for a way to make a spinner effect with dots opacities. Are there any way on how to make correct animation?
What I’ve tried:
- Add rotation – not correct animation;
- Add animation value on dot opacity computing;
import 'dart:math' as math;
import 'package:flutter/material.dart';
class DotCircleProgressbarPainter extends CustomPainter {
DotCircleProgressbarPainter(
{required this.color,
required this.strokeWidth,
required this.animation,
this.numberOfVisibleCircles = 9,
this.numberOfCircles = 10})
: super(repaint: animation);
final Color color;
final double strokeWidth;
final int numberOfCircles;
final int numberOfVisibleCircles;
final Animation<double> animation;
@override
void paint(Canvas canvas, Size size) {
final radius = size.width / 2;
final dotSpacing = (2 * math.pi) / numberOfCircles;
for (int pos = 0; pos < numberOfCircles; pos++) {
final dotOpacity =
(1.0 - pos / (numberOfVisibleCircles - 1)).clamp(0.0, 1.0);
final dotPaint = Paint()
..color = color.withOpacity(dotOpacity)
..strokeWidth = strokeWidth
..style = PaintingStyle.fill;
final double angle = pos * dotSpacing;
final double x = radius + radius * math.cos(angle + math.pi);
final double y = radius + radius * math.sin(angle + math.pi);
canvas.drawCircle(Offset(x, y), strokeWidth / 2, dotPaint);
}
}
@override
bool shouldRepaint(DotCircleProgressbarPainter oldDelegate) {
return true;
}
}
Example image:
Thanks for help!
2
Answers
You need to adjust the opacity of the dots based on the current animation value.
Modified
paint()
:here you have a simple
StatefulWidget
using aCustomPaint
:and you can use it like this (if you want infinite simulation replace
16
which isendDistance
inGravitySimulation
ctor withdouble.infinity
: