2014-02-25 47 views
2

我一直試圖在Android上動態繪製條形圖,但無濟於事。動態繪製條形圖時遇到問題[AChartEngine]

我似乎錯過了我的代碼中的東西,但我無法弄清楚它是什麼。我做了一個新項目,可以清楚地說明我的問題。這個代碼應該允許條形圖在按下按鈕時改變,但是當它被按下時,它看起來只是被清除了,而沒有被重新繪製。這是我的MainActivity.java代碼:

package com.example.dynamicbargraph; 

    import org.achartengine.GraphicalView; 
    import android.os.Bundle; 
    import android.view.View; 
    import android.widget.LinearLayout; 
    import android.app.Activity; 

    public class MainActivity extends Activity { 

     private BarGraph bar = new BarGraph(); 
     private GraphicalView barView; 


     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 

      //bar graph view initialize 
      barView = bar.getBarView(this); 
      LinearLayout barLayout = (LinearLayout) findViewById(R.id.barchart); 
      barLayout.addView(barView); 


     } 

     public void buttonHandler(View view) 
     { 
      LinearLayout barLayout = (LinearLayout) findViewById(R.id.barchart); 
      barLayout.removeView(barView); 
      bar.staticPlot(); 
      barView.repaint(); 
     } 

    } 

這是BarGraph.java代碼:

package com.example.dynamicbargraph; 

    import org.achartengine.ChartFactory; 
    import org.achartengine.GraphicalView; 
    import org.achartengine.chart.BarChart.Type; 
    import org.achartengine.model.CategorySeries; 
    import org.achartengine.model.XYMultipleSeriesDataset; 
    import org.achartengine.renderer.XYMultipleSeriesRenderer; 
    import org.achartengine.renderer.XYSeriesRenderer; 
    import android.content.Context; 
    import android.graphics.Color; 


    public class BarGraph { 

     private GraphicalView view; 

     private CategorySeries series = new CategorySeries("Accelerometer"); 
     private XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset(); 
     private XYSeriesRenderer renderer = new XYSeriesRenderer(); //used for customizing 
     private XYMultipleSeriesRenderer mRenderer = new XYMultipleSeriesRenderer(); 


     @SuppressWarnings("deprecation") 
     public BarGraph() 
     { 


      int[] y ={1,2,3,4,5,6,7,8,9,10}; 

      for (int i = 0; i < 10; i++) 
      { 
       series.add("Bar" + (i+1), y[i]); 
      } 


      dataset.addSeries(series.toXYSeries()); 


      //below are just customization codes 
      renderer.setChartValuesSpacing((float) 0.5); 
      renderer.setColor(Color.GRAY); 


      mRenderer.addSeriesRenderer(renderer); 
      mRenderer.setChartTitle("Arm Steadiness From Device"); 
      mRenderer.setXTitle("Frequency (Hz)"); 
      mRenderer.setYTitle("Magnitude"); 

      float textSize = 30, textSmaller = 20, angle = 270; 
      mRenderer.setAxisTitleTextSize(textSize); 
      mRenderer.setYLabelsAngle(angle); 
      mRenderer.setLabelsTextSize(textSize); 
      mRenderer.setChartValuesTextSize(textSize); 
      mRenderer.setLegendTextSize(textSmaller); 
      mRenderer.setChartTitleTextSize(textSize); 
      mRenderer.setAxesColor(Color.YELLOW); 
      mRenderer.setGridColor(Color.YELLOW); 
      mRenderer.setLabelsColor(Color.rgb(112, 128, 144)); 

      //adjusting margin width of y-axis (so y axis labels can be seen) 
      int[] i = mRenderer.getMargins(); 
      i[0] += 50;//top 
      i[1] += 50;//left (increment here) 
      //i[2] = 0;//bottom 
      //i[3] = 0;//right 
      mRenderer.setMargins(i); 
     } 

     public GraphicalView getBarView(Context context) 
     { 
      view = ChartFactory.getBarChartView(context, dataset, mRenderer, Type.DEFAULT); 
      return view; 
     } 

     public void staticPlot() 
     { 
      int[] y ={10,9,8,7,6,5,4,3,2,1}; 

      for (int i = 0; i < 10; i++) 
      { 
       series.add("Bar" + (i+1), y[i]); 
      } 
     } 
    } 

