2016-08-16 3 views
0
줄은 줄의 왼쪽에 값과 막대가 표시 줄의 오른쪽에 레이블을 추가 할

. 다음은 MpAndroidChart HorizontalBarChart 사용자 지정 라벨

enter image description here

다음은
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); 

데이터를 결합하는 방법, 다음 코드 HorizontalBarChart를 initilizes 코드입니다

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

안녕하세요, @ Yasir Ali, HorizontalBarChart를 사용했습니다. – Cloy

+0

라이브러리 코드를 쉽게 검사 할 수는 없지만 최선을 다해 설명 드리겠습니다. 그들은 Barchart를 렌더링하는 HorizontalBarChartRenderer.java를 가지고 있으며 drawValues ​​메소드는이 텍스트 렌더링을 수행합니다. 할 수있는 일은이 메소드를 오버라이드 (override) 해, HorizontalBarChartRenderer 및 디폴트의 렌더러를 설정하는 HorizontalBarChart.init를 오버라이드 (override)합니다. –

답변

2

예,이은을 사용하여 확실히 가능하다 ValueFormatterAxisValueFormatter 인터페이스.

  1. 당신의 막대의 오른쪽에 레이블을 추가하는 포맷터 만들기 :

    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()); 
        } 
    } 
    
  2. :

    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(); 
        } 
    } 
    
  3. 이 바의 왼쪽에있는 값을 추가하는 축 포매터를 만들기를

  4. 포맷터를 데이터 세트 및 축에 설정하십시오.

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

x 축에 대해 xl.setDrawLabels(false);에 대한 호출을 제거해야 값이 올바르게 렌더링됩니다.

+0

getEntryForXPos에 대해 "메소드를 해결할 수 없습니다."라는 메시지가 나타납니다. – neo

+0

@neo 메소드 이름이 v3.0.0 업데이트에서 변경되었습니다. 'getEntryForXValue (value, 0f, DataSet.Rounding.CLOSEST)'를 시도하십시오. – TR4Android