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"/>

我们的饼状图是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. 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. 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. }

关于设置数据,就是调用我们的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. }

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

二.显示百分比

三.显示类型

四.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>

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. }

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

有兴趣的加群:555974449

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

Android图表库MPAndroidChart(七)—饼状图可以再简单一点的更多相关文章

  1. Android图表库MPAndroidChart(八)——饼状图的扩展:折线饼状图

    Android图表库MPAndroidChart(八)--饼状图的扩展:折线饼状图 我们接着上文,饼状图的扩展,增加折现的说明,来看下我们要实现的效果 因为之前对MPAndroidChart的熟悉,所 ...

  2. Android图表库MPAndroidChart(三)——双重轴线形图的实现,这次就so easy了

    Android图表库MPAndroidChart(三)--双重轴线形图的实现,这次就so easy了 在学习本课程之前我建议先把我之前的博客看完,这样对整体的流程有一个大致的了解 Android图表库 ...

  3. Android图表库MPAndroidChart(二)——线形图的方方面面,看完你会回来感谢我的

    Android图表库MPAndroidChart(二)--线形图的方方面面,看完你会回来感谢我的 在学习本课程之前我建议先把我之前的博客看完,这样对整体的流程有一个大致的了解 Android图表库MP ...

  4. Android图表库MPAndroidChart(十三)——简约的底部柱状图

    Android图表库MPAndroidChart(十三)--简约的底部柱状图 我们继续上一讲,今天还是说下柱状图,这个图的话应该是用的比较多的,所有拿出来溜溜,先看下效果 我们还是来看下基本实现 一. ...

  5. Android图表库MPAndroidChart(十)——散点图的孪生兄弟气泡图

    Android图表库MPAndroidChart(十)--散点图的孪生兄弟气泡图 起泡图和散点图如出一辙,但是个人认为要比散点图好看一点,我们来看下实际的演示效果 这个和散点图的实现很相似,我们一起来 ...

  6. Android图表库MPAndroidChart(六)——换一种思考方式,水平条形图的实现过程

    Android图表库MPAndroidChart(六)--换一种思考方式,水平条形图的实现过程 一.基本实现 我们之前实现了条形图,现在来看下水平条形图是怎么实现的,说白了就是横起来,看下效果: 说起 ...

  7. Android图表库MPAndroidChart(五)——自定义MarkerView实现选中高亮

    Android图表库MPAndroidChart(五)--自定义MarkerView实现选中高亮 在学习本课程之前我建议先把我之前的博客看完,这样对整体的流程有一个大致的了解 Android图表库MP ...

  8. Android图表库MPAndroidChart(四)——条形图的绘制过程过程,隐隐约约我看到了套路

    Android图表库MPAndroidChart(四)--条形图的绘制过程过程,隐隐约约我看到了套路 在学习本课程之前我建议先把我之前的博客看完,这样对整体的流程有一个大致的了解 Android图表库 ...

  9. Android图表库MPAndroidChart(一)——了解他的本质,方能得心应手

    Android图表库MPAndroidChart(一)--了解他的本质,方能得心应手 我们项目中经常会遇到一些统计图,比如折线图,线形图等,在一些运动健康类的App中尤其的常见,这画起来要命,我以前就 ...

随机推荐

  1. SpringBoot开发案例之多任务并行+线程池处理

    前言 前几篇文章着重介绍了后端服务数据库和多线程并行处理优化,并示例了改造前后的伪代码逻辑.当然了,优化是无止境的,前人栽树后人乘凉.作为我们开发者来说,既然站在了巨人的肩膀上,就要写出更加优化的程序 ...

  2. webstorm中github的配置

    1.申请一个github账号,我这里的操作是已经有了账号的情况之下进行的. 打开webstorm,File-->settings,弹出settings框,输入git,得到以下界面,输入githu ...

  3. java中的内部类概念

    内部类和外部类可以互相访问私有属性 1.普通内部类实例化方式 外部类.内部类 对象 = new 外部类().new 内部类(); class Outer{//外部类 private String ms ...

  4. java面试3-对于java中值传递的理解(Hollis)

    这是根据Hollis的直面java内容习得(有兴趣的可以加他微信公众号) 对于初学者来说,要理解java中的值传递很难理解,为什么说java只有值传递?那引用传递呢? java中的错误理解: 错误理解 ...

  5. Joomla!3.7.0 Core SQL注入漏洞动态调试草稿

    参考joolma的mvc框架讲解:http://www.360doc.com/content/11/1219/18/1372409_173441270.shtml 从这个页面开始下断点:Joomla_ ...

  6. PHPCMS v9.6.0 任意文件上传漏洞分析

    引用源:http://paper.seebug.org/273/ 配置了php debug的环境,并且根据这篇文章把流程走了一遍,对phpstorm的debug熟练度+1(跟pycharm一样) 用户 ...

  7. 《C++ Primer》学习笔记:3.3.3其他vector操作

    <C++ Primer>(第五版)中计算vector对象中的索引这一小节中,举例要求计算各个分数段各有多少个成绩. 代码如下: #include <iostream> #inc ...

  8. [HNOI2011]任务调度

    题目描述 有 N 个任务和两台机器 A 与 B.每个任务都需要既在机器 A 上执行,又在机器 B 上执行, 第 i 个任务需要在机器 A 上执行时间 Ai,且需要在机器 B 上执行时间 Bi.最终的目 ...

  9. 【BZOJ1026】【SCOI2009】windy数

    Description windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道,在A和B之间,包括A和B,总共有多少个windy数? In ...

  10. Codeforces Round #452 F. Letters Removing

    Description Petya has a string of length n consisting of small and large English letters and digits. ...