transformValues method
Transforms the x and y values to screen coordinates.
Implementation
@override
void transformValues() {
_reset();
double degree = _degree;
double startAngle = _startAngle;
double endAngle = _endAngle;
double innerRadius = _innerRadius;
double outerRadius = _outerRadius;
if (animationFactor == 1) {
// Resets `_isLegendToggled` to `false` to handle endAngle animations during dynamically.
_isLegendToggled = false;
}
if (!_isLegendToggled &&
!degree.isNaN &&
!_endAngle.isNaN &&
!_priorEndAngle.isNaN &&
_priorEndAngle != _endAngle) {
// Handles endAngle animation when the data is reset dynamically.
endAngle = lerpDouble(_priorEndAngle, _endAngle, animationFactor)!;
degree = endAngle - startAngle;
} else {
if (!_priorInnerRadius.isNaN && !_priorOuterRadius.isNaN) {
// Handles inner and outer radius animation when the legend is toggled.
if (isVisible) {
innerRadius =
lerpDouble(_priorInnerRadius, _innerRadius, animationFactor)!;
outerRadius =
lerpDouble(_priorOuterRadius, _outerRadius, animationFactor)!;
} else {
final double halfRadii = (_priorOuterRadius + _priorInnerRadius) / 2;
endAngle = _priorEndAngle;
degree = endAngle - startAngle;
innerRadius =
_priorInnerRadius +
(halfRadii - _priorInnerRadius) * animationFactor;
outerRadius =
_priorOuterRadius -
(_priorOuterRadius - halfRadii) * animationFactor;
_innerRadius = innerRadius;
_outerRadius = outerRadius;
}
} else {
// Handles endAngle animation at load time.
degree = degree * animationFactor;
endAngle = startAngle + degree;
}
}
trackPath = calculateArcPath(
innerRadius,
outerRadius,
_center,
0,
fullAngle,
fullAngle,
isAnimate: true,
);
if (_outerRadius > 0 && degree > 0) {
final num angleDeviation = findAngleDeviation(
innerRadius,
outerRadius,
360,
);
final CornerStyle cornerStyle = series.cornerStyle;
if (cornerStyle == CornerStyle.bothCurve ||
cornerStyle == CornerStyle.startCurve) {
startAngle += angleDeviation;
}
if (cornerStyle == CornerStyle.bothCurve ||
cornerStyle == CornerStyle.endCurve) {
endAngle -= angleDeviation;
}
if (degree > 360) {
yValuePath = calculateRoundedCornerArcPath(
cornerStyle,
innerRadius,
outerRadius,
_center,
0,
fullAngle,
);
yValuePath.arcTo(
Rect.fromCircle(center: _center, radius: outerRadius),
degreesToRadians(_startAngle),
degreesToRadians(_endAngle - _startAngle),
true,
);
yValuePath.arcTo(
Rect.fromCircle(center: _center, radius: innerRadius),
degreesToRadians(_endAngle),
degreesToRadians(_startAngle) - degreesToRadians(_endAngle),
false,
);
} else {
yValuePath = calculateRoundedCornerArcPath(
cornerStyle,
innerRadius,
outerRadius,
_center,
startAngle,
endAngle,
);
}
if (degree > 360 && endAngle >= startAngle + 180) {
_calculateShadowPath(endAngle, degree, innerRadius, outerRadius);
}
}
}