控制 TeeChart 中的轴标签位置
Controlling axis labels position in TeeChart
我在 TeeChart 中显示底轴的轴标签时遇到问题。
在我的例子中,轴标签相当长并且以 dd.MM.yyyy
格式表示日期
在某些情况下,当标签彼此靠近放置时,它们会一个一个地显示在另一个之上(发生重叠)。我为每个 N 值手动向轴添加标签。我能做些什么来防止重叠?
第二个问题是第一个标签的部分有时会显示在图表的左边界之外。因此,例如11.02.2015 用户只能看到标签的一部分,例如2.2015 等。如何在我的代码中检测到此类情况?
我曾尝试在我的图表中使用 AxisLabelResolver
,但我 运行 遇到 AxisLabelResolver
的方法未被调用的问题。可能是什么原因?
使用自定义标签,您应该控制在什么条件下应该或不应该绘制标签。重叠和部分绘制在图表矩形之外的标签是需要控制的常见情况的示例,但我们更愿意将此责任交给此类自定义工具中的开发人员。
您可以使用它来了解字符串的大小:
int tmpWidth = tChart1.getGraphics3D().textWidth(myLabel);
你可以得到由坐标轴定义的矩形:
Rectangle tmpChartRect = tChart1.getChart().getChartRect();
您可以使用以下方法计算轴值的位置(以像素为单位):
int tmpX = tChart1.getAxes().getBottom().calcPosValue(myXValue);
因此您可以在添加下一个之前循环自定义标签列表。即:
private void addXCustomLabel(double myXValue, String myLabel) {
boolean overlaps = false;
tChart1.getGraphics3D().setFont(tChart1.getAxes().getBottom().getLabels().getFont());
int tmpWidth = tChart1.getGraphics3D().textWidth(myLabel);
int tmpX = tChart1.getAxes().getBottom().calcPosValue(myXValue) - tmpWidth / 2;
for (int i=0; i<tChart1.getAxes().getBottom().getCustomLabels().size(); i++) {
AxisLabelItem tmpI =tChart1.getAxes().getBottom().getCustomLabels().getItem(i);
int tmpWidth2 = tChart1.getGraphics3D().textWidth(tmpI.getText());
int tmpX2 = tChart1.getAxes().getBottom().calcPosValue(tmpI.getValue()) - tmpWidth2 / 2;
if (((tmpX>tmpX2) && (tmpX<tmpX2+tmpWidth2)) ||
((tmpX+tmpWidth>tmpX2) && (tmpX+tmpWidth<tmpX2+tmpWidth2)) ||
((tmpX<tmpX2) && (tmpX+tmpWidth>tmpX2+tmpWidth2))) {
overlaps = true;
}
}
Rectangle chartRect = tChart1.getChart().getChartRect();
if ((!overlaps) && (tmpX>chartRect.x) && (tmpX+tmpWidth<chartRect.x+chartRect.width)) {
tChart1.getAxes().getBottom().getCustomLabels().add(myXValue, myLabel);
}
}
这里唯一的问题是calcPosValue需要绘制一次图表才能正常工作。而且,由于 Android 控制重绘,诀窍是在 chartPainted 事件中执行此操作,并删除执行此操作的事件以不重复该过程。即:
private void createCustomLabels() {
tChart1.addChartPaintListener(new ChartPaintAdapter() {
@Override
public void chartPainted(ChartDrawEvent e) {
for (int i=0; i<tChart1.getAxes().getBottom().getMaximum(); i++) {
addXCustomLabel(i, "Value " + i + " here");
}
tChart1.removeChartPaintListener(this);
tChart1.refreshControl();
}
});
}
如您所见,自定义标签不会调用 AxisLabelResolver。这是每个设计。
我在 TeeChart 中显示底轴的轴标签时遇到问题。 在我的例子中,轴标签相当长并且以 dd.MM.yyyy
格式表示日期在某些情况下,当标签彼此靠近放置时,它们会一个一个地显示在另一个之上(发生重叠)。我为每个 N 值手动向轴添加标签。我能做些什么来防止重叠?
第二个问题是第一个标签的部分有时会显示在图表的左边界之外。因此,例如11.02.2015 用户只能看到标签的一部分,例如2.2015 等。如何在我的代码中检测到此类情况?
我曾尝试在我的图表中使用 AxisLabelResolver
,但我 运行 遇到 AxisLabelResolver
的方法未被调用的问题。可能是什么原因?
使用自定义标签,您应该控制在什么条件下应该或不应该绘制标签。重叠和部分绘制在图表矩形之外的标签是需要控制的常见情况的示例,但我们更愿意将此责任交给此类自定义工具中的开发人员。
您可以使用它来了解字符串的大小:
int tmpWidth = tChart1.getGraphics3D().textWidth(myLabel);
你可以得到由坐标轴定义的矩形:
Rectangle tmpChartRect = tChart1.getChart().getChartRect();
您可以使用以下方法计算轴值的位置(以像素为单位):
int tmpX = tChart1.getAxes().getBottom().calcPosValue(myXValue);
因此您可以在添加下一个之前循环自定义标签列表。即:
private void addXCustomLabel(double myXValue, String myLabel) {
boolean overlaps = false;
tChart1.getGraphics3D().setFont(tChart1.getAxes().getBottom().getLabels().getFont());
int tmpWidth = tChart1.getGraphics3D().textWidth(myLabel);
int tmpX = tChart1.getAxes().getBottom().calcPosValue(myXValue) - tmpWidth / 2;
for (int i=0; i<tChart1.getAxes().getBottom().getCustomLabels().size(); i++) {
AxisLabelItem tmpI =tChart1.getAxes().getBottom().getCustomLabels().getItem(i);
int tmpWidth2 = tChart1.getGraphics3D().textWidth(tmpI.getText());
int tmpX2 = tChart1.getAxes().getBottom().calcPosValue(tmpI.getValue()) - tmpWidth2 / 2;
if (((tmpX>tmpX2) && (tmpX<tmpX2+tmpWidth2)) ||
((tmpX+tmpWidth>tmpX2) && (tmpX+tmpWidth<tmpX2+tmpWidth2)) ||
((tmpX<tmpX2) && (tmpX+tmpWidth>tmpX2+tmpWidth2))) {
overlaps = true;
}
}
Rectangle chartRect = tChart1.getChart().getChartRect();
if ((!overlaps) && (tmpX>chartRect.x) && (tmpX+tmpWidth<chartRect.x+chartRect.width)) {
tChart1.getAxes().getBottom().getCustomLabels().add(myXValue, myLabel);
}
}
这里唯一的问题是calcPosValue需要绘制一次图表才能正常工作。而且,由于 Android 控制重绘,诀窍是在 chartPainted 事件中执行此操作,并删除执行此操作的事件以不重复该过程。即:
private void createCustomLabels() {
tChart1.addChartPaintListener(new ChartPaintAdapter() {
@Override
public void chartPainted(ChartDrawEvent e) {
for (int i=0; i<tChart1.getAxes().getBottom().getMaximum(); i++) {
addXCustomLabel(i, "Value " + i + " here");
}
tChart1.removeChartPaintListener(this);
tChart1.refreshControl();
}
});
}
如您所见,自定义标签不会调用 AxisLabelResolver。这是每个设计。