Android-MPChart:PieChart使用小记
一、添加依赖
Project level build.gradle(在project的build.gradle中添加依赖)
allprojects {
repositories {
google()
jcenter()
maven { url 'https://jitpack.io' } //添加
}
}
App level build.gradle(在app的build.gradle中添加依赖)
dependencies {
implementation 'com.github.PhilJay:MPAndroidChart:v3.0.3' //添加
}
二、layout布局
<view
android:id="@+id/PieChart"
class="com.github.mikephil.charting.charts.PieChart"
android:layout_width="330dp"
android:layout_height="250dp"
android:layout_marginTop="35dp"
android:gravity="center" />
>
三、数据准备
private PieChart mPieChart;
private List<CategoryChartItem> categoryChart = new ArrayList<>();
class CategoryChartItem
{
private String categoryname;
private Float precent;
private double money;
}
//将数据库获取数据按照CategoryChartItem格式填充到数据源List中
public List<CategoryChartItem> loadcategoryChart(String begindate,String enddate,boolean typeflag)
{
int i;
String categoryname;
double allmoney;
float percent;
List<CategoryChartItem> mcategoryChart = new ArrayList<>();
BillDAOImpl billDAO = new BillDAOImpl();
CategoryDAOImpl categoryDAO = new CategoryDAOImpl();
allmoney = billDAO.getAllmoney(begin,end,0); //数据库获取总金额
allmoneystring = String.valueOf(allmoney);
Map<Integer, Double> dbChartData = billDAO.getCategoryChartData(begin,end,0);
for (Integer id : dbChartData.keySet())
{
if(dbChartData.get(id)!=0)
{
categoryname = categoryDAO.getCategoryById(id).getCategory_name(); //数据库获取各个分类名称
percent = (float)((double)dbChartData.get(id)/allmoney); //计算各个分类金额所占百分比
CategoryChartItem c1 = new CategoryChartItem(categoryname,percent*100);
mcategoryChart.add(c1); //将数据填充至数据源List中
}
}
return mcategoryChart;
}
//将数据源List中的数据填充至PieEntry中用于显示数据
private List<PieEntry> setPieChartData(List<CategoryChartItem> chartdata)
{
List<PieEntry> mPie = new ArrayList<>();
PieEntry pieEntry;
for (CategoryChartItem c : chartdata) {
mPie.add(new PieEntry(c.getPrecent(), c.getCategoryname()));
}
return mPie;
}
四、设置PieChart显示效果
private void ShowPieChart(PieChart pieChart, List<PieEntry> piedata) {
PieDataSet dataSet = new PieDataSet(piedata, "");
ArrayList<Integer> mColorList = new ArrayList<Integer>();
int[] color = {Color.rgb(239, 199, 194),
Color.rgb(215, 144, 123),
Color.rgb(232, 221, 181),
Color.rgb(178, 201, 171),
Color.rgb(104, 166, 145),
Color.rgb(108, 75, 94),
Color.rgb(179, 103, 155),
Color.rgb(244, 165, 174),
Color.rgb(125, 130, 184),
Color.rgb(250, 156, 56)
};
for (int c : color) {
mColorList.add(c);
}
dataSet.setColors(mColorList);
PieData pieData = new PieData(dataSet);
// 设置描述
Description description = new Description();
description.setEnabled(false);
pieChart.setDescription(description);
//设置半透明圆环的半径, 0为透明
pieChart.setTransparentCircleRadius(48f);
pieChart.setHoleRadius(45f); //半径
//设置初始旋转角度
pieChart.setRotationAngle(-15);
//数据连接线距图形片内部边界的距离,为百分数
dataSet.setValueLinePart1OffsetPercentage(80f);
//设置连接线的颜色
dataSet.setValueLineColor(Color.rgb(77,76,125));
// 连接线在饼状图外面
dataSet.setYValuePosition(PieDataSet.ValuePosition.OUTSIDE_SLICE);
// 设置饼块之间的间隔
dataSet.setSliceSpace(1f);
dataSet.setHighlightEnabled(true);
// 显示图例
Legend legend = pieChart.getLegend();
legend.setEnabled(true);
legend.setPosition(Legend.LegendPosition.LEFT_OF_CHART); //左边显示
legend.setFormSize(12f);//比例块字体大小
legend.setXEntrySpace(2f);//设置距离饼图的距离,防止与饼图重合
legend.setYEntrySpace(2f);
legend.setWordWrapEnabled(true); //比例块换行
legend.setDirection(Legend.LegendDirection.LEFT_TO_RIGHT);
// 和四周相隔一段距离,显示数据
pieChart.setExtraOffsets(26, 5, 26, 5);
// 设置pieChart图表是否可以手动旋转
pieChart.setRotationEnabled(true);
// 设置piecahrt图表点击Item高亮是否可用
pieChart.setHighlightPerTapEnabled(true);
// 设置pieChart图表展示动画效果,动画运行1.4秒结束
pieChart.animateY(1400, Easing.EasingOption.EaseInOutQuad);
//设置pieChart是否只显示饼图上百分比不显示文字
pieChart.setDrawEntryLabels(false);
//是否绘制PieChart内部中心文本
pieChart.setDrawCenterText(true);
pieChart.setCenterText("总支出"+allmoneystring+"元");
pieChart.setCenterTextColor(Color.DKGRAY);//中间的文字颜色
pieChart.setCenterTextSize(12);//中间的文字字体大小
// 绘制内容value,设置字体颜色大小
pieData.setDrawValues(true);
pieChart.setUsePercentValues(true);
pieData.setValueFormatter(new PercentFormatter());
pieData.setValueTextSize(10f);
pieData.setValueTextColor(Color.DKGRAY);
pieChart.setData(pieData);
// 更新 piechart 视图
pieChart.postInvalidate();
}
五、PieChart显示 (写在onCreateView里)
mPieChart = mView.findViewById(R.id.PieChart);
categoryChart = loadcategoryChart(strbeginDate,strendDate,OutcomeFlag); //设置数据源数据
ShowPieChart(mPieChart, setPieChartData(categoryChart), OutcomeFlag);
六、关于数据刷新的小问题
刚开始刷新数据的时候,以为只需要更新数据源的数据就可以,然而运行之后却发现数据没有更新。后来百度查找原因后找到了解决办法。
categoryChart.clear(); //这步很重要,首先要清空数据源List里的所有数据
categoryChart.addAll(loadcategoryChart(begindate,enddate,flag)); //重新加载数据源数据
ShowPieChart(mPieChart, setPieChartData(categoryChart), flag);