package com.classic.car.ui.chart; import android.graphics.Color; import android.util.SparseArray; import com.classic.car.R; import com.classic.car.consts.Consts; import com.classic.car.entity.ConsumerDetail; import com.classic.car.utils.DataUtil; import com.classic.car.utils.MoneyUtil; import com.classic.car.utils.Util; import com.github.mikephil.charting.charts.PieChart; import com.github.mikephil.charting.components.Legend; import com.github.mikephil.charting.data.ChartData; import com.github.mikephil.charting.data.Entry; import com.github.mikephil.charting.data.PieData; import com.github.mikephil.charting.data.PieDataSet; import com.github.mikephil.charting.data.PieEntry; import com.github.mikephil.charting.formatter.IValueFormatter; import com.github.mikephil.charting.utils.ViewPortHandler; import java.util.ArrayList; import java.util.List; /** * 应用名称: CarAssistant * 包 名 称: com.classic.car.ui.chart * * 文件描述: TODO * 创 建 人: 续写经典 * 创建时间: 2017/3/28 19:19 */ public class PieChartDisplayImpl extends BaseChartDisplayImpl<PieChart, PieChartDisplayImpl.PieChartData>{ @Override public void init(PieChart chart, boolean touchEnable) { super.init(chart, touchEnable); chart.setUsePercentValues(true); chart.setExtraOffsets(5, 10, 5, 5); // 环形图不绘制描述信息 chart.setDrawEntryLabels(false); //pieChart.setCenterText(EMPTY_LABEL); chart.setDrawCenterText(false); chart.setHoleRadius(48f); chart.setTransparentCircleRadius(52f); chart.setHoleColor(Color.TRANSPARENT); // pieChart.setRotationAngle(0); // 通过触摸启用图表的旋转, 默认:true // pieChart.setRotationEnabled(true); // 突出显示, 默认:true // pieChart.setHighlightPerTapEnabled(true); // pieChart.setEntryLabelTextSize(8f); // pieChart.setEnabled(false); // pieChart.setEntryLabelColor(getColor(context, R.color.gray_dark)); Legend l = chart.getLegend(); l.setVerticalAlignment(Legend.LegendVerticalAlignment.TOP); l.setHorizontalAlignment(Legend.LegendHorizontalAlignment.RIGHT); l.setOrientation(Legend.LegendOrientation.VERTICAL); l.setTextSize(mTextSize); l.setTextColor(Util.getColor(mAppContext, R.color.gray_dark)); } @Override public PieChartData convert(List<ConsumerDetail> list) { if (DataUtil.isEmpty(list)) { return null; } PieChartData pieChartData = new PieChartData(); pieChartData.groupMoney = new SparseArray<>(); final int size = list.size(); for (int i = 0; i < size; i++) { float money = list.get(i).getMoney(); pieChartData.totalMoney += money; int type = list.get(i).getType(); pieChartData.groupMoney.put(type, pieChartData.groupMoney.get(type, 0F) + money); } ArrayList<PieEntry> pieEntries = new ArrayList<>(); final int groupSize = pieChartData.groupMoney.size(); for (int i = 0; i < groupSize; i++) { pieEntries.add(new PieEntry(pieChartData.totalMoney == 0F ? 0F : MoneyUtil.newInstance(pieChartData.groupMoney.valueAt(i)) .divide(pieChartData.totalMoney, 4) .create() .floatValue(), Consts.TYPE_MENUS[pieChartData.groupMoney.keyAt(i)])); } PieDataSet dataSet = new PieDataSet(pieEntries, EMPTY_LABEL); // 环形之间的间隔 dataSet.setSliceSpace(2f); dataSet.setSelectionShift(8f); dataSet.setColors(Util.getColorTemplate(mAppContext)); PieData data = new PieData(dataSet); data.setValueFormatter(PERCENTAGE_FORMATTER); data.setValueTextSize(mTextSize); data.setValueTextColor(Color.WHITE); pieChartData.pieData = data; return pieChartData; } @Override ChartData getChartData(PieChartData pieChartData) { return null == pieChartData ? null : pieChartData.pieData; } public static class PieChartData { public float totalMoney; public PieData pieData; public SparseArray<Float> groupMoney; } /** 百分比格式 */ private static final IValueFormatter PERCENTAGE_FORMATTER = new IValueFormatter() { @Override public String getFormattedValue(float value, Entry entry, int dataSetIndex, ViewPortHandler viewPortHandler) { return Util.formatPercentage(value); } }; }