2012-02-03 43 views
3

我想在我的Activity中整合一個簡單的XY折線圖。在尋找自定義(可定製背景,顏色,軸標籤)的免費圖表時,我發現了兩個候選人:Achartengine和Adnroidplot。還有一些其他庫,但它們不是可定製的或僅作爲單獨的意圖提供。Android上的圖表 - androidplot和achartengine的問題

我還需要支持較舊的Android API(必須支持至少1.6)。

我試過Achartengine,但是當我將它集成到一個ScrollView中時失敗了。當我滾動時,圖表變得不知何故被損壞,它被擠壓,一些背景元素似乎飄走了。

然後我試了Adnroidplot。起初它並不是從1.6開始的,因爲Pair類。但我在Adnroidplot論壇上發現了一個修復問題。一切似乎工作正常,也動態更新,雖然自定義觀察員工作正常。自定義X軸標籤有點難(我需要自定義字符串而不是數字),但是使用自定義格式化程序我終於做到了。

但後來我試着用客戶端數據庫中的真實數據進行測試。有一系列具有相同值的點。我很震驚地看到,Adnroidplot無法畫出水平線,它掛起或完全弄亂了圖表!

下面是測試情況下,我從Adnroidplot快速入門借來的,做了小的修改,使一個系列用相等值:

pricesPlot = (XYPlot) findViewById(R.id.mySimpleXYPlot); 

// Create array of y-values to plot: 
Number[] series1Numbers = {7, 7}; // horizontal line expected, got nothing or hang 

// Turn the above arrays into XYSeries: 
XYSeries series1 = new SimpleXYSeries(
    Arrays.asList(series1Numbers),   // SimpleXYSeries takes a List so turn our array into a List 
    ArrayFormat.Y_VALS_ONLY, // Y_VALS_ONLY means use the element index as the x value 
      "Series1");        // Set the display title of the series 

// Create a formatter to use for drawing a series using LineAndPointRenderer: 
LineAndPointFormatter series1Format = new LineAndPointFormatter(
      Color.rgb(0, 200, 0),     // line color 
      Color.rgb(0, 100, 0),     // point color 
      null);    // fill color (optional) <- my app hangs if I add it for a horizontal line 

// Add series1 to the xyplot: 
pricesPlot.addSeries(series1, series1Format); 

// Reduce the number of range labels 
pricesPlot.setTicksPerRangeLabel(3); 

// By default, AndroidPlot displays developer guides to aid in laying out your plot. 
// To get rid of them call disableAllMarkup(): 
pricesPlot.disableAllMarkup(); 

我已經張貼在Adnroidplot論壇,但我不知道有多快他們會回答,問題何時會得到解決。

所以我希望也許有人在StackOverflow可能知道一些解決方法嗎?

+0

退房的解決辦法,我想出了以繪製一個水平線,或者我應該說,讓你的橫線顯示在AndroidPlot中。 – whyoz 2014-02-06 00:22:34

回答

3

感謝Androidplot論壇上的開發者,我現在得到了解決方案。以下代碼是我的Activity.java文件的一個片段。不幸的是,最終的代碼後來被重構,一些片斷被移動到自定義數據源和自定義XYSeries,我沒有權限在這裏發佈。

此代碼適用於Androidplot-core-0.4.4-release.jar,我不確定它是否適用於更高版本。

// for chart 
private XYPlot pricesPlot; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    // ... other initialisation code omitted for brevity ... 

    pricesPlot = (XYPlot) findViewById(R.id.mySimpleXYPlot); 

    // the following code was added as a debug code to test that it works. 
    // later many things were changed, so take it "as is" - this was the core of the solution 

    PriceDatesFormat ppf = new PriceDatesFormat(); 
    ppf.Labels = new String[]{ 
       "2011-01", 
       "2011-05",    
       "2011-07", 
       "2011-11", 
       "2011-07", 
       "2011-07"      
     }; 

    pricesPlot.getGraphWidget().setDomainValueFormat(ppf);  

    // Create two arrays of y-values to plot: 
    Float [] seriesNumbers = new Float[]{118f, 185f}; 

    Float min = Collections.min(Arrays.asList(seriesNumbers)); 
    Float max = Collections.max(Arrays.asList(seriesNumbers)); 

    pricesPlot.setRangeBoundaries(min - 0.1*min, max + 0.1*max, BoundaryMode.AUTO);// make them a bit wider out of min/max values 
+0

你可以發佈你的全新代碼嗎? – ctekk 2012-05-10 09:08:30

+1

@Coretek - 不幸的是我不能發佈完整的代碼,但我添加了一些更多的位,可能有助於初始化一些數據的情節,並測試該解決方案適用於您。 – JustAMartin 2013-08-14 10:17:58

+0

啊,關鍵的變化是你的「seriesNumbers」數組是一個浮點數,而不是你原來的文章中的數字[]。 – whyoz 2013-08-14 17:51:57

1

我想出了一個簡單的解決方法,以確保顯示水平線。

基本上,在加載你的第一個真實情節之前,只需繪製一個清晰的Y_VALS_ONLY系列的3點圖。

假設你有一個colors.xml RES文件,你可以創建一個明確的一系列這樣的:

這樣聲明:

Number[] yClear = {0, 1, 0}; 
LineAndPointFormatter clearFormat; 
SimpleXYSeries clear= null; 

在你的onCreate()或onViewCreated():

clearFormat = new LineAndPointFormatter(getResources().getColor(R.color.transparent), getResources().getColor(R.color.transparent), 0, null); 

然後,您設置您的情節後,只需將清晰的情節添加到圖;

clear = new SimpleXYSeries(Arrays.asList(yClear), SimpleXYSeries.ArrayFormat.Y_VALS_ONLY, "Clear"); 
yourPlot.addSeries(clear, clearFormat); 

我花了幾個小時試圖調試這個問題,並且歸結爲使生活變得輕鬆並且以這種方式進行。

1

對於那些誰用Google搜索排行榜擠壓內滾動型問題AChartEngine這是解決問題的方法:

renderer.setInScroll(true);