draw method

  1. @override
void draw(
  1. Canvas canvas,
  2. ChartsState state
)

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