最近Android開發(fā)中需要用到統(tǒng)計圖來展示數(shù)據(jù),于是我選擇使用了MPChart庫名惩。上網(wǎng)搜了一通怎么使用,網(wǎng)上文章講得都挺全面的攻谁,不過網(wǎng)上大部分都是一些配置參數(shù)的說明弯予,我這里還有開發(fā)時遇到的一點(diǎn)點(diǎn)小坑,所以就記錄一下锈嫩,省得以后要用了又到處翻文章。
1祠挫、添加依賴
在build.gradle中寫上下面這句依賴。
implementation 'com.github.PhilJay:MPAndroidChart:v3.0.3'
2骚灸、layout中的使用
其實(shí)和普通控件一樣慌植,只用隨便設(shè)置一下位置,大小和id就行蝶柿。
<com.github.mikephil.charting.charts.PieChart
android:id="@+id/pie_chart"
android:layout_width="300dp"
android:layout_height="300dp"
android:layout_gravity="center"/>
3、為統(tǒng)計圖準(zhǔn)備數(shù)據(jù)
統(tǒng)計圖當(dāng)然需要數(shù)據(jù)啊雏赦,先寫獲得數(shù)據(jù)的方法。(此代碼復(fù)制后不能直接運(yùn)行星岗,需要你根據(jù)自己項(xiàng)目的情況改動)
private List<PieEntry> getPieChartData() {
List<String> dataList = "數(shù)據(jù)庫或網(wǎng)絡(luò)獲取數(shù)據(jù)"
List<PieEntry> mPie = new ArrayList<>();
for (String data : dataList ) {
// 參數(shù)1為 value俏橘,參數(shù)2為 data允华。
// 如 PieEntry(0.15F, "90分以上"); 表示90分以上的人占比15%寥掐。
PieEntry pieEntry = new PieEntry("計算占比", data);
pieEntry.setX("float類型數(shù)字");
mPie.add(pieEntry);
}
return mPie;
}
4、配置PieChart并顯示
關(guān)鍵方法百炬,各句代碼的用途我都用注釋寫出來了污它,認(rèn)真看哦。(此代碼復(fù)制后可直接運(yùn)行)
private void showPieChart(PieChart pieChart, List<PieEntry> pieList) {
PieDataSet dataSet = new PieDataSet(pieList,"Label");
// 設(shè)置顏色list轨蛤,讓不同的塊顯示不同顏色虫埂,下面是我覺得不錯的顏色集合,比較亮
ArrayList<Integer> colors = new ArrayList<Integer>();
int[] MATERIAL_COLORS = {
Color.rgb(200, 172, 255)
};
for (int c : MATERIAL_COLORS) {
colors.add(c);
}
for (int c : ColorTemplate.VORDIPLOM_COLORS) {
colors.add(c);
}
dataSet.setColors(colors);
PieData pieData = new PieData(dataSet);
// 設(shè)置描述缝呕,我設(shè)置了不顯示斧散,因?yàn)椴缓每矗阋部梢栽囋囎屗@示鸡捐,真的不好看
Description description = new Description();
description.setEnabled(false);
pieChart.setDescription(description);
//設(shè)置半透明圓環(huán)的半徑, 0為透明
pieChart.setTransparentCircleRadius(0f);
//設(shè)置初始旋轉(zhuǎn)角度
pieChart.setRotationAngle(-15);
//數(shù)據(jù)連接線距圖形片內(nèi)部邊界的距離箍镜,為百分?jǐn)?shù)
dataSet.setValueLinePart1OffsetPercentage(80f);
//設(shè)置連接線的顏色
dataSet.setValueLineColor(Color.LTGRAY);
// 連接線在餅狀圖外面
dataSet.setYValuePosition(PieDataSet.ValuePosition.OUTSIDE_SLICE);
// 設(shè)置餅塊之間的間隔
dataSet.setSliceSpace(1f);
dataSet.setHighlightEnabled(true);
// 不顯示圖例
Legend legend = pieChart.getLegend();
legend.setEnabled(false);
// 和四周相隔一段距離,顯示數(shù)據(jù)
pieChart.setExtraOffsets(26, 5, 26, 5);
// 設(shè)置pieChart圖表是否可以手動旋轉(zhuǎn)
pieChart.setRotationEnabled(false);
// 設(shè)置piecahrt圖表點(diǎn)擊Item高亮是否可用
pieChart.setHighlightPerTapEnabled(true);
// 設(shè)置pieChart圖表展示動畫效果,動畫運(yùn)行1.4秒結(jié)束
pieChart.animateY(1400, Easing.EasingOption.EaseInOutQuad);
//設(shè)置pieChart是否只顯示餅圖上百分比不顯示文字
pieChart.setDrawEntryLabels(true);
//是否繪制PieChart內(nèi)部中心文本
pieChart.setDrawCenterText(false);
// 繪制內(nèi)容value色迂,設(shè)置字體顏色大小
pieData.setDrawValues(true);
pieData.setValueFormatter(new PercentFormatter());
pieData.setValueTextSize(10f);
pieData.setValueTextColor(Color.DKGRAY);
pieChart.setData(pieData);
// 更新 piechart 視圖
pieChart.postInvalidate();
}
這里也有一個坑歇僧,那就是設(shè)置四周相隔距離屬性這一句。
pieChart.setExtraOffsets(26, 5, 26, 5);
一開始我不知道還有這個屬性,導(dǎo)致做出來的效果是這樣的兽埃,如下圖倔撞,四周的字超出控件大小顯示不全讲仰。當(dāng)時用了各種padding痪蝇,margin屬性都沒用,這個地方要注意哦趁矾。
加上這句話之后给僵,可以明顯看出來餅狀圖變小了,因?yàn)橐獮橹車淖烛v出那26的空間帝际,如下圖。
5斑粱、Activity中調(diào)用上面的方法
private PieChart mPieChart;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate( savedInstanceState );
setContentView( R.layout.activity_xxxx );
mPieChart = findViewById(R.id.pie_chart);
showPieChart(mPieChart, getPieChartData());
}
ok脯爪,現(xiàn)在我們的餅狀圖成功顯示了。
6尚揣、為PieChart設(shè)置點(diǎn)擊事件
注意設(shè)置點(diǎn)擊事件只能用setOnChartValueSelectedListener
這個方法掖举,其他方法都是扯淡的快骗。開發(fā)的時候試了好多方法都不行塔次,網(wǎng)上也搜了好多方法,都沒用恭取,可被坑慘了熄守,最后才發(fā)現(xiàn)只能用這個蜈垮。
mPieChart.setOnChartValueSelectedListener(new OnChartValueSelectedListener() {
@Override
public void onValueSelected(Entry e, Highlight h) {
// e.getX()方法得到x數(shù)據(jù)
PieEntry pieEntry = (PieEntry) e;
Log.d(TAG, "-->value" + pieEntry.getValue() + "->x" + pieEntry.getX() + "->y" + pieEntry.getY());
}
@Override
public void onNothingSelected() {}
} );
由于Entry沒有各種get方法攒发,所以這里我們讓Entry向下轉(zhuǎn)型為PieEntry,于是對于PieEntry我們就能調(diào)用各種get方法了惠猿。之后你就可以拿著獲得的這些數(shù)據(jù)去處理你的點(diǎn)擊事件了。