我之前发布了一个问题,关于在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编程的新手,所以一些建议会很棒。谢谢你的阅读。
答案 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时捕获的语句。