2017-01-03 5 views
1

私は棒グラフを作成するためにMPAndroidChartライブラリを使用しています。バーの値のカスタム位置

以下を使用して、バーの上にバーの値を表示することができます。

mChart.setDrawValueAboveBar(false); 

か、我々はこれを使用することができます。

barDataSet.setDrawValues(true); 

はバー自体の内部バーの値を表示します。 値のカスタム位置を設定できるかどうかを知りたい。例えば、y軸の下。ソリューション

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)); 
       } 
      } 
     } 

    } 
} 

enter image description here

も値が表示されるようにこれを追加する必要がありましたの位置を変えるために露出APIには方法がありません

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

答えて

3

値ラベルはYAxisの下にあります。一般的でない要件を満たすためには、おそらくライブラリを拡張して変更する必要があります。

XAxisにIAxisValueFormatterを実装して、x値の代わりにy値を表示する方法もあります。簡単な例では、既存のIndexAxisValueFormatterを再利用できます。 String []のy値のラベルがyLabelsとなっているとします。あなたは今、これを行うことができます。

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:// stackoverflow)をオーバーライドする例があります。 .com/questions/31201874/mpandroidchart-linechart-custom-highlight-drawable/41312738#41312738) –

+0

それは働いた。私は自分のコードを掲載しました。すべてのあなたの助けをありがとう:) – amarok

関連する問題