最後,調用buttonHandler的activity_main.xml中的代碼點擊時:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:tools="http://schemas.android.com/tools" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:background="#000000" 
     android:paddingBottom="@dimen/activity_vertical_margin" 
     android:paddingLeft="@dimen/activity_horizontal_margin" 
     android:paddingRight="@dimen/activity_horizontal_margin" 
     android:paddingTop="@dimen/activity_vertical_margin" 
     tools:context=".MainActivity" > 

     <LinearLayout 
      android:id="@+id/barchart" 
      android:layout_width="fill_parent" 
      android:layout_height="400dp" 
      android:orientation="vertical" /> 

     <Button 
      android:id="@+id/button1" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentBottom="true" 
      android:layout_centerHorizontal="true" 
      android:onClick="buttonHandler" 
      android:text="@string/hello_world" /> 

    </RelativeLayout> 

我知道我錯過了buttonHandler中的某些東西,但我不知道它是什麼。任何幫助將不勝感激。謝謝!

回答

2
public void buttonHandler(View view) 
{ 
    LinearLayout barLayout = (LinearLayout) findViewById(R.id.barchart); 
    barLayout.removeView(barView); 
    bar.staticPlot(); 

    barView = bar.getBarView(this); //Grab the newest graph 

    barLayout.addView(barView); 
    barView.repaint(); 
} 

public void staticPlot() { 

    dataset = new XYMultipleSeriesDataset(); //Clear the previous dataset (maybe there is a remove instead?) 

    int[] y = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 }; 
    series.clear(); //Clear your previous values 

    for (int i = 0; i < 10; i++) { 
     series.add("Bar" + (i + 1), y[i]); 
    } 

    dataset.addSeries(series.toXYSeries()); //Readd to dataset 
} 

作品在我的機器上,希望這有助於解釋在評論

編輯:更多的評論/錯別字

+1

它的工作原理,感謝您的幫助!也是你非常有用的視頻 – user3307418

0

在onClickListener中,它看起來像是從其父LinearLayout中移除視圖,然後嘗試重新繪製而不重新添加它。我不知道刪除它是什麼點,所以也許試試這個:

public void buttonHandler(View view) { 
     if(bar != null) { 
      //LinearLayout barLayout = (LinearLayout) findViewById(R.id.barchart); 
      //barLayout.removeView(barView); 
      bar.staticPlot(); 
      bar.repaint(); 
     } 
    } 

忘記從佈局中刪除它,只是重新繪製它。請記住,你的staticPlot方法總是會繪製相同的東西(但你可能知道當你把它稱爲「staticPlot」時),所以除了額外的一系列相同的數據點之外,不要期望變化的結果。

public void staticPlot() { 
     int[] y ={ 10,9,8,7,6,5,4,3,2,1 }; 
     for (int i = 0; i < 10; i++) series.add("Bar" + (i+1), y[i]); 
     // dataset = new XYMultipleSeriesDataset(); <--- You may want to create a new dataset if you're not going to create a new series 
     dataset.addSeries(series.toXYSeries()); 
    } 

希望這點你在正確的方向〜

+0

謝謝回覆,我已經嘗試過,但沒有任何反應,所以我試圖removeView然後再次重繪。 – user3307418

+0

在你的staticPlot方法中,有幾件事情似乎也沒有關係。首先,您正在編輯初始系列,但從未通過調用dataset.addSeries(series.toXySeries)實際更新數據集;這解釋了爲什麼它沒有更新,因爲實際的數據集從未改變過。您的數據集是由toXySeries()創建的新對象構建的,並解釋了爲什麼沒有任何更改。第二次更新答案... – Guardanis

+0

是的,我意識到之前,但當我包括dataset.addSeries(series.toXYSeries);在staticPlot方法中,應用程序崩潰。如果它沒有,我認爲它會起作用。 – user3307418