drawCoordinateAxis static method
Implementation
static void drawCoordinateAxis(
Canvas canvas,
CoordinateAxisModel coordinateAxisModel,
) {
var paint = Paint()
..isAntiAlias = true
..strokeWidth = 1
..strokeCap = StrokeCap.round
..style = PaintingStyle.stroke;
var _startY = coordinateAxisModel.baseBean.basePadding.top +
coordinateAxisModel.fixedHeight;
var _endX = coordinateAxisModel.baseBean.basePadding.left +
coordinateAxisModel.fixedWidth;
//基准线距离xy区域底部的高度
var baseLineYHeight = coordinateAxisModel.baseBean.xBaseLineY == null
? 0.0
: ((coordinateAxisModel.baseBean.xBaseLineY!.clamp(
coordinateAxisModel.baseBean.yMin,
coordinateAxisModel.baseBean.yMax) -
coordinateAxisModel.baseBean.yMin) /
(coordinateAxisModel.baseBean.yMax -
coordinateAxisModel.baseBean.yMin) *
coordinateAxisModel.fixedHeight);
var xLineY = _startY - baseLineYHeight;
canvas.drawLine(
Offset(coordinateAxisModel.baseBean.basePadding.left, xLineY),
Offset(_endX + overPadding, xLineY),
paint
..color = coordinateAxisModel.baseBean.xColor
..strokeWidth = coordinateAxisModel.baseBean.xyLineWidth); //x轴
canvas.drawLine(
Offset(coordinateAxisModel.baseBean.basePadding.left, _startY),
Offset(coordinateAxisModel.baseBean.basePadding.left,
coordinateAxisModel.baseBean.basePadding.top - overPadding),
paint
..color = coordinateAxisModel.baseBean.yColor
..strokeWidth = coordinateAxisModel.baseBean.xyLineWidth); //y轴
if (coordinateAxisModel.baseBean.units != null) {
//绘制xy轴单位内容
for (var model in coordinateAxisModel.baseBean.units!) {
var tp = TextPainter(
textAlign: TextAlign.center,
ellipsis: '.',
text: TextSpan(text: model.text, style: model.textStyle),
textDirection: TextDirection.ltr)
..layout();
var offset = Offset.zero;
switch (model.baseOrientation) {
case UnitOrientation.topLeft:
offset = Offset(
coordinateAxisModel.baseBean.basePadding.left -
model.spaceDif.dx -
tp.width,
coordinateAxisModel.baseBean.basePadding.top -
overPadding -
model.spaceDif.dy -
tp.height);
break;
case UnitOrientation.topRight:
offset = Offset(
_endX + overPadding + model.spaceDif.dx,
coordinateAxisModel.baseBean.basePadding.top -
overPadding -
model.spaceDif.dy -
tp.height);
break;
case UnitOrientation.bottomLeft:
offset = Offset(
coordinateAxisModel.baseBean.basePadding.left -
model.spaceDif.dx -
tp.width,
_startY + model.spaceDif.dy);
break;
case UnitOrientation.bottomRight:
offset = Offset(_endX + overPadding + model.spaceDif.dx,
_startY + model.spaceDif.dy);
break;
}
tp.paint(canvas, offset);
}
}
var showX = true;
var showY = true;
switch (coordinateAxisModel.xyCoordinate) {
case XYCoordinate.All:
showX = true;
showY = true;
break;
case XYCoordinate.OnlyX:
showX = true;
showY = false;
break;
case XYCoordinate.OnlyY:
showX = false;
showY = true;
break;
default:
}
if (showX) {
if (coordinateAxisModel.baseBean.isShowBorderRight) {
//最右侧垂直边界线
canvas.drawLine(
Offset(_endX, _startY),
Offset(_endX, coordinateAxisModel.baseBean.basePadding.top),
paint
..color = coordinateAxisModel.baseBean.yColor
..strokeWidth = coordinateAxisModel.baseBean.xyLineWidth);
}
for (var i = 0; i < coordinateAxisModel.xDialValues.length; i++) {
var tempXDigalModel = coordinateAxisModel.xDialValues[i];
var dw = 0.0;
if (tempXDigalModel.positionRetioy != null) {
dw = (coordinateAxisModel.fixedWidth -
2 * coordinateAxisModel.bothEndPitchX) *
tempXDigalModel.positionRetioy!; //两个点之间的x方向距离
}
if (coordinateAxisModel.baseBean.isShowX) {
//绘制x轴文本
var tpx = TextPainter(
textAlign: TextAlign.center,
ellipsis: '.',
text: TextSpan(
text: tempXDigalModel.title,
style: tempXDigalModel.titleStyle),
textDirection: TextDirection.ltr)
..layout();
//绘制文案在底部bottom内部居中显示
var transitHeight = max(
(coordinateAxisModel.baseBean.basePadding.bottom - tpx.height) /
2.0,
0.0);
tpx.paint(
canvas,
Offset(
coordinateAxisModel.baseBean.basePadding.left +
dw +
coordinateAxisModel.bothEndPitchX -
tpx.width / 2,
_startY + transitHeight));
}
if (coordinateAxisModel.baseBean.isShowHintY && i != 0) {
var xStart = coordinateAxisModel.baseBean.basePadding.left +
dw +
coordinateAxisModel.bothEndPitchX;
//y轴辅助线
var hitYPath = Path();
hitYPath
..moveTo(xStart, _startY)
..lineTo(xStart,
coordinateAxisModel.baseBean.basePadding.top - overPadding);
if (coordinateAxisModel.baseBean.isHintLineImaginary) {
canvas.drawPath(
dashPath(
hitYPath,
dashArray: CircularIntervalList<double>(<double>[5.0, 4.0]),
),
paint
..color = coordinateAxisModel.baseBean.hintLineColor
..strokeWidth = coordinateAxisModel.baseBean.hintLineWidth,
);
} else {
canvas.drawPath(
hitYPath,
paint
..color = coordinateAxisModel.baseBean.hintLineColor
..strokeWidth = coordinateAxisModel.baseBean.hintLineWidth);
}
}
if (coordinateAxisModel.baseBean.isShowXScale) {
//x轴刻度
canvas.drawLine(
Offset(
coordinateAxisModel.baseBean.basePadding.left +
dw +
coordinateAxisModel.bothEndPitchX,
xLineY +
(xLineY == _startY
? 0
: coordinateAxisModel.baseBean.rulerWidth)),
Offset(
coordinateAxisModel.baseBean.basePadding.left +
dw +
coordinateAxisModel.bothEndPitchX,
_startY - coordinateAxisModel.baseBean.rulerWidth),
paint
..color = coordinateAxisModel.baseBean.xColor
..strokeWidth = coordinateAxisModel.baseBean.xyLineWidth);
}
}
}
if (showY) {
if (coordinateAxisModel.baseBean.isShowBorderTop) {
//最顶部水平边界线
canvas.drawLine(
Offset(coordinateAxisModel.baseBean.basePadding.left,
coordinateAxisModel.baseBean.basePadding.top),
Offset(_endX, coordinateAxisModel.baseBean.basePadding.top),
paint
..color = coordinateAxisModel.baseBean.xColor
..strokeWidth = coordinateAxisModel.baseBean.xyLineWidth);
}
if (coordinateAxisModel.baseBean.yDialValues.isNotEmpty) {
for (var i = 0;
i < coordinateAxisModel.baseBean.yDialValues.length;
i++) {
var tempYModel = coordinateAxisModel.baseBean.yDialValues[i];
var yLength =
tempYModel.positionRetioy * coordinateAxisModel.fixedHeight;
var nextLength =
((i == coordinateAxisModel.baseBean.yDialValues.length - 1)
? 0.0
: coordinateAxisModel
.baseBean.yDialValues[i + 1].positionRetioy) *
coordinateAxisModel.fixedHeight;
var subLength = (yLength + nextLength) / 2;
if (tempYModel.leftSub != null) {
_drawYText(
tempYModel.leftSub!,
true,
coordinateAxisModel.baseBean.basePadding.left - 10,
_startY,
_endX,
yLength,
subLength,
canvas);
}
if (tempYModel.rightSub != null) {
_drawYText(
tempYModel.rightSub!,
false,
coordinateAxisModel.baseBean.basePadding.left - 10,
_startY,
_endX,
yLength,
subLength,
canvas);
}
if (coordinateAxisModel.baseBean.isShowHintX &&
yLength != baseLineYHeight) {
//x轴辅助线
var hitXPath = Path();
hitXPath
..moveTo(coordinateAxisModel.baseBean.basePadding.left,
_startY - yLength)
..lineTo(_endX + overPadding, _startY - yLength);
if (coordinateAxisModel.baseBean.isHintLineImaginary) {
canvas.drawPath(
dashPath(
hitXPath,
dashArray: CircularIntervalList<double>(<double>[5.0, 4.0]),
),
paint
..color = tempYModel.hintLineColor ??
coordinateAxisModel.baseBean.hintLineColor
..strokeWidth = coordinateAxisModel.baseBean.hintLineWidth);
} else {
canvas.drawPath(
hitXPath,
paint
..color = tempYModel.hintLineColor ??
coordinateAxisModel.baseBean.hintLineColor
..strokeWidth = coordinateAxisModel.baseBean.hintLineWidth);
}
}
if (coordinateAxisModel.baseBean.isShowYScale) {
//y轴刻度
canvas.drawLine(
Offset(coordinateAxisModel.baseBean.basePadding.left,
_startY - yLength),
Offset(
coordinateAxisModel.baseBean.basePadding.left +
coordinateAxisModel.baseBean.rulerWidth,
_startY - yLength),
paint
..color = coordinateAxisModel.baseBean.yColor
..strokeWidth = coordinateAxisModel.baseBean.xyLineWidth);
}
}
}
}
}