当前位置:   article > 正文

Android图表库MPAndroidChart(七)—饼状图可以再简单一点

android mpandroidchart 饼状图自定义legend表格显示

Android图表库MPAndroidChart(七)—饼状图可以再简单一点


接上文,今天实现的是用的很多的,作用在统计上的饼状图,我们看下今天的效果

这里写图片描述

这个效果,我们实现,和之前一样的套路,我先来说下这个的应用场景,假设,我是一名小学老师,现在教务处让我设置一个图表,说明下我带的班级期末考试有多少人优秀,多少人及格和不及格等等,而这些呢,我已经算出来百分比了,只剩下画图了,那好,我们就来实现以下吧

一.基本实现

首先是我们的布局

  1. <com.github.mikephil.charting.charts.PieChart
  2. android:id="@+id/mPieChart"
  3. android:layout_width="match_parent"
  4. android:layout_height="0dp"
  5. android:layout_weight="1"/>
  • 1
  • 2
  • 3
  • 4
  • 5

我们的饼状图是PieChart,然后进行初始化

  1. //饼状图
  2. mPieChart = (PieChart) findViewById(R.id.mPieChart);
  3. mPieChart.setUsePercentValues(true);
  4. mPieChart.getDescription().setEnabled(false);
  5. mPieChart.setExtraOffsets(5, 10, 5, 5);
  6. mPieChart.setDragDecelerationFrictionCoef(0.95f);
  7. //设置中间文件
  8. mPieChart.setCenterText(generateCenterSpannableText());
  9. mPieChart.setDrawHoleEnabled(true);
  10. mPieChart.setHoleColor(Color.WHITE);
  11. mPieChart.setTransparentCircleColor(Color.WHITE);
  12. mPieChart.setTransparentCircleAlpha(110);
  13. mPieChart.setHoleRadius(58f);
  14. mPieChart.setTransparentCircleRadius(61f);
  15. mPieChart.setDrawCenterText(true);
  16. mPieChart.setRotationAngle(0);
  17. // 触摸旋转
  18. mPieChart.setRotationEnabled(true);
  19. mPieChart.setHighlightPerTapEnabled(true);
  20. //变化监听
  21. mPieChart.setOnChartValueSelectedListener(this);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

饼状图还是比较简单粗暴的,这里我们把数据写上去

  1. //模拟数据
  2. ArrayList<PieEntry> entries = new ArrayList<PieEntry>();
  3. entries.add(new PieEntry(40, "优秀"));
  4. entries.add(new PieEntry(20, "满分"));
  5. entries.add(new PieEntry(30, "及格"));
  6. entries.add(new PieEntry(10, "不及格"));
  7. //设置数据
  8. setData(entries);
  9. mPieChart.animateY(1400, Easing.EasingOption.EaseInOutQuad);
  10. Legend l = mPieChart.getLegend();
  11. l.setVerticalAlignment(Legend.LegendVerticalAlignment.TOP);
  12. l.setHorizontalAlignment(Legend.LegendHorizontalAlignment.RIGHT);
  13. l.setOrientation(Legend.LegendOrientation.VERTICAL);
  14. l.setDrawInside(false);
  15. l.setXEntrySpace(7f);
  16. l.setYEntrySpace(0f);
  17. l.setYOffset(0f);
  18. // 输入标签样式
  19. mPieChart.setEntryLabelColor(Color.WHITE);
  20. mPieChart.setEntryLabelTextSize(12f);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

