1. 程式人生 > >Android MPChart—柱狀圖

Android MPChart—柱狀圖

第三方資源庫MPChart如何新增到專案中就不說了,不知道的網上搜一下,很多。

本篇主要說明MPChart中BarChart(柱狀圖)是如何呼叫實現的。

一、佈局檔案

<com.github.mikephil.charting.charts.BarChart
    android:id="@+id/barchart"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

二、BarChartActivity

public class BarChartActivity extends AppCompatActivity {
    private BarChart barchart;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_bar_chart);
        barchart = findViewById(R.id.barChart);
        barchart.setDrawBarShadow(false);//true繪畫的Bar有陰影。
        barchart.setDrawValueAboveBar(true);//true文字繪畫在bar上
        barchart.getDescription().setEnabled(false);
        barchart.setMaxVisibleValueCount(60);
        barchart.setPinchZoom(false);//false只能單軸縮放
        barchart.setDrawGridBackground(false);
        //x座標軸設定
        xAxisValue.clear();
        xAxisValue.add("1月");
        xAxisValue.add("2月");
        xAxisValue.add("3月");
        xAxisValue.add("4月");
        xAxisValue.add("5月");
        xAxisValue.add("6月");
        XAxis xAxis = barchart.getXAxis();
        xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
        xAxis.setDrawGridLines(false);
        xAxis.setDrawLabels(true);
        xAxis.setGranularity(1f);
        xAxis.setLabelCount(xAxisValue.size());
        xAxis.setCenterAxisLabels(true);//設定標籤居中
        xAxis.setValueFormatter(new IndexAxisValueFormatter(xAxisValue));

        //設定Y軸
        barchart.getAxisRight().setEnabled(false);
        YAxis leftAxis = barchart.getAxisLeft();
        leftAxis.setLabelCount(6, false);
//        leftAxis.setValueFormatter();
        leftAxis.setPosition(YAxis.YAxisLabelPosition.OUTSIDE_CHART);
        leftAxis.setSpaceTop(10f);
        leftAxis.setAxisMinimum(0f);
        leftAxis.setAxisMaximum(50f);

        Legend l = barchart.getLegend();
        l.setVerticalAlignment(Legend.LegendVerticalAlignment.BOTTOM);
        l.setHorizontalAlignment(Legend.LegendHorizontalAlignment.LEFT);
        l.setOrientation(Legend.LegendOrientation.HORIZONTAL);
        l.setDrawInside(false);
        l.setForm(Legend.LegendForm.SQUARE);
        l.setFormSize(9f);
        l.setTextSize(11f);
        l.setXEntrySpace(4f);

//        XYMarkerView mv = new XYMarkerView(this, xAxisFormatter);
//        mv.setChartView(barchart); // For bounds control
//        barchart.setMarker(mv); // Set the marker to the chart
        setData(6, 50);
    }
 
    private void setData(int count, float range) {
        float start = 1f;
        ArrayList<BarEntry> yVals1 = new ArrayList<BarEntry>();
        ArrayList<BarEntry> yVals2 = new ArrayList<BarEntry>();
        for (int i = (int) start; i < start + count; i++) {
            float mult = (range + 1);
            float val = (float) (Math.random() * mult);
            float val2 = (float) (Math.random() * mult);
            yVals1.add(new BarEntry(i, val));
            yVals2.add(new BarEntry(i, val2));
        }

        BarDataSet set1 = new BarDataSet(yVals1, "資料說明1");
        set1.setDrawIcons(false);
        set1.setColor(ColorTemplate.rgb("#2ecc71"));
        BarDataSet set2 = new BarDataSet(yVals2, "資料說明2");
        set2.setDrawIcons(false);
        set2.setColor(ColorTemplate.rgb("#f1c40f"));
        ArrayList<IBarDataSet> dataSets = new ArrayList<IBarDataSet>();
        dataSets.add(set1);
        dataSets.add(set2);
        BarData data = new BarData(dataSets);
        data.setValueTextSize(10f);
        barchart.setData(data);

        float groupSpace = 0.2f;
        float barSpace = 0.1f;
        barchart.getBarData().setBarWidth(0.3f);
        barchart.getXAxis().setAxisMinimum(0);
        barchart.getXAxis().setAxisMaximum(barchart.getBarData().getGroupWidth(groupSpace, barSpace) * xAxisValue.size() + 0);
        barchart.groupBars(0, groupSpace, barSpace);
        barchart.animateY(1000, Easing.Linear);
        barchart.animateX(1000, Easing.Linear);
    }
}

至於裡面BarChart的屬性方法是什麼意思,註釋加了一些,另外的大家可以自行百度。