2017-01-03 149 views
1

我使用MPAndroidChart庫創建條形圖。的酒吧自定義位置值

我們可以使用下面顯示的欄頂部的欄值。

mChart.setDrawValueAboveBar(false); 

,或者我們可以這樣使用:

barDataSet.setDrawValues(true); 

,以顯示自己吧酒吧裏面的值。 我想知道我們是否可以爲這些值設置自定義位置。例如在y軸下方。

enter image description here

public class TextBarChartRenderer extends BarChartRenderer { 

    public TextBarChartRenderer(BarDataProvider chart, ChartAnimator animator, ViewPortHandler viewPortHandler) { 
     super(chart, animator, viewPortHandler); 
    } 

    @Override 
    public void drawValues(Canvas c) { 
     List<IBarDataSet> dataSets = mChart.getBarData().getDataSets(); 

     final float valueOffsetPlus = Utils.convertDpToPixel(22f) 
     float negOffset; 

     for (int i = 0; i < mChart.getBarData().getDataSetCount(); i++) { 

      IBarDataSet dataSet = dataSets.get(i); 
      applyValueTextStyle(dataSet); 
      float valueTextHeight = Utils.calcTextHeight(mValuePaint, "8"); 
      negOffset = valueTextHeight + valueOffsetPlus; 

      BarBuffer buffer = mBarBuffers[i]; 

      float left; 
      float right; 
      float top; 
      float bottom; 

      for (int j = 0; j < buffer.buffer.length * mAnimator.getPhaseX(); j += 4) { 

       left = buffer.buffer[j]; 
       right = buffer.buffer[j + 2]; 
       top = buffer.buffer[j + 1]; 
       bottom = buffer.buffer[j + 3]; 

       float x = (left + right)/2f; 

       if (!mViewPortHandler.isInBoundsRight(x)) 
        break; 

       if (!mViewPortHandler.isInBoundsY(top) || !mViewPortHandler.isInBoundsLeft(x)) 
        continue; 

       BarEntry entry = dataSet.getEntryForIndex(j/4); 
       float val = entry.getY(); 

       if(val > 0) { 
        drawValue(c, dataSet.getValueFormatter(), val, entry, i, x, 
          (bottom + negOffset), 
          dataSet.getValueTextColor(j/4)); 
       } 
      } 
     } 

    } 
} 

也不得不添加此使得值是可見

mChart.setExtraOffsets(0, 0, 0, 20); 

回答

3

有暴露用於改變的位置的API中沒有方法值的標籤低於YAxis。您可能需要擴展和修改庫以滿足您的不常見要求。嘗試

一種選擇是對x軸實施IAxisValueFormatter渲染y值代替x值。一個簡單的例子可以重新使用現有的IndexAxisValueFormatter。假設您有一個名爲yLabelsString []中的y值標籤。現在,你可以這樣做:

mChart.getXAxis().setValueFormatter(new IndexAxisValueFormatter(yLabels)); 

如果不工作,你將不得不看看源BarChartRenderer。有一種方法稱爲drawValues(),您可以重寫以實現所需的效果。

所以,你會碰到這樣的:

public class MyBarChartRenderer extends BarChartRenderer { 

    //TODO: a constructor matching the superclass 

    @Override 
    public void drawValues(Canvas c) { 
     //TODO: copy and paste the code from the superclass and simply 
     //change the offset for drawing the labels 
    } 
} 
+1

我試過IAxisValueFormatter,我可以顯示在x軸上的yValues但他們靠近實際xValues標籤。我無法將值顯示在另一個下面。接下來我會嘗試重寫drawValues()方法。謝謝。 – amarok

+0

@ amarok太棒了!有重寫繪製功能的例子(這裏)(https://stackoverflow.com/questions/41340819/mpandroidchart-add-custom-image-inside-bars/41373250#41373250)和[這裏](HTTPS://計算器.COM /問題/ 31201874/mpandroidchart-線型圖定製高亮抽拉/ 41312738#41312738) –

+0

它的工作。我發佈了我的代碼。感謝您的幫助:) – amarok