这里有一点要注意,他中间也是有文字的,当然,你也是可以关闭的,我们就不给他设置更多的属性了,大家有兴趣自己去实现下,我注释掉的部分

  1. //设置中间文字
  2. private SpannableString generateCenterSpannableText() {
  3. //原文:MPAndroidChart\ndeveloped by Philipp Jahoda
  4. SpannableString s = new SpannableString("刘某人程序员\n我仿佛听到有人说我帅");
  5. //s.setSpan(new RelativeSizeSpan(1.7f), 0, 14, 0);
  6. //s.setSpan(new StyleSpan(Typeface.NORMAL), 14, s.length() - 15, 0);
  7. // s.setSpan(new ForegroundColorSpan(Color.GRAY), 14, s.length() - 15, 0);
  8. //s.setSpan(new RelativeSizeSpan(.8f), 14, s.length() - 15, 0);
  9. // s.setSpan(new StyleSpan(Typeface.ITALIC), s.length() - 14, s.length(), 0);
  10. // s.setSpan(new ForegroundColorSpan(ColorTemplate.getHoloBlue()), s.length() - 14, s.length(), 0);
  11. return s;
  12. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

关于设置数据,就是调用我们的setdata方法

  1. //设置数据
  2. private void setData(ArrayList<PieEntry> entries) {
  3. PieDataSet dataSet = new PieDataSet(entries, "三年级一班");
  4. dataSet.setSliceSpace(3f);
  5. dataSet.setSelectionShift(5f);
  6. //数据和颜色
  7. ArrayList<Integer> colors = new ArrayList<Integer>();
  8. for (int c : ColorTemplate.VORDIPLOM_COLORS)
  9. colors.add(c);
  10. for (int c : ColorTemplate.JOYFUL_COLORS)
  11. colors.add(c);
  12. for (int c : ColorTemplate.COLORFUL_COLORS)
  13. colors.add(c);
  14. for (int c : ColorTemplate.LIBERTY_COLORS)
  15. colors.add(c);
  16. for (int c : ColorTemplate.PASTEL_COLORS)
  17. colors.add(c);
  18. colors.add(ColorTemplate.getHoloBlue());
  19. dataSet.setColors(colors);
  20. PieData data = new PieData(dataSet);
  21. data.setValueFormatter(new PercentFormatter());
  22. data.setValueTextSize(11f);
  23. data.setValueTextColor(Color.WHITE);
  24. mPieChart.setData(data);
  25. mPieChart.highlightValues(null);
  26. //刷新
  27. mPieChart.invalidate();
  28. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

现在运行,就是实现的了,我们再来看下其他的效果

二.显示百分比

这里写图片描述

三.显示类型

这里写图片描述

四.x轴动画

这里写图片描述

五.y轴动画

这里写图片描述

六.xy轴动画

这里写图片描述

七.显示中间文字

这里写图片描述

八.旋转动画

这里写图片描述

这些细节都是一句话就能实现的,仔细看下嘛的代码

activity_piechart.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout
  3. xmlns:android="http://schemas.android.com/apk/res/android"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent"
  6. android:orientation="vertical">
  7. <com.github.mikephil.charting.charts.PieChart
  8. android:id="@+id/mPieChart"
  9. android:layout_width="match_parent"
  10. android:layout_height="0dp"
  11. android:layout_weight="1"/>
  12. <LinearLayout
  13. android:layout_width="match_parent"
  14. android:layout_height="wrap_content"
  15. android:orientation="horizontal">
  16. <Button
  17. android:id="@+id/btn_show_percentage"
  18. android:layout_width="wrap_content"
  19. android:layout_height="wrap_content"
  20. android:text="显示百分比"/>
  21. <Button
  22. android:id="@+id/btn_show_type"
  23. android:layout_width="wrap_content"
  24. android:layout_height="wrap_content"
  25. android:text="是否铺满"/>
  26. <Button
  27. android:id="@+id/btn_anim_x"
  28. android:layout_width="wrap_content"
  29. android:layout_height="wrap_content"
  30. android:text="X轴动画"/>
  31. <Button
  32. android:id="@+id/btn_anim_y"
  33. android:layout_width="wrap_content"
  34. android:layout_height="wrap_content"
  35. android:text="Y轴动画"/>
  36. </LinearLayout>
  37. <LinearLayout
  38. android:layout_width="match_parent"
  39. android:layout_height="wrap_content"
  40. android:orientation="horizontal">
  41. <Button
  42. android:id="@+id/btn_anim_xy"
  43. android:layout_width="wrap_content"
  44. android:layout_height="wrap_content"
  45. android:text="XY轴动画"/>
  46. <Button
  47. android:id="@+id/btn_show_center_text"
  48. android:layout_width="wrap_content"
  49. android:layout_height="wrap_content"
  50. android:text="显示中间文字"/>
  51. <Button
  52. android:id="@+id/btn_save_pic"
  53. android:layout_width="wrap_content"
  54. android:layout_height="wrap_content"
  55. android:text="保存画廊"/>
  56. <Button
  57. android:id="@+id/btn_anim_rotating"
  58. android:layout_width="wrap_content"
  59. android:layout_height="wrap_content"
  60. android:text="旋转动画"/>
  61. </LinearLayout>
  62. </LinearLayout>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76

PieChartActivity

  1. public class PieChartActivity extends BaseActivity implements OnChartValueSelectedListener, View.OnClickListener {
  2. private PieChart mPieChart;
  3. //显示百分比
  4. private Button btn_show_percentage;
  5. //显示类型
  6. private Button btn_show_type;
  7. //x轴动画
  8. private Button btn_anim_x;
  9. //y轴动画
  10. private Button btn_anim_y;
  11. //xy轴动画
  12. private Button btn_anim_xy;
  13. //保存到sd卡
  14. private Button btn_save_pic;
  15. //显示中间文字
  16. private Button btn_show_center_text;
  17. //旋转动画
  18. private Button btn_anim_rotating;
  19. @Override
  20. protected void onCreate(Bundle savedInstanceState) {
  21. super.onCreate(savedInstanceState);
  22. setContentView(R.layout.activity_piechart);
  23. initView();
  24. }
  25. //初始化View
  26. private void initView() {
  27. btn_show_percentage = (Button) findViewById(R.id.btn_show_percentage);
  28. btn_show_percentage.setOnClickListener(this);
  29. btn_show_type = (Button) findViewById(R.id.btn_show_type);
  30. btn_show_type.setOnClickListener(this);
  31. btn_anim_x = (Button) findViewById(R.id.btn_anim_x);
  32. btn_anim_x.setOnClickListener(this);
  33. btn_anim_y = (Button) findViewById(R.id.btn_anim_y);
  34. btn_anim_y.setOnClickListener(this);
  35. btn_anim_xy = (Button) findViewById(R.id.btn_anim_xy);
  36. btn_anim_xy.setOnClickListener(this);
  37. btn_save_pic = (Button) findViewById(R.id.btn_save_pic);
  38. btn_save_pic.setOnClickListener(this);
  39. btn_show_center_text = (Button) findViewById(R.id.btn_show_center_text);
  40. btn_show_center_text.setOnClickListener(this);
  41. btn_anim_rotating = (Button) findViewById(R.id.btn_anim_rotating);
  42. btn_anim_rotating.setOnClickListener(this);
  43. //饼状图
  44. mPieChart = (PieChart) findViewById(R.id.mPieChart);
  45. mPieChart.setUsePercentValues(true);
  46. mPieChart.getDescription().setEnabled(false);
  47. mPieChart.setExtraOffsets(5, 10, 5, 5);
  48. mPieChart.setDragDecelerationFrictionCoef(0.95f);
  49. //设置中间文件
  50. mPieChart.setCenterText(generateCenterSpannableText());
  51. mPieChart.setDrawHoleEnabled(true);
  52. mPieChart.setHoleColor(Color.WHITE);
  53. mPieChart.setTransparentCircleColor(Color.WHITE);
  54. mPieChart.setTransparentCircleAlpha(110);
  55. mPieChart.setHoleRadius(58f);
  56. mPieChart.setTransparentCircleRadius(61f);
  57. mPieChart.setDrawCenterText(true);
  58. mPieChart.setRotationAngle(0);
  59. // 触摸旋转
  60. mPieChart.setRotationEnabled(true);
  61. mPieChart.setHighlightPerTapEnabled(true);
  62. //变化监听
  63. mPieChart.setOnChartValueSelectedListener(this);
  64. //模拟数据
  65. ArrayList<PieEntry> entries = new ArrayList<PieEntry>();
  66. entries.add(new PieEntry(40, "优秀"));
  67. entries.add(new PieEntry(20, "满分"));
  68. entries.add(new PieEntry(30, "及格"));
  69. entries.add(new PieEntry(10, "不及格"));
  70. //设置数据
  71. setData(entries);
  72. mPieChart.animateY(1400, Easing.EasingOption.EaseInOutQuad);
  73. Legend l = mPieChart.getLegend();
  74. l.setVerticalAlignment(Legend.LegendVerticalAlignment.TOP);
  75. l.setHorizontalAlignment(Legend.LegendHorizontalAlignment.RIGHT);
  76. l.setOrientation(Legend.LegendOrientation.VERTICAL);
  77. l.setDrawInside(false);
  78. l.setXEntrySpace(7f);
  79. l.setYEntrySpace(0f);
  80. l.setYOffset(0f);
  81. // 输入标签样式
  82. mPieChart.setEntryLabelColor(Color.WHITE);
  83. mPieChart.setEntryLabelTextSize(12f);
  84. }
  85. //设置中间文字
  86. private SpannableString generateCenterSpannableText() {
  87. //原文:MPAndroidChart\ndeveloped by Philipp Jahoda
  88. SpannableString s = new SpannableString("刘某人程序员\n我仿佛听到有人说我帅");
  89. //s.setSpan(new RelativeSizeSpan(1.7f), 0, 14, 0);
  90. //s.setSpan(new StyleSpan(Typeface.NORMAL), 14, s.length() - 15, 0);
  91. // s.setSpan(new ForegroundColorSpan(Color.GRAY), 14, s.length() - 15, 0);
  92. //s.setSpan(new RelativeSizeSpan(.8f), 14, s.length() - 15, 0);
  93. // s.setSpan(new StyleSpan(Typeface.ITALIC), s.length() - 14, s.length(), 0);
  94. // s.setSpan(new ForegroundColorSpan(ColorTemplate.getHoloBlue()), s.length() - 14, s.length(), 0);
  95. return s;
  96. }
  97. //设置数据
  98. private void setData(ArrayList<PieEntry> entries) {
  99. PieDataSet dataSet = new PieDataSet(entries, "三年级一班");
  100. dataSet.setSliceSpace(3f);
  101. dataSet.setSelectionShift(5f);
  102. //数据和颜色
  103. ArrayList<Integer> colors = new ArrayList<Integer>();
  104. for (int c : ColorTemplate.VORDIPLOM_COLORS)
  105. colors.add(c);
  106. for (int c : ColorTemplate.JOYFUL_COLORS)
  107. colors.add(c);
  108. for (int c : ColorTemplate.COLORFUL_COLORS)
  109. colors.add(c);
  110. for (int c : ColorTemplate.LIBERTY_COLORS)
  111. colors.add(c);
  112. for (int c : ColorTemplate.PASTEL_COLORS)
  113. colors.add(c);
  114. colors.add(ColorTemplate.getHoloBlue());
  115. dataSet.setColors(colors);
  116. PieData data = new PieData(dataSet);
  117. data.setValueFormatter(new PercentFormatter());
  118. data.setValueTextSize(11f);
  119. data.setValueTextColor(Color.WHITE);
  120. mPieChart.setData(data);
  121. mPieChart.highlightValues(null);
  122. //刷新
  123. mPieChart.invalidate();
  124. }
  125. @Override
  126. public void onValueSelected(Entry e, Highlight h) {
  127. }
  128. @Override
  129. public void onNothingSelected() {
  130. }
  131. @Override
  132. public void onClick(View v) {
  133. switch (v.getId()) {
  134. //显示百分比
  135. case R.id.btn_show_percentage:
  136. for (IDataSet<?> set : mPieChart.getData().getDataSets())
  137. set.setDrawValues(!set.isDrawValuesEnabled());
  138. mPieChart.invalidate();
  139. break;
  140. //显示类型
  141. case R.id.btn_show_type:
  142. if (mPieChart.isDrawHoleEnabled())
  143. mPieChart.setDrawHoleEnabled(false);
  144. else
  145. mPieChart.setDrawHoleEnabled(true);
  146. mPieChart.invalidate();
  147. break;
  148. //x轴动画
  149. case R.id.btn_anim_x:
  150. mPieChart.animateX(1400);
  151. break;
  152. //y轴动画
  153. case R.id.btn_anim_y:
  154. mPieChart.animateY(1400);
  155. break;
  156. //xy轴动画
  157. case R.id.btn_anim_xy:
  158. mPieChart.animateXY(1400, 1400);
  159. break;
  160. //保存到sd卡
  161. case R.id.btn_save_pic:
  162. mPieChart.saveToPath("title" + System.currentTimeMillis(), "");
  163. break;
  164. //显示中间文字
  165. case R.id.btn_show_center_text:
  166. if (mPieChart.isDrawCenterTextEnabled())
  167. mPieChart.setDrawCenterText(false);
  168. else
  169. mPieChart.setDrawCenterText(true);
  170. mPieChart.invalidate();
  171. break;
  172. //旋转动画
  173. case R.id.btn_anim_rotating:
  174. mPieChart.spin(1000, mPieChart.getRotationAngle(), mPieChart.getRotationAngle() + 360, Easing.EasingOption
  175. .EaseInCubic);
  176. break;
  177. }
  178. }
  179. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211

是不是觉得很欢快呢?就是这样,我都有考虑是不是要二次封装一个MP了,因为基本的套路都是一模一样的,好了,接下来,我们最后看下运行效果

这里写图片描述

有兴趣的加群:555974449

Sample:http://download.csdn.net/detail/qq_26787115/9685567

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/254827?site
推荐阅读
相关标签
  

闽ICP备14008679号