package cn.flightfeather.thirdappmodule.util; import android.graphics.Color; import android.graphics.Typeface; import android.text.SpannableString; import android.text.style.ForegroundColorSpan; import android.text.style.RelativeSizeSpan; import android.text.style.StyleSpan; import com.github.mikephil.charting.animation.Easing; import com.github.mikephil.charting.charts.HorizontalBarChart; import com.github.mikephil.charting.charts.PieChart; import com.github.mikephil.charting.components.AxisBase; import com.github.mikephil.charting.components.Legend; import com.github.mikephil.charting.components.XAxis; import com.github.mikephil.charting.components.YAxis; import com.github.mikephil.charting.data.BarData; import com.github.mikephil.charting.data.BarDataSet; import com.github.mikephil.charting.data.BarEntry; 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.IAxisValueFormatter; import com.github.mikephil.charting.formatter.IValueFormatter; import com.github.mikephil.charting.formatter.PercentFormatter; import com.github.mikephil.charting.interfaces.datasets.IBarDataSet; import com.github.mikephil.charting.utils.ColorTemplate; import com.github.mikephil.charting.utils.ViewPortHandler; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.HashMap; import java.util.List; public class ChartGenerator { // public static void quickSetupChart(PieChart pieChart) { //饼图样式设置*************************************************************************************************** pieChart.setUsePercentValues(true); pieChart.getDescription().setEnabled(false); pieChart.setExtraOffsets(5, 10, 5, 5); // pieChart.setExtraOffsets(20.f, 0.f, 20.f, 0.f); pieChart.setDragDecelerationFrictionCoef(0.95f); // pieChart.setCenterTextTypeface(mTfLight); pieChart.setCenterText(generateCenterSpannableText()); pieChart.setDrawHoleEnabled(true); pieChart.setHoleColor(Color.WHITE); pieChart.setTransparentCircleColor(Color.WHITE); pieChart.setTransparentCircleAlpha(110); pieChart.setHoleRadius(58f); pieChart.setTransparentCircleRadius(61f); pieChart.setDrawCenterText(true); pieChart.setRotationAngle(0); // enable rotation of the chart by touch pieChart.setRotationEnabled(true); pieChart.setHighlightPerTapEnabled(true); //图例设置 Legend l = pieChart.getLegend(); l.setVerticalAlignment(Legend.LegendVerticalAlignment.BOTTOM); l.setHorizontalAlignment(Legend.LegendHorizontalAlignment.LEFT); l.setOrientation(Legend.LegendOrientation.VERTICAL); l.setDrawInside(true); l.setXEntrySpace(7f); l.setYEntrySpace(7f); l.setYOffset(10f); l.setEnabled(false); // entry label styling pieChart.setEntryLabelColor(Color.WHITE); // pieChart.setEntryLabelTypeface(mTfRegular); pieChart.setEntryLabelTextSize(12f); pieChart.setDrawEntryLabels(true); } private static SpannableString generateCenterSpannableText() { SpannableString s = new SpannableString("问题统计图"); s.setSpan(new RelativeSizeSpan(1.7f), 0, s.length(), 0); s.setSpan(new StyleSpan(Typeface.ITALIC), 0, s.length(), 0); s.setSpan(new ForegroundColorSpan(ColorTemplate.getHoloBlue()), 0, s.length(), 0); return s; } // // public static void quickSetData(PieChart pieChart, HashMap dataMap, String label) { ArrayList entries = new ArrayList<>(); List> list = new ArrayList<>(dataMap.entrySet()); for (HashMap.Entry data : list) { entries.add(new PieEntry(data.getValue(), data.getKey())); } PieDataSet dataSet = new PieDataSet(entries, label); // add a lot of colors ArrayList colors = new ArrayList<>(); for (int c : ColorTemplate.JOYFUL_COLORS) colors.add(c); for (int c : ColorTemplate.COLORFUL_COLORS) colors.add(c); for (int c : ColorTemplate.VORDIPLOM_COLORS) colors.add(c); for (int c : ColorTemplate.LIBERTY_COLORS) colors.add(c); for (int c : ColorTemplate.PASTEL_COLORS) colors.add(c); colors.add(ColorTemplate.getHoloBlue()); dataSet.setColors(colors); //value line dataSet.setValueLinePart1OffsetPercentage(80.f); dataSet.setValueLinePart1Length(0.2f); dataSet.setValueLinePart2Length(0.4f); dataSet.setDrawValues(true); //dataSet.setXValuePosition(PieDataSet.ValuePosition.OUTSIDE_SLICE); // dataSet.setYValuePosition(PieDataSet.ValuePosition.OUTSIDE_SLICE); // PieData data = new PieData(dataSet); data.setValueFormatter(new PercentFormatter()); data.setValueTextSize(11f); data.setValueTextColor(Color.BLACK); // data.setValueTypeface(mTfLight); if (!entries.isEmpty()) {//数据全为空时,不显示 pieChart.setData(data); } else { pieChart.setData(null); } pieChart.setNoDataText("暂无数据"); // undo all highlights pieChart.highlightValues(null); pieChart.animateY(1400, Easing.EasingOption.EaseInOutQuad); } // // public static void quickSetupChart(HorizontalBarChart mChart, char type) { // mChart.setOnChartValueSelectedListener(this);//数据点击事件 // mChart.setHighlightEnabled(false); mChart.setScaleEnabled(false); mChart.fitScreen(); mChart.setDrawBarShadow(false); mChart.getDescription().setEnabled(false); // if more than 60 entries are displayed in the chart, no values will be // drawn mChart.setMaxVisibleValueCount(60); // scaling can now only be done on x- and y-axis separately mChart.setPinchZoom(false); // draw shadows for each bar that show the maximum value // mChart.setDrawBarShadow(true); mChart.setDrawGridBackground(false); mChart.setFocusable(false); XAxis xl = mChart.getXAxis(); xl.setPosition(XAxis.XAxisPosition.BOTTOM); xl.setTextSize(9f); // xl.setTypeface(mTfLight);//字体 xl.setDrawAxisLine(true); xl.setDrawGridLines(true); xl.setGranularity(1f);//坐标间隔 YAxis yl = mChart.getAxisLeft(); // yl.setTypeface(mTfLight); yl.setDrawAxisLine(true); yl.setDrawGridLines(false); yl.setAxisMinimum(0f); // this replaces setStartAtZero(true) yl.setEnabled(false); YAxis yr = mChart.getAxisRight(); // yr.setTypeface(mTfLight); yr.setDrawAxisLine(true); yr.setDrawGridLines(false); yr.setAxisMinimum(0f); // this replaces setStartAtZero(true) // yr.setInverted(true); yr.setEnabled(false); mChart.setFitBars(true);//x轴坐标显示对应每个bar mChart.animateY(2500); // setting data Legend l = mChart.getLegend(); l.setVerticalAlignment(Legend.LegendVerticalAlignment.BOTTOM); l.setHorizontalAlignment(Legend.LegendHorizontalAlignment.LEFT); l.setOrientation(Legend.LegendOrientation.HORIZONTAL); l.setDrawInside(false); l.setFormSize(8f); l.setXEntrySpace(4f); switch (type) { case 'a': mChart.setDrawValueAboveBar(true); yl.setInverted(true); xl.setPosition(XAxis.XAxisPosition.TOP_INSIDE); xl.setEnabled(true); break; case 'b': mChart.setDrawValueAboveBar(true); yl.setInverted(false); xl.setPosition(XAxis.XAxisPosition.TOP_INSIDE); xl.setEnabled(true); break; default: break; } } // // private static float spaceForBar = 1f; private static float barWidth = 0.4f; private static float barSpace = 0.05f; private static float groupSpace =0.1f; public static void quickSetData(HorizontalBarChart mChart, List datas, char type) { if (datas == null || datas.size() == 0) { return; } ArrayList chartData1 = datas.get(0).getChartDatas(); //坐标轴 XAxis xAxis = mChart.getXAxis(); // xAxis.setPosition(XAxis.XAxisPosition.BOTTOM); // xAxis.setDrawGridLines(false); //// xAxis.setLabelCount(2, true);//进入时的标签个数 // xAxis.setCenterAxisLabels(true);//标签处于图表中间 // xAxis.setAxisMinimum(0f); xAxis.setValueFormatter(new XFormatter(chartData1)); // // YAxis rightAxis = mChart.getAxisRight(); // rightAxis.setEnabled(false); //// rightAxis.setDrawGridLines(false); //// rightAxis.setDrawAxisLine(false); //// rightAxis.setDrawLabels(false); // YAxis leftAxis = mChart.getAxisLeft(); // leftAxis.setDrawGridLines(false); // leftAxis.setDrawAxisLine(false); // leftAxis.setDrawLabels(false); // leftAxis.setDrawTopYLabelEntry(true); // leftAxis.setZeroLineColor(Color.BLACK); // leftAxis.setDrawZeroLine(true); // leftAxis.setAxisMinimum(0f); // leftAxis.setAxisMaximum(100f); // leftAxis.setValueFormatter(new YFormatter(chartData1)); // leftAxis.setValueFormatter(new PercentFormatter()); // LimitLine limitLine = new LimitLine(100f); // limitLine.setLineColor(Color.BLACK); // leftAxis.addLimitLine(limitLine); YAxis rightAxis = mChart.getAxisRight(); rightAxis.setValueFormatter(new PercentFormatter()); //Entry数据 List> allEntries = new ArrayList<>(); for (CommonData d : datas) { List entries = new ArrayList<>(); ArrayList chartDatas = d.getChartDatas(); for (CommonData.ChartData c : chartDatas) { entries.add(new BarEntry(c.xAxisValue * spaceForBar, (float)(Math.round(c.yAxisValue *1) / 1))); } allEntries.add(entries); } if (mChart.getData() != null && mChart.getData().getDataSetCount() > 0) { for (int i = 0; i < allEntries.size(); i++) { BarDataSet set = (BarDataSet) mChart.getData().getDataSetByIndex(i); if (set != null) { set.setValues(allEntries.get(i)); } } mChart.getData().notifyDataChanged(); mChart.notifyDataSetChanged(); } else { ArrayList dataSets = new ArrayList<>(); for (int i = 0; i < allEntries.size(); i++) { BarDataSet set = new BarDataSet(allEntries.get(i), datas.get(i).getLabel()); set.setDrawIcons(false); set.setColor(getColor(i)); set.setValueFormatter(new YFormatter(chartData1)); dataSets.add(set); } BarData data = new BarData(dataSets); data.setValueTextSize(8f); data.setBarWidth(barWidth); mChart.setData(data); mChart.groupBars(0f, groupSpace, barSpace); //视图设置 mChart.setVisibleXRangeMaximum(14f); mChart.setVisibleXRangeMinimum(8f); mChart.setFitBars(true); } } // public static class CommonData { class ChartData { String xAxis; float xAxisValue; String yAxis; float yAxisValue; public ChartData(String xAxis, float xAxisValue, String yAxis, float yAxisValue) { this.xAxis = xAxis; this.xAxisValue = xAxisValue; this.yAxis = yAxis; this.yAxisValue = yAxisValue; } } private ArrayList chartDatas; private String label; public CommonData(String label) { chartDatas = new ArrayList<>(); this.label = label; } public void add(String xAxis, float x, String yAxis, float y) { chartDatas.add(new ChartData(xAxis, x, yAxis, y)); } public ArrayList getChartDatas() { return chartDatas; } public String getLabel() { return label; } public void setLabel(String label) { this.label = label; } public float getTotalYValueCount() { float count = 0; for (ChartData c : chartDatas) { count = count + c.yAxisValue; } return count; } } // static class YFormatter implements IValueFormatter { private List data; private DecimalFormat mFormat; public YFormatter(List data) { this.data = data; mFormat = new DecimalFormat("###"); } @Override public String getFormattedValue(float value, Entry entry, int dataSetIndex, ViewPortHandler viewPortHandler) { return mFormat.format(value); } } static class XFormatter implements IAxisValueFormatter { private List data; public XFormatter(List data) { this.data = data; } @Override public String getFormattedValue(float value, AxisBase axis) { return data.get((int) (value/spaceForBar)).xAxis; } } // private static int getColor(int i) { int colors[] = new int[10]; colors[0] = Color.argb(128, 255, 0, 0); colors[1] = Color.argb(128, 0, 255, 0); return colors[i]; } }