drawLineTick method

void drawLineTick(
  1. Canvas canvas,
  2. Paint paint,
  3. Offset start,
  4. Offset end,
  5. List<String> ticks,
)

绘制直线上的Tick(直线可能是斜线) 如果ticks 只有一个则居中 大于等于2则在首尾均匀分布

Implementation

void drawLineTick(Canvas canvas, Paint paint, Offset start, Offset end, List<String> ticks) {
  if (ticks.isEmpty || !show) {
    return;
  }
  num b2 = length * length;
  num b4 = (length + labelPadding) * (length + labelPadding);
  int maxLimit = ticks.length;
  int tickCount = ticks.length;
  if (ticks.length == 1) {
    maxLimit += 1;
  } else {
    tickCount -= 1;
  }

  double tickXInterval = (end.dx - start.dx) / tickCount;
  double tickYInterval = (end.dy - start.dy) / tickCount;

  for (int i = 0; i < maxLimit; i++) {
    Offset o1 = Offset(start.dx + i * tickXInterval, start.dy + i * tickYInterval);
    Offset o2 = Offset(start.dx + (i + 1) * tickXInterval, start.dy + (i + 1) * tickYInterval);
    //计算轴线夹角
    double lineAngle = o2.offsetAngle(Offset(start.dx, 0));
    double distance = o1.distance2(start);
    double c2 = distance * distance + b2;
    double c = sqrt(c2);
    //夹角
    double angle = atan(length / distance) * 180 / pi;
    double resultAngle = inside ? (lineAngle - angle) : (lineAngle + angle);
    if (resultAngle < 0) {
      resultAngle += 360;
    }

    //Tick End position
    Offset o3 = circlePoint(c, resultAngle, start);
    lineStyle.drawPolygon(canvas, paint, [o1, o3]);

    if (i >= ticks.length) {
      continue;
    }

    ///计算文本绘制点
    if (ticks.length == 1) {
      distance = Offset(start.dx + (i + 0.5) * tickXInterval, start.dy + (i + 0.5) * tickYInterval).distance2(start);
      o2 = Offset(start.dx + (i + 1.5) * tickXInterval, start.dy + (i + 1.5) * tickYInterval);
      lineAngle = o2.offsetAngle(Offset(start.dx, 0));
    }

    c2 = distance * distance + b4;
    c = sqrt(c2);
    angle = atan((length + labelPadding) / distance) * 180 / pi;
    resultAngle = inside ? (lineAngle - angle) : (lineAngle + angle);
    if (resultAngle < 0) {
      resultAngle += 360;
    }
    Offset textOffset = circlePoint(c, resultAngle, start);
    TextDrawConfig config = TextDrawConfig(textOffset, align: toAlignment(lineAngle + 90, inside));
    labelStyle.draw(canvas, paint, ticks[i], config);
  }
}