在TeeChart中控制轴标签位置

时间:2015-03-11 09:02:56

标签: java android teechart

我在TeeChart中显示底轴的轴标签时遇到问题。 在我的情况下,轴标签相当长,并以dd.MM.yyyy

格式表示日期

在某些情况下,当标签彼此靠近放置时,它们会彼此重叠显示(发生重叠)。我为每个N值手动添加标签到轴。我该怎么做才能防止重叠?

第二个问题是第一个标签的一部分有时会显示在图表的左边界之外。因此,例如11.02.2015用户只能看到标签的一部分,例如2.2015等。如何在我的代码中检测到这种情况?

我尝试在我的图表中使用AxisLabelResolver,但我遇到的问题是AxisLabelResolver的方法未被调用。可能是什么原因?

1 个答案:

答案 0 :(得分:1)

使用自定义标签,您应该控制标签应该或不应该在什么条件下绘制。部分从图表矩形中绘制的重叠和标签是常见情况的一些例子,但我们更愿意在此类自定义工具中将此责任交给开发人员。

您可以使用它来了解字符串的大小:

int tmpWidth = tChart1.getGraphics3D().textWidth(myLabel);

您可以使用以下方法获取轴定义的矩形:

Rectangle tmpChartRect = tChart1.getChart().getChartRect();

您可以使用以下方法计算轴值的位置(

int tmpX = tChart1.getAxes().getBottom().calcPosValue(myXValue);

因此,您可以在添加下一个之前循环CustomLabels列表。即:

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并未调用自定义标签。这是按设计进行的。