2016-08-16 66 views
0

我想將我的酒吧值添加到酒吧的左側,並將酒吧標籤添加到酒吧的右側。MpAndroidChart Horizo​​ntalBarChart自定義標籤

enter image description here

下面是initilizes Horizo​​ntalBarChart

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

嗨@亞西爾阿里,我用Horizo​​ntalBarChart – Cloy

+0

我檢查了庫代碼不容易,但我盡我所能解釋你。他們有Horizo​​ntalBarChartRenderer.java負責渲染你的條形圖和方法drawValues做這個文本渲染。你可以做什麼重寫此方法,並以某種方式覆蓋Horizo​​ntalBarChartRenderer和默認渲染器的Horizo​​ntalBarChart.init。 –

回答

2

是的,這是絕對有可能使用ValueFormatterAxisValueFormatter接口。

  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