使用GraphView库来显示多个图形的功能

时间:2013-09-15 16:54:15

标签: graph bluetooth android-graphview

我目前正在开发一款Android应用程序,用于通过蓝牙读取多个传感器值并将其显示在图表中。当我偶然发现jjoe64的GraphViewLibrary时,我知道这完全符合我的目的。但现在我有点卡住了。基本上,我写了一个小函数,它将生成并显示三个不同图形中三个传感器的值,一个在另一个之下。当活动首先启动时,这个工作正常,所有三个图形都很好地渲染和显示。但是当我想使用resetData()方法更新具有不同值的图形来渲染每个图形中的新值时,只更新三个图形中的最后一个。显然,因为它是使用这个相当简单的函数生成的最后一个图形。我的问题是:有没有其他优雅的方法来使用像我这样的函数来一个接一个地生成和更新所有三个图?我已经尝试将GraphView变量设置为null以及删除和添加视图的不同组合。传递函数一个单独的GraphView变量,如graphView1,graphView2 ......也不起作用。

这是功能:

 private GraphView graphView;
 private GraphViewSeries graphViewSerie;
 private Boolean graphExisting = false;

...

public void makeGraphs (float[] valueArray, String heading, int graphId) {     
   String graphNumber = "graph"+graphId;
   int resId = getResources().getIdentifier(graphNumber,"id", getPackageName());
   LinearLayout layout = (LinearLayout) findViewById(resId);  

   int numElements = valueArray.length;
   GraphViewData[] data = new GraphViewData[numElements];       
   for (int c = 0; c<numElements; c++) {
       data[c] = new GraphViewData(c+1, valueArray[c]);
       Log.i(tag, "GraphView Graph"+graphId+": ["+(c+1)+"] ["+valueArray[c]+"].");
   }

   if (!graphExisting) {
       // init temperature series data            
       graphView = new LineGraphView(  
             this // context  
             , heading // heading  
       );    
       graphViewSerie = new GraphViewSeries(data);
       graphView.addSeries(graphViewSerie); 
       ((LineGraphView) graphView).setDrawBackground(true);       
       graphView.getGraphViewStyle().setNumHorizontalLabels(numElements); 
       graphView.getGraphViewStyle().setNumVerticalLabels(5);
       graphView.getGraphViewStyle().setTextSize(10);   
       layout.addView(graphView);
   }
   else {
       //graphViewSerie = new GraphViewSeries(data);
       //graphViewSerie.resetData(data);
        graphViewSerie.resetData(new GraphViewData[] {
                new GraphViewData(1, 1.2f)
                , new GraphViewData(2, 1.4f)
                , new GraphViewData(2.5, 1.5f) // another frequency
                , new GraphViewData(3, 1.7f)
                , new GraphViewData(4, 1.3f)
                , new GraphViewData(5, 1.0f)
                });

  }

这是函数调用,取决于先前生成的数组(正在监视以填充正确的值):

makeGraphs(graphData[0], "TempHistory", 1);
makeGraphs(graphData[1], "AirHistory", 2);
makeGraphs(graphData[2], "SensHistory", 3);
graphExisting = true;

非常感谢任何帮助和/或任何反馈!非常感谢!


编辑/更新: 感谢jjoe64的回答,我能够修改功能以正常工作。我的思维中显然有一个错误,因为我以为我也会更改一个GraphViewSeries对象,我将把我的函数作为附加参数处理(我之前尝试过)。当然这不起作用。但是,通过这个微小的改进,我设法使用Graphviewseries数组来完成这项工作。为了让人们为类似的问题而苦苦挣扎,想一想我必须改变什么,这里是解决方案的快速和简单草案。

我刚刚改变了

private GraphViewSeries graphViewSerie;

private GraphViewSeries graphViewSerie[] = new GraphViewSeries[3]; 

并使用函数(if子句)中已经给定的参数graphId访问正确的Series,如下所示:

int graphIndex = graphId - 1;
graphViewSerie[graphIndex] = new GraphViewSeries(data);

在else子句中我同样通过调用

来更新系列
graphViewSerie[graphIndex].resetData(data);

所以,再次感谢您的支持,jjoe64。对不起我以前无法更新问题,但我没有时间来处理它。

1 个答案:

答案 0 :(得分:0)

当然它无法正常工作,因为您始终在成员graphViewSerie中保存最新的graphseries-object。

首先,您必须存储3个不同的graphviewseries(可能通过数组或映射),然后您必须在else子句中访问正确的graphviewseries-object。