2016-12-23 3 views
1

В моем приложении Android у меня есть гистограмма, которую я сделал с помощью MPAndroidChart. Моя проблема заключается в том, что на гистограмме имеется несколько баров, а метки значений над каждой панелью перекрываются с другими знаками значений, как показано на прилагаемом скриншоте, приведенном ниже. Я знаю, это потому, что нет места для отображения метки, но я думаю, что этого можно избежать, если можно повернуть метку значения на 90 градусов, как на ярлыках XAxis на моем снимке экрана. Так возможно? Если я увеличил масштаб изображения, я могу ясно видеть все значения. Я использую MPAndroidChart v3.0.1.MPAndroidChart: Можно ли повернуть метки значений для заданного DataSet?

MPAndroid Chart

Ниже мой код.

 yVals1 = new ArrayList<BarEntry>(); 
    xVals = new ArrayList<String>(); 
    for (int i = 0; i < listChart.size(); i++){ 
     BarEntry newBEntry = new BarEntry(i,listChart.get(i).getAmount()); 
     xVals.add(listChart.get(i).getAltName()); 
     yVals1.add(newBEntry); 
    } 
    BarDataSet set1; 
    if (bChartRepOne.getData() != null && bChartRepOne.getData().getDataSetCount() > 0) { 
     set1 = (BarDataSet) bChartRepOne.getData().getDataSetByIndex(0); 
     set1.setValues(yVals1); 
     bChartRepOne.getData().notifyDataChanged(); 
     bChartRepOne.notifyDataSetChanged(); 
    } else { 
     set1 = new BarDataSet(yVals1, chart); 
     set1.setColors(ColorTemplate.MATERIAL_COLORS); 
     ArrayList<IBarDataSet> dataSets = new ArrayList<IBarDataSet>(); 
     dataSets.add(set1); 
     BarData data = new BarData(dataSets); 
     data.setValueTextSize(8f); 

     bChartRepOne.setData(data); 
    } 

    XAxis xAxis = bChartRepOne.getXAxis(); 
    xAxis.setPosition(XAxis.XAxisPosition.BOTTOM); 
    xAxis.setDrawGridLines(false); 
    xAxis.setLabelCount(xList.size()-1); 
    xAxis.setGranularity(1f); // only intervals of 1 day 
    xAxis.setValueFormatter(new IAxisValueFormatter() { 
     @Override 
     public String getFormattedValue(float value, AxisBase axis) { 
      if(Math.round(value) >= xList.size()) { 
       return null; 
      } else { 
       return xList.get(Math.round(value)); 
      } 
     } 
    }); 
    xAxis.setLabelRotationAngle(-90); 

    YAxis leftAxis = bChartRepOne.getAxisLeft(); 
    leftAxis.setLabelCount(8, false); 
    leftAxis.setPosition(YAxis.YAxisLabelPosition.OUTSIDE_CHART); 
    leftAxis.setSpaceTop(15f); 
    YAxis rightAxis = bChartRepOne.getAxisRight(); 
    rightAxis.setEnabled(false); 

    Legend l = bChartRepOne.getLegend(); 
    l.setEnabled(false); 

    bChartRepOne.setOnChartValueSelectedListener(new OnChartValueSelectedListener() { 
     @Override 
     public void onValueSelected(Entry entry, Highlight highlight) { 

     } 

     @Override 
     public void onNothingSelected() { 

     } 
    }); 

ответ

1

В версии 3.0.1 нет способа подвергается рисовать метки значений для данного DataSet на угол. Это можно проверить, используя автозаполнение в вашей среде IDE, когда вы работаете с объектом DataSet.

Если вы хотите попробовать это самостоятельно, вам придется написать собственный визуализатор и позвонить:

mChart.setRenderer(myCustomRenderer); 

Чтобы сделать пользовательский визуализатор, вы бы подкласс BarChartRenderer и переопределить следующий метод:

drawValue(Canvas c, IValueFormatter formatter, float value, Entry entry, int dataSetIndex, float x, float y, int color) 

Вы бы поставили там код для визуализации одной метки при произвольном вращении.

Существует метод внутри Utils называется:

drawXAxisValue(Canvas c, String text, float x, float y, 
            Paint paint, 
            MPPointF anchor, float angleDegrees) 

, который содержит код для рисования текста под углом, так что вы можете использовать его в качестве шаблона.

+0

Может у пожалуйста, покажите мне, как создать myCustomRenderer.Also каковы значения с, текст, X, Y, краски, якорь в drawXAxisValue() ?? \ – KJEjava48

+0

ли такое же решение работает для горизонтали bar chart.And также этот метод изменения углов ярлыков вызывает любую задержку? – KJEjava48

+0

@ KJEjava48 это точно так же для горизонтальной гистограммы или где-либо еще в библиотеке, где нет открытого API, открытого для вращения. Этот или _any_ метод изменения углов ярлыков вызовет небольшой (но, вероятно, незаметный) удар производительности. –

0

Я повернул значения на гистограмме. Это может помочь кому-то. код

public class MyBarChartRenderer extends BarChartRenderer { 
public MyBarChartRenderer(BarDataProvider chart, ChartAnimator animator, ViewPortHandler viewPortHandler) { 
    super(chart, animator, viewPortHandler); 
} 



@Override 
public void drawValue(Canvas c, IValueFormatter formatter, float value, Entry entry, int dataSetIndex, float x, float y, int color) { 

    // super.drawValue(c, formatter, value, entry, dataSetIndex, x, y, color); 

    Paint paint=super.mDrawPaint; 
    paint.setTextSize(25f); 
    paint.setTextAlign(Paint.Align.CENTER); 
    paint.setTypeface(Typeface.create(Typeface.DEFAULT, Typeface.BOLD)); 
    Utils.drawXAxisValue(c,value,x,y,paint, MPPointF.getInstance(),270); 
}} 
Смежные вопросы