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;
canvas.drawLine(
Offset(coordinateAxisModel.baseBean.basePadding.left, _startY),
Offset(_endX + overPadding, _startY),
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.unitX != null) {
//绘制x轴单位内容
var model = coordinateAxisModel.baseBean.unitX!;
var tp = TextPainter(
textAlign: TextAlign.center,
ellipsis: '.',
text: TextSpan(text: model.text, style: model.textStyle),
textDirection: TextDirection.ltr)
..layout();
tp.paint(
canvas,
Offset(
_endX + overPadding + model.offset.dx, _startY + model.offset.dy),
);
}
if (coordinateAxisModel.baseBean.unitY != null) {
//绘制y轴单位内容
var model = coordinateAxisModel.baseBean.unitY!;
var tp = TextPainter(
textAlign: TextAlign.center,
ellipsis: '.',
text: TextSpan(text: model.text, style: model.textStyle),
textDirection: TextDirection.ltr)
..layout();
tp.paint(
canvas,
Offset(
coordinateAxisModel.baseBean.basePadding.left -
model.offset.dx -
tp.width,
coordinateAxisModel.baseBean.basePadding.top -
overPadding -
model.offset.dy -
tp.height),
);
}
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) {
//y轴辅助线
var hitYPath = Path();
hitYPath
..moveTo(
coordinateAxisModel.baseBean.basePadding.left +
dw +
coordinateAxisModel.bothEndPitchX,
_startY)
..lineTo(
coordinateAxisModel.baseBean.basePadding.left +
dw +
coordinateAxisModel.bothEndPitchX,
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,
_startY),
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];
///绘制y轴文本
var yValue = tempYModel.title;
var yLength =
tempYModel.positionRetioy * coordinateAxisModel.fixedHeight;
var tpY = TextPainter(
textAlign: TextAlign.right,
ellipsis: '.',
maxLines: 1,
text: TextSpan(text: '$yValue', style: tempYModel.titleStyle),
textDirection: TextDirection.rtl)
..layout();
tpY.paint(
canvas,
Offset(
coordinateAxisModel.baseBean.isLeftYDial
? (coordinateAxisModel.baseBean.basePadding.left -
10 -
tpY.width)
: _endX + 8,
_startY - yLength - tpY.height / 2));
var nextLength = ((i ==
coordinateAxisModel.baseBean.yDialValues.length - 1)
? 0.0
//放到最后一个,无论是哪里,都是和最后一个0的比较
// coordinateAxisModel.baseBean.yDialValues.last.positionRetioy
: coordinateAxisModel
.baseBean.yDialValues[i + 1].positionRetioy) *
coordinateAxisModel.fixedHeight;
var subLength = (yLength + nextLength) / 2;
var tpSub = TextPainter(
textAlign: TextAlign.center,
ellipsis: '.',
maxLines: 5,
text: TextSpan(
text: tempYModel.centerSubTitle,
style: tempYModel.centerSubTextStyle),
textDirection: TextDirection.ltr)
..layout();
tpSub.paint(
canvas,
Offset(
coordinateAxisModel.baseBean.isLeftYDialSub
? (coordinateAxisModel.baseBean.basePadding.left -
tpSub.width -
10)
: (_endX + 8),
_startY - subLength - tpSub.height / 2));
if (coordinateAxisModel.baseBean.isShowHintX && yLength != 0) {
//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);
}
}
}
}
}