draw method
Implementation
@override
void draw(Canvas canvas, ChartsState state) {
if (_total == 0) {
return;
}
_ChartCircularCoordinateState layout = state.layout as _ChartCircularCoordinateState;
Offset center = layout.center;
double radius = layout.radius;
List<ChartItemLayoutState>? lastLayoutState = getLastData(state.animal && layout.controlValue < 1);
//开始画扇形
double startAngle = this.startAngle;
List<ChartItemLayoutState> childrenLayoutState = [];
assert(colors.length >= data.length);
assert(shaders == null || shaders!.length >= data.length);
int index = 0;
for (int i = 0; i < data.length; i++) {
T item = data[i];
//直接读取
num percent = _values[i] / _total;
num currentPercent = percent;
//tween动画
if (state.animal && layout.controlValue < 1) {
num? lastPercent;
if (lastLayoutState != null && index < lastLayoutState.length) {
lastPercent = lastLayoutState[i].yValue;
}
//初始动画x轴不动
currentPercent = ui.lerpDouble(lastPercent, percent, layout.controlValue) ?? 0;
}
// 计算出每个数据所占的弧度值
final sweepAngle = currentPercent * math.pi * 2 * (direction == RotateDirection.forward ? 1 : -1);
double rd = radius;
//图形区域
ChartItemLayoutState shape = ChartItemLayoutState.arc(center: center, startAngle: startAngle, sweepAngle: sweepAngle, innerRadius: holeRadius, outRadius: rd);
shape.yValue = percent;
childrenLayoutState.add(shape);
//放大区域
ChartItemLayoutState tapShape = shape;
//判断是否选中
bool selected = enableTap && chartState.selectedIndex == i;
if (selected) {
rd = radius + 2;
tapShape = ChartItemLayoutState.arc(center: center, startAngle: startAngle, sweepAngle: sweepAngle, innerRadius: holeRadius, outRadius: rd);
}
if (shaders != null) {
_paint.shader = shaders![i];
} else {
_paint.color = colors[i];
}
drawPie(canvas, tapShape.path!, _paint);
//绘制间隙
_drawSpaceLine(layout, canvas, rd, startAngle, sweepAngle);
String? valueText = valueFormatter?.call(item);
String? legend = legendFormatter?.call(item);
//绘制引导线
if (guideLine && layout.controlValue == 1) {
_drawLineAndText(layout, canvas, valueText, legend, index, rd, startAngle, sweepAngle);
}
//选中就绘制
if (selected) {
_drawCenterValue(layout, canvas, valueText);
}
//画圆弧
// baseChart.canvas.drawArc(
// newRect, startAngle, sweepAngle, true, paint..color = colors[i]);
// _drawLegend(item, radius, startAngle, sweepAngle);
if (showValue && layout.controlValue == 1) {
_drawValue(state, canvas, valueText, radius, startAngle, sweepAngle);
}
//继续下一个
startAngle = startAngle + sweepAngle;
index++;
}
chartState.children = childrenLayoutState;
}