当前位置:   article > 正文

android柱状图和饼状图的的实现_android combinedchart

android combinedchart

还是先看看效果图,免得浪费大家的时间



1.第三方框架有很多,这里采用的是MPAndroidChart,github链接下面

https://github.com/PhilJay/MPAndroidChart

AS的导入:直接配置gradle,

compile 'com.github.PhilJay:MPAndroidChart:v2.2.4'。
Eclipse:请自行看github上的介绍。

2.初始化配置

 2.1这是布局柱状图和线条的的布局

  1. <com.github.mikephil.charting.charts.CombinedChart
  2. android:id="@+id/chart1"
  3. android:layout_below="@+id/left_y"
  4. android:layout_width="match_parent"
  5. android:layout_height="320dp"
  6. android:layout_marginLeft="15dp"
  7. android:layout_marginRight="15dp"
  8. >
  9. </com.github.mikephil.charting.charts.CombinedChart>
2.2这是饼状图的布局
  1. <com.github.mikephil.charting.charts.PieChart
  2. android:id="@+id/first_pie"
  3. android:layout_width="match_parent"
  4. android:layout_height="400dp"
  5. android:layout_marginLeft="15dp"
  6. android:layout_marginRight="15dp">
  7. </com.github.mikephil.charting.charts.PieChart>
2.3 一些初始化配置抽取成了static的工具方法

2.3.1柱状图的一些配置

  1. /**
  2. * 初始化一些配置
  3. * @param mChart
  4. */
  5. public static void initMchat(Context context,CombinedChart mChart) {
  6. mChart.setBackgroundColor(Color.WHITE);
  7. mChart.setDrawGridBackground(false);
  8. mChart.setDrawBarShadow(false);//柱状图无阴影
  9. mChart.setDescription("");
  10. // draw bars behind lines
  11. mChart.setDrawOrder(new CombinedChart.DrawOrder[]{
  12. CombinedChart.DrawOrder.BAR, CombinedChart.DrawOrder.BUBBLE, CombinedChart.DrawOrder.CANDLE, CombinedChart.DrawOrder.LINE, CombinedChart.DrawOrder.SCATTER
  13. });
  14. //右侧y轴,针对线的y
  15. YAxis rightAxis = mChart.getAxisRight();
  16. rightAxis.setDrawGridLines(false);
  17. rightAxis.setAxisLineWidth(Utils.dip2px(context, 1));
  18. rightAxis.setAxisLineColor(Color.rgb(5, 112, 118));
  19. rightAxis.setAxisMinValue(0f); // this replaces setStartAtZero(true)
  20. rightAxis.setTextColor(Color.rgb(5, 112, 118));
  21. //左侧y坐标,针对柱的y
  22. YAxis leftAxis = mChart.getAxisLeft();
  23. leftAxis.setAxisLineColor(Color.rgb(253, 134, 10));
  24. leftAxis.setAxisLineWidth(Utils.dip2px(context, 1));
  25. leftAxis.setDrawGridLines(false);
  26. leftAxis.setSpaceTop(0.1f);
  27. leftAxis.setTextColor(Color.rgb(253,134,10));
  28. //x轴相关的参数
  29. XAxis xAxis = mChart.getXAxis();
  30. xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);//设置x周的位置
  31. xAxis.setDrawGridLines(false);
  32. }


2.3.2饼状图的一些初始化配置

  1. //初始化饼状图
  2. public static void initPie(Context context,PieChart mChart){
  3. mChart.setDescription("");
  4. mChart.setExtraOffsets(5, 10, 5, 5);//外边距
  5. mChart.setDragDecelerationFrictionCoef(0.95f);//转动惯性
  6. mChart.setDrawHoleEnabled(true);//pie中央不绘制
  7. mChart.setHoleColor(Color.WHITE);//中央的颜色
  8. mChart.setTransparentCircleColor(Color.WHITE);//透明度
  9. mChart.setTransparentCircleAlpha(110);
  10. mChart.setHoleRadius(50f);//中心圆的半径
  11. mChart.setTransparentCircleRadius(56f);//半透明圈
  12. mChart.setDrawCenterText(true);//饼状图中间可以添加文字
  13. mChart.setDrawSliceText(false);
  14. mChart.setRotationAngle(0);//初始旋转角度
  15. mChart.setRotationEnabled(true);
  16. mChart.setHighlightPerTapEnabled(true);
  17. mChart.setUsePercentValues(true);
  18. Legend l = mChart.getLegend();
  19. l.setEnabled(false);
  20. }
