實現柱狀圖與條形圖的結合,MPAndroidChart 的簡單使用

2196231334 7年前發布 | 9K 次閱讀 安卓開發 Android開發 移動開發

先貼效果圖:
這種樣式的統計表格也是比較常用的,下面直接貼代碼:
public class ChartActivity extends BaseActivity {
    @BindView(R.id.chart1)
    MyCombinedChart mChart1;//完成情況
    private final int itemcount = 3;
    protected String[] mMonths = new String[]{"張三", "李四", "王五"};//X軸標簽

private List<Float> lineDatas;//線圖數據源
private List<float[]> barDatas;//堆圖數據源

@Override
public void init(Bundle savedInstanceState) {
    setContentView(R.layout.<em>activity_chart</em>,this);
    initTitleBar(R.id.<em>title</em>,"報表");
    setChart1();
}

<em>/** </em><em> * 配置維修單完成情況 </em><em> */ </em><em> </em>private void setChart1() {
    configChart(mChart1);
}

private void configChart(MyCombinedChart mChart){
    mChart.setDrawValueAboveBar(false);
    mChart.getDescription().setEnabled(false);//不顯示表名

// mChart.getDescription().setPosition();//設置表名在屏幕中的位置 mChart.setBackgroundColor(Color.WHITE); mChart.setDrawGridBackground(false); mChart.setDrawBarShadow(false); mChart.setScaleYEnabled(false);//Y軸方向上不允許拉伸 mChart.setHighlightFullBarEnabled(false);

    // draw bars behind lines設置繪制順序,重疊部分的圖案后繪制的會遮擋先繪制的
    mChart.setDrawOrder(new CombinedChart.DrawOrder[]{
            CombinedChart.DrawOrder.<em>BAR</em>, CombinedChart.DrawOrder.<em>LINE </em><em> </em>});

    //圖例
    Legend l = mChart.getLegend();
    l.setWordWrapEnabled(true);
    l.setVerticalAlignment(Legend.LegendVerticalAlignment.<em>BOTTOM</em>);
    l.setHorizontalAlignment(Legend.LegendHorizontalAlignment.<em>CENTER</em>);
    l.setOrientation(Legend.LegendOrientation.<em>HORIZONTAL</em>);
    l.setDrawInside(false);


    //設置右邊Y軸標簽
    YAxis rightAxis = mChart.getAxisRight();
    rightAxis.setAxisMaximum(100);//設置最大數值
    rightAxis.setLabelCount(6, true);//設置標簽數量
    rightAxis.setValueFormatter(new MyAxisValueFormatter());//設置數值顯示格式
    rightAxis.setDrawGridLines(true);//繪制網格線
    rightAxis.setAxisMinimum(0f); // this replaces setStartAtZero(true)
    //設置左邊Y軸標簽
    YAxis leftAxis = mChart.getAxisLeft();
    leftAxis.setAxisMaximum(20);
    leftAxis.setLabelCount(6, true);
    leftAxis.setDrawGridLines(true);
    leftAxis.setAxisMinimum(0f); // this replaces setStartAtZero(true)
    //設置X軸標簽
    XAxis xAxis = mChart.getXAxis();
    xAxis.setPosition(XAxis.XAxisPosition.<em>BOTTOM</em>);
    xAxis.setAxisMinimum(0f);
    xAxis.setGranularity(1f);
    xAxis.setDrawGridLines(false);
    xAxis.setValueFormatter(new IAxisValueFormatter() {
        @Override
        public String getFormattedValue(float value, AxisBase axis) {
            if (value==0||value==mMonths.length+1){
                return "";
            }
            return mMonths[(int) (value-1) % mMonths.length];
        }

        @Override
        public int getDecimalDigits() {
            return 0;
        }
    });

    CombinedData data = new CombinedData();

    data.setData(generateBarData());
    data.setData(generateLineData());
    //設置字體樣式

// data.setValueTypeface(mTfLight);

    xAxis.setAxisMaximum(data.getXMax() + 1);//最大寬度另加1個單元格的寬度

    mChart.setData(data);
    mChart.invalidate();
}

private LineData generateLineData() {
    lineDatas = new ArrayList<>();
    for (int i = 0; i < barDatas.size(); i++) {

        lineDatas.add(barDatas.get(i)[0] / (plus(barDatas.get(i))) * 100);

    }

    LineData d = new LineData();

    ArrayList<Entry> entries = new ArrayList<Entry>();

    //傳入數據
    for (int index = 0; index < itemcount; index++)
        entries.add(new Entry(index + 1, lineDatas.get(index)));

    LineDataSet set = new LineDataSet(entries, "完成率");
    set.setColor(getResources().getColor(R.color.<em>chart_green</em>));
    set.setLineWidth(2.5f);
    set.setCircleColor(Color.<em>rgb(240, 238, 70)); set.setCircleRadius(5f); set.setFillColor(Color.<em>rgb(240, 238, 70)); set.setMode(LineDataSet.Mode.<em>LINEAR</em>); set.setDrawValues(true); set.setValueTextSize(10f); set.setValueTextColor(getResources().getColor(R.color.<em>black</em>));//設置內容字體顏色 set.setAxisDependency(YAxis.AxisDependency.<em>RIGHT</em>);//以右邊Y軸的標簽繪制 d.addDataSet(set); MyValueFormatter format = new MyValueFormatter(); d.setValueFormatter(format); return d; } private float plus(float[] f) { float plus = 0; for (float aF : f) { plus += aF; } return plus; } private BarData generateBarData() { barDatas = new ArrayList<>(); barDatas.add(new float[]{6, 8}); barDatas.add(new float[]{15, 4}); barDatas.add(new float[]{11, 7}); ArrayList<BarEntry> entries2 = new ArrayList<>(); for (int index = 0; index < itemcount; index++) { // stacked entries2.add(new BarEntry(index + 1, barDatas.get(index))); } BarDataSet set2 = new BarDataSet(entries2, ""); set2.setStackLabels(new String[]{"已完成", "未完成"}); set2.setColors(getResources().getColor(R.color.<em>chart_blue</em>),getResources().getColor(R.color.<em>chart_red</em>)); set2.setValueTextColor(getResources().getColor(R.color.<em>black</em>)); set2.setValueTextSize(10f); set2.setAxisDependency(YAxis.AxisDependency.<em>LEFT</em>);//以左邊Y軸的標簽繪制 float barWidth = 0.45f; // x2 dataset BarData d = new BarData(set2); d.setBarWidth(barWidth); return d; }</em></em></code></pre> 

class MyAxisValueFormatter implements IAxisValueFormatter
{

private DecimalFormat mFormat;

public MyAxisValueFormatter() {
    mFormat = new DecimalFormat("###,###,###,##0.0");
}

@Override
public String getFormattedValue(float value, AxisBase axis) {
    return mFormat.format(value) + "%";
}


//小數點后數字個數
@Override
public int getDecimalDigits() {
    return 0;
}

}</code></pre>

class MyValueFormatter implements IValueFormatter
{

private DecimalFormat mFormat;


public MyValueFormatter() {
    mFormat = new DecimalFormat("###,###,###,##0.0");
}

@Override
public String getFormattedValue(float value, Entry entry, int dataSetIndex, ViewPortHandler viewPortHandler) {
    //百分比顯示
    return mFormat.format(value)+ "%" ;
}

}</code></pre>

class MyYAxis extends YAxis {

public MyYAxis() {
    super();
}

public MyYAxis(AxisDependency position) {
    super(position);
}

@Override
public String getFormattedLabel(int index) {
    if (index < 0 || index >= mEntries.length)
        return "";
    else {
        float max=mEntries[0];
        for (int i=1;i<mEntries.length;i++){
            Log.d("test", "getFormattedLabel: "+mEntries[i]);
            if (mEntries[i]>max){
                max=mEntries[i];
            }
        }
        return getValueFormatter().getFormattedValue(mEntries[index] /max*100, this);
    }
}


}</code></pre>

}

public class MyCombinedChart extends CombinedChart {
    public MyCombinedChart(Context context) {
        super(context);
    }

public MyCombinedChart(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public MyCombinedChart(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}

@Override
public YAxis getAxisRight() {
    return super.getAxisRight();
}

@Override
protected void init() {
    super.init();

    mAxisLeft = new YAxis(YAxis.AxisDependency.<em>LEFT</em>);
    mAxisRight = new MyYAxis(MyYAxis.AxisDependency.<em>RIGHT</em>);

    mLeftAxisTransformer = new Transformer(mViewPortHandler);
    mRightAxisTransformer = new Transformer(mViewPortHandler);

    mAxisRendererLeft = new YAxisRenderer(mViewPortHandler, mAxisLeft, mLeftAxisTransformer);
    mAxisRendererRight = new YAxisRenderer(mViewPortHandler, mAxisRight, mRightAxisTransformer);

    mXAxisRenderer = new XAxisRenderer(mViewPortHandler, mXAxis, mLeftAxisTransformer);

    setHighlighter(new ChartHighlighter(this));

    mChartTouchListener = new BarLineChartTouchListener(this, mViewPortHandler.getMatrixTouch(), 3f);

    mGridBackgroundPaint = new Paint();
    mGridBackgroundPaint.setStyle(Paint.Style.<em>FILL</em>);
    // mGridBackgroundPaint.setColor(Color.WHITE);
    mGridBackgroundPaint.setColor(Color.<em>rgb(240, 240, 240)); // light // grey mBorderPaint = new Paint(); mBorderPaint.setStyle(Paint.Style.<em>STROKE</em>); mBorderPaint.setColor(Color.<em>BLACK</em>); mBorderPaint.setStrokeWidth(Utils.<em>convertDpToPixel(1f)); } }</em></em></code></pre> 

 

來自:http://blog.csdn.net/dovar_66/article/details/53063420

 

 本文由用戶 2196231334 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!