Метки времени в GraphView

Ранее я задавал вопрос об использовании CustomFormatLabeler в библиотеке GraphView для отображения времени в виде x-меток (https://stackoverflow.com/questions/21567853/using-customlabelformatter-to-display-time-in-x-axis). Я до сих пор не могу найти решение, поэтому я попытался отредактировать библиотеку GraphView. Я попробовал решение, предложенное здесь: Использование дат с библиотекой Graphview

Я изменил:

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, поэтому некоторые советы были бы отличными. Спасибо за чтение.


person user2218339    schedule 05.02.2014    source источник


Ответы (1)


Я узнал что:

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

прекращает увеличиваться в размере, когда достигает значения maxDataCount, установленного функцией appendData в классе GraphViewData. Это причина, по которой я получаю индекс массива за пределами ошибки. Вот мое решение. Это не самый красивый код, но, похоже, он работает. Исходная библиотека GraphView объявила закрытый окончательный список 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.

person user2218339    schedule 05.02.2014
comment
Каков тип данных вашей переменной graphSeries? Я предполагаю, что это GraphViewSeries, но у него нет метода get(). Этот ответ не полный. - person Stealth Rabbi; 26.02.2014
comment
Привет, Stealth Rabbi, исходная библиотека графического представления объявила закрытый окончательный List‹GraphViewSeries› graphSeries; вверху, поэтому функции get(0).values ​​относятся к классу List. Я отредактировал выше, чтобы уточнить это. - person user2218339; 05.03.2014