3.数据的初始化

3.1饼状图和折线图的数据

  1. private List<String> barXData;//柱状图的x轴至的集合
  2. private List<String> pieXData;//饼状图的x轴的集合
  3. private List<BarEntry> barY1;//柱状图的y值集合
  4. private List<Entry> barY2;//线条的y值集合
  5. private ArrayList<Entry> pieY1;//饼状图的y
  6. List barBeans = chartDataBean.getMsg().getBar();//charDataBean为json解析到的数据bean
  7. for (int i = 0; i < barBeans.size(); i++) {
  8. ChartDataBean.MsgBean.BarBean barBean = (ChartDataBean.MsgBean.BarBean) barBeans.get(i);
  9. barXData.add(barBean.getX());
  10. //2.柱状图数据
  11. BarEntry barEntry = new BarEntry((float) barBean.getIncome(), i);
  12. barY1.add(barEntry);
  13. //3.折线图数据
  14. Entry entry = new Entry((float)barBean.getSaled(), i);
  15. barY2.add(entry);
3.2饼状图的数据的 初始化
  1. //饼状图的xvalue
  2. ChartDataBean.MsgBean.SectorIncomeBean sectorIncomeBean = sectorIncome.get(i);
  3. pie1XData.add(sectorIncomeBean.getName());
  4. //饼状图的y value
  5. Entry pieEntry = new Entry((float) sectorIncomeBean.getRate(), i);
  6. pieY1.add(pieEntry);
  7. 饼状图的数据填充是需要一个PieData的bean,接下来根据pieYdata生成这个bean
  8. private PieDataSet generatePieDataSet(ArrayList<Entry> yValues) {
  9. //y轴的集合
  10. PieDataSet pieDataSet = new PieDataSet(yValues, ""/*显示在比例图上*/);
  11. pieDataSet.setSliceSpace(1f); //设置个饼状图之间的距离
  12. generatePieColor();
  13. pieDataSet.setColors(colors);
  14. DisplayMetrics metrics = this.getResources().getDisplayMetrics();
  15. float px = 3 * (metrics.densityDpi / 160f);
  16. pieDataSet.setSelectionShift(px); // 选中态多出的长度
  17. pieDataSet.setValueTextColor(Color.WHITE);//设置value的字体颜色
  18. return pieDataSet;
  19. }
  20. private ArrayList<Integer> generatePieColor() {
  21. colors = new ArrayList<>();
  22. // 饼图颜色
  23. for (int i = 0; i < pieY1.size(); i++) {
  24. colors.add(Color.rgb((int) (Math.random() * 255), (int) (Math.random() * 255), (int) (Math.random() * 255)));
  25. }
  26. return colors;
  27. }

generatePieColor()是为饼状图的每一块生成以个填充颜色,采用的是随机rgb,不知道为什么,出现相同颜色的概率特别高,不过界限仍然很清晰的,介意的可以加一个生成不重复的随机数的算法。 

4.最后一步,数据的填

4.1柱状图的数据的填充(封装到了utils中 )

MChatUtils.setData(chart1, barXData, barY1, barY2);
  1. /**
  2. * 填充数据
  3. * @param mChart 视图组件
  4. * @param xData x轴数据
  5. * @param barEntries
  6. * @param entryList
  7. */
  8. public static void setData(CombinedChart mChart, List<String> xData, List<BarEntry> barEntries, List<Entry> entryList){
  9. mChart.clear();
  10. CombinedData data = new CombinedData(xData);//x坐标的坐标值
  11. data.setData(generateLineData(entryList));//折线的数据
  12. data.setData(generateBarData(barEntries));//柱状图的数据
  13. mChart.setData(data);
  14. mChart.getLegend().setForm(Legend.LegendForm.SQUARE);
  15. mChart.invalidate();
  16. mChart.animateXY(1000,1000);
  17. }
  1. /**
  2. * 生成柱状图的数据
  3. * @return
  4. */
  5. public static BarData generateBarData(List<BarEntry> entries) {
  6. BarData d = new BarData();
  7. BarDataSet barDataSet = new BarDataSet(entries, "金额(元)");
  8. final DecimalFormat df = new DecimalFormat("0.00");
  9. //设置数据样式
  10. barDataSet.setValueFormatter(new ValueFormatter() {
  11. @Override
  12. public String getFormattedValue(float value, Entry entry, int dataSetIndex, ViewPortHandler viewPortHandler) {
  13. return "" + df.format(value);
  14. }
  15. });
  16. barDataSet.setColor(Color.rgb(253, 134, 10));
  17. barDataSet.setDrawValues(true);
  18. barDataSet.setValueTextColor(Color.rgb(0, 0, 0));
  19. barDataSet.setValueTextSize(10f);
  20. // barDataSet.setBarSpacePercent(1);
  21. barDataSet.setValueTextColor(Color.rgb(253, 134, 10));
  22. d.addDataSet(barDataSet);
  23. barDataSet.setAxisDependency(YAxis.AxisDependency.LEFT);
  24. return d;
  25. }
  26. public static LineData generateLineData(List<Entry> entries) {
  27. d = new LineData();
  28. lineDataSet = new LineDataSet(entries, "订单数量(个)");
  29. //设置数据样式
  30. lineDataSet.setValueFormatter(new ValueFormatter() {
  31. @Override
  32. public String getFormattedValue(float value, Entry entry, int dataSetIndex, ViewPortHandler viewPortHandler) {
  33. return ""+(int)value;
  34. }
  35. });
  36. lineDataSet.setColor(Color.rgb(5, 112, 118));//线的颜色
  37. lineDataSet.setLineWidth(1.5f);//线宽
  38. lineDataSet.setCircleColor(Color.rgb(5, 112, 118));//圆点的颜色
  39. lineDataSet.setCircleRadius(3f);//圆点的半径
  40. lineDataSet.setCircleColorHole(Color.rgb(5, 112, 118));
  41. lineDataSet.setFillColor(Color.rgb(5, 112, 118));
  42. lineDataSet.setDrawCubic(false);//是否自动计算函数,曲线或是直线
  43. lineDataSet.setDrawValues(true);//是否显示圆点对应的值
  44. lineDataSet.setValueTextSize(10f);//圆点对应值得字体大小
  45. lineDataSet.setValueTextColor(Color.rgb(5, 112, 118));//字体颜色
  46. lineDataSet.setAxisDependency(YAxis.AxisDependency.RIGHT);//以哪个轴为准
  47. d.addDataSet(lineDataSet);
  48. return d;
  49. }

4.2饼状图的数据的填充

  1. MChatUtils.setPieData(first_pie, pie1XData, pieDataSet1);
  2. public static void setPieData(PieChart pieChart, List<String> xValues, PieDataSet pieDataSet) {
  3. pieChart.clear();
  4. pieChart.animateY(2000, Easing.EasingOption.EaseInOutQuad);
  5. PieData pieData=new PieData(xValues,pieDataSet);
  6. pieData.setValueFormatter(new PercentFormatter());//设置为百分比显示
  7. pieChart.setData(pieData);
  8. }

4.2.1饼状图中间数据的填充
  1. public static void setCenterText(PieChart pieChart, String text) {
  2. pieChart.setCenterText(text);
  3. pieChart.setCenterTextSize(20);
  4. pieChart.setCenterTextColor(Color.rgb(61,149,25));
  5. }
至此,整个流程完成,如有疑惑,下发留言

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/254848
推荐阅读
相关标签
  

闽ICP备14008679号