2017-08-31 51 views
1

我需要創建一個沿着x軸和沿着y軸的區域有時間的圖表。該程序將記錄某個活動的特定時間差的數據,並將數據顯示在圖表中,類似於 - >https://i.stack.imgur.com/s4MiC.png,但其他每個欄都將交替顯示顏色以對應單獨的活動。我還沒有能夠找到一種方法來使用MPAndroidChart,但每個條目似乎都有固定的寬度。如果有人知道如何使用MPAndroidChart實現這一目標,或者感謝其他開源庫的幫助,謝謝!帶有各種欄寬的MPAndroidChart條形圖

編輯:

這是我一直試圖一起工作的代碼:

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_data_report); 

    BarChart barChart = (BarChart) findViewById(R.id.barChart); 
    List<BarEntry> entries = generateBarEntries(); 
    BarDataSet set = new BarDataSet(entries, "BarDataSet"); 
    BarData data = new BarData(set); 
    barChart.setData(data); 
} 

private List<BarEntry> generateBarEntries() { 
    List<BarEntry> entries = new ArrayList<>(); 
    for (int i = 0; i < timeValues.size(); i++) { 
     float x = timeValues.get(i); 
     float y = areaValues.get(i); 
     entries.add(new BarEntry(x, y)); 
    } 
    return entries; 
} 

timeValues是以秒爲單位,如[3,9,21,26,33值的ArrayList ]和areaValues也是一個ArrayList,其大小與timeValues相同,每個值現在爲30(即[30,30,30,30,30])。

+0

請發佈您迄今嘗試過的代碼。 – petryuno1

+0

@ petryuno1查看編輯的文章 –

回答

2

好吧,所以我想出瞭如何去做這件事。我沒有創建條形圖,而是使用水平線創建折線圖並填充每行下方的區域。

LineChart timeChart = (LineChart) findViewById(R.id.timeChart); 
List<ILineDataSet> dataSets = generateLineData(); 
LineData data = new LineData(dataSets); 
timeChart.setData(data); 
timeChart.invalidate(); 

private List<ILineDataSet> generateLineData() { 
    List<ILineDataSet> dataSets = new ArrayList<>(); 
    for (int i = 0; i < areaValues.size(); i++) { 
     List<Entry> barPoints = new ArrayList<>(); 
     Entry barPoint1; 
     Entry barPoint2; 
     LineDataSet dataSet; 
     if (areaValues.get(i) >= 0) { 
      barPoint1 = new Entry(timeValues.get(i), areaValues.get(i)); 
      barPoint2 = new Entry(timeValues.get(i+1), areaValues.get(i)); 
      barPoints.add(barPoint1); 
      barPoints.add(barPoint2); 
      dataSet = new LineDataSet(barPoints, ""); 
      dataSet.setColor(getResources().getColor(R.color.green)); 
      dataSet.setFillDrawable(ContextCompat.getDrawable(this, R.color.green)); 
     } 
     dataSet.setDrawCircles(false); 
     dataSet.setDrawFilled(true); 
     dataSet.setDrawValues(false); 
     dataSets.add(dataSet); 
    } 
    return dataSets; 
} 

非常有效。

+0

您能否讓我知道您的** areaValues **和** timeValues **的樣本? –

+0

謝謝........... –

+0

@RahulSharma areaValues只是隨機生成的數字,用於我的目的。 timeValues只需要增加每個時間和timeValues應該總是比areaValues多一個條目。示例條目可以是: timeValues = [0,12,15,19,33] areaValues = [20,9,12,16] –

0

Sample, what i did

有沒有簡單的方法來實現這一目標。您必須在MPAndroidChart中查找條形圖源代碼並找到名爲BarBuffer的類。有一個名爲addBar()的方法。在那裏你可以改變條寬。在我的例子中,我仍然有24個單獨的小節,但是如果你改變寬度,你可以使它看起來像大塊。

protected void addBar(float left, float top, float right, float bottom) { 

    buffer[index++] = left; 
    buffer[index++] = top; 
    buffer[index++] = right; 
    buffer[index++] = bottom; 
}