2016-08-16 3 views
0

Я хочу добавить мой бар значение слева от бара и бара этикетки справа от бара.MpAndroidChart HorizontalBarChart Настройка этикетка

enter image description here

Ниже приведен код, который Настройки инициализации HorizontalBarChart

HorizontalBarChart mChart = (HorizontalBarChart) findViewById(R.id.chart1); 
    mChart.setOnChartValueSelectedListener(this); 
    mChart.setDrawBarShadow(false); 
    mChart.setDrawValueAboveBar(true); 
    mChart.setDescription(strHeading); 
    mChart.setMaxVisibleValueCount(60); 
    mChart.setPinchZoom(false); 
    mChart.setDrawGridBackground(false); 
    XAxis xl = mChart.getXAxis(); 
    xl.setDrawLabels(false); 
    YAxis yl = mChart.getAxisLeft(); 
    yl.setDrawLabels(false); 
    YAxis yr = mChart.getAxisRight(); 
    yr.setTypeface(mTfLight); 
    yr.setDrawAxisLine(true); 
    yr.setDrawGridLines(false); 
    setData(12, 50); 
    mChart.setFitBars(true); 
    mChart.animateY(2500); 
    mChart.getXAxis().setPosition(XAxis.XAxisPosition.BOTTOM_INSIDE); 
    Legend l = mChart.getLegend(); 
    l.setPosition(Legend.LegendPosition.ABOVE_CHART_LEFT); 
    l.setFormSize(8f); 
    l.setXEntrySpace(4f); 

Ниже метод, который связывает данные, следующий код

float barWidth = 9f; 
float spaceForBar = 10f; 
ArrayList<BarEntry> yVals1 = new ArrayList<BarEntry>(); 

for (int i=0 ; i< arrayChart.size(); i++){ 
    ModelChart modelChart = arrayChart.get(i); 
    String aString = modelChart.getHeader(); 
    float space = i * spaceForBar; 
    BarEntry eachEntry = new BarEntry(i * spaceForBar, modelChart.getValue() , modelChart.getHeader()); 
    yVals1.add(eachEntry); 
} 

if (mChart.getData() != null && 
     mChart.getData().getDataSetCount() > 0) { 
    BarDataSet set1 = (BarDataSet)mChart.getData().getDataSetByIndex(0); 
    set1.setValues(yVals1); 
    mChart.getData().notifyDataChanged(); 
    mChart.notifyDataSetChanged(); 
} else { 
    set1 = new BarDataSet(yVals1, "A , B , C"); 
    ArrayList<IBarDataSet> dataSets = new ArrayList<IBarDataSet>(); 
    dataSets.add(set1); 
    BarData data = new BarData(dataSets); 
    data.setValueTextSize(10f); 
    data.setValueTypeface(mTfLight); 
    data.setBarWidth(barWidth); 
    mChart.setData(data); 
} 
+0

это ваш пользовательский компонент? –

+0

Эй @ Ясир Али, я использовал HorizontalBarChart – Cloy

+0

Я проверил код библиотеки, это не просто, но я стараюсь изо всех сил объяснить вам. У них есть HorizontalBarChartRenderer.java, который отвечает за рендеринг вашей гистограммы и метода drawValues ​​делает этот рендеринг текста. Что вы можете сделать переопределить этот метод и каким-то образом переопределить HorizontalBarChart.init, которые устанавливают HorizontalBarChartRenderer и рендеринг по умолчанию. –

ответ

2

Да, это, безусловно, можно с помощью ValueFormatter и AxisValueFormatter интерфейсов.

  1. Создать форматчик, который добавляет метки справа от ваших баров:

    public class LabelFormatter implements ValueFormatter { 
        @Override 
        public String getFormattedValue(float value, Entry entry, int dataSetIndex, ViewPortHandler viewPortHandler) { 
         // assuming that getHeader() returned the label 
         return (String) entry.getData(); 
        } 
    } 
    
  2. Создать ось форматчик, который добавляет значения слева от ваших баров:

    public class BarValueFormatter implements AxisValueFormatter { 
        private final DataSet mData; 
    
        public BarValueFormatter(DataSet data) { 
         mData = data; 
        } 
    
        @Override 
        public String getFormattedValue(float value, AxisBase axis) { 
         return String.valueOf((int) mData.getEntryForXPos(value, DataSet.Rounding.CLOSEST).getY()); 
        } 
    } 
    
  3. Установите ваши форматирующие элементы на набор данных и ось:

    set1.setValueFormatter(new LabelFormatter()); 
    mChart.getXAxis().setValueFormatter(new BarValueFormatter(set1)); 
    

Обратите внимание, что для оси x необходимо удалить вызов xl.setDrawLabels(false);, поэтому значения будут правильно отображены.

+0

Я получаю «не могу разрешить метод» для getEntryForXPos, откуда этот метод? – neo

+0

@neo Имя метода изменилось в обновлении v3.0.0. Попробуйте 'getEntryForXValue (значение, 0f, DataSet.Rounding.CLOSEST)'. – TR4Android

 Смежные вопросы

  • Нет связанных вопросов^_^