GraphView中的时间标签

时间:2014-02-05 08:40:00

标签: android android-graphview

我之前发布了一个问题,关于在GraphView库中使用CustomFormatLabeler将时间显示为x-labels(https://stackoverflow.com/questions/21567853/using-customlabelformatter-to-display-time-in-x-axis)。我还是找不到解决方案,所以我尝试编辑GraphView库。我尝试了这里建议的解决方案:Using dates with the Graphview library

我修改了:

public GraphViewData(double valueX, double valueY)

通过添加第三个输入变量(String valueDate)和一个名为getTime()的方法来建议,该方法返回此字符串值。然后我修改了generateHorlabels,如下所示:

private String[] generateHorlabels(float graphwidth) {
    int numLabels = getGraphViewStyle().getNumHorizontalLabels()-1;
    if (numLabels < 0) {
        numLabels = (int) (graphwidth/(horLabelTextWidth*2));
    }

    String[] labels = new String[numLabels+1];
    double min = getMinX(false);
    double max = getMaxX(false);

    for (int i=0; i<=numLabels; i++) {
        Double temp =  min + ((max-min)*i/numLabels);
        int rounded =(int)Math.round(temp)-1;
        if(rounded < 0){
            labels[i] = " ";
        }else{
            if(graphSeries.size() > 0){
                GraphViewDataInterface[] values = graphSeries.get(0).values;
                if(values.length > rounded){
                    labels[i] = values[rounded].getTime();
                }else{
                    labels[i] = " ";
                }
            }
        }
    }
    return labels;
}

我不得不从舍入变量中减去1,因为我超出了界限错误。这比自定义格式标签器更好,因为水平标签和实时之间没有延迟。但是,在大约600个数据点之后,

rounded 

大于

的长度
values

我得到了越界错误。有没有人尝试修改GraphView库以显示成功的时间?我是java和android编程的新手,所以一些建议会很棒。谢谢你的阅读。

1 个答案:

答案 0 :(得分:0)

我发现了:

GraphViewDataInterface[] values = graphSeries.get(0).values;

达到由GraphViewData类中的appendData函数设置的maxDataCount时,

会停止增大。这就是我得到数组索引越界错误的原因。这是我的解决方案。它不是最好看的代码,但似乎有效。原始的GraphView库声明了私有的最终List graphSeries; .get(0).values来自List类。

private String[] generateHorlabels(float graphwidth) {
    int numLabels = getGraphViewStyle().getNumHorizontalLabels()-1;
    if (numLabels < 0) {
        numLabels = (int) (graphwidth/(horLabelTextWidth*2));
    }

    String[] labels = new String[numLabels+1];
    double min = getMinX(false);
    double max = getMaxX(false);
    double temp = 0;

    GraphViewDataInterface[] values = graphSeries.get(0).values;

    for (int i=0; i<=numLabels; i++) {

        if( max < values.length){
            temp =  min + ((max-min)*i/numLabels);
        }else{
            temp = (values.length - (max-min)) + ((max-min)*i/numLabels);
        }
        int rounded =(int)Math.round(temp)-1;

        if(rounded < 0){
            labels[i] = " ";
        }else{
            if(values.length > rounded){
                labels[i] = values[rounded].getTime();
            }else{
                labels[i] = " ";
            }
        }
    }
    return labels;
}

如果您正在尝试做同样的事情,请尝试一下,如果出现问题,请告诉我。我希望得到一些反馈。

编辑:我应该补充一点,你还需要一个在graphSeries.size()为0时捕获的语句。