Android开发学习之路--图表实现(achartengine/MPAndroidChart)之初体验

谁践踏了优雅 2022-05-27 01:47 470阅读 0赞

 已经有一段时间没有更新博客了,在上周离开工作了4年的公司,从此不再安安稳稳地工作了,更多的是接受挑战和实现自身价值的提高。离开了嵌入式linux,从此拥抱移动互联网,也许有点为时已晚,但是相信通过努力,什么时候都不会太晚。关于转行,关于这次的转型会不会成功,都是未知数,谁知道呢。以后就好好学习互联网相关的知识,偶尔业余玩玩树莓派,玩玩机器人之类的。
  时间过得很快,已经在新公司待了一周了,简单熟悉了环境,熟悉了产品,也学了些第三份框架的使用,什么data binding, retrofit, picasso,rxjava/rxandroid等。虽然学得不快,也算是了解了部分了,这些后面再慢慢地总结。
   唠叨了一大堆,还是记录记录android下的图表的简单实现吧。关于android的图表,这里就换作chart吧,如果要自己实现的话,那工作量可是很大的,好在有好几个开源的框架可以拿来使用,首先是achartengine了:achartengine github源码链接。其次是MPAndroidChart:MPAndroidChart github源码链接。关于更详细的介绍可以参考上面的链接,这里主要是简单讲下使用。因为没找到android studio的dependencies,所以就网上下载了相应的jar包了,具体已经在百度云上了,可以参考下面的链接。
链接: http://pan.baidu.com/s/1i4N2glB 密码: 2fe2


运行效果如下

20160403120621726

   这里依次是atchartengine的折线图,MPAndroidChart的折线图和饼图。


achartengine

  至于怎么包含jar包,怎么建工程这就不多讲了,既然都要学习第三方的框架了,这些基础肯定有的了。首先是怎么把chart安在界面上,achartengine可以直接使用LinearLayout,然后把需要的chart绘画在这个LinearLayout上。具体xml如下所示:

  1. <LinearLayout
  2. android:id="@+id/chart"
  3. android:layout_width="match_parent"
  4. android:layout_height="150dp"
  5. android:orientation="vertical">
  6. </LinearLayout>

  具体代码实现如下,基本上都加了注释了,理解起来还是很方便的了,具体看ChartActivity代码中:

  当然atchartengine还有其他更加强大的功能,这里只是简单用了下折线图。


MPAndroidChart

折线图配置

  MPAndroidChart的实现需要用到自定义的空间com.github.mikephil.charting.charts.LineChart来实现折线图:

  1. <com.github.mikephil.charting.charts.LineChart
  2. android:id="@+id/spread_line_chart"
  3. android:layout_width="match_parent"
  4. android:layout_height="150dp" />
  • 1
  • 2
  • 3
  • 4

饼图配置

  MPAndroidChart的实现需要用到自定义的空间com.github.mikephil.charting.charts.PieChart来实现折线图:

  1. <com.github.mikephil.charting.charts.PieChart
  2. android:id="@+id/spread_pie_chart"
  3. android:layout_width="match_parent"
  4. android:layout_height="200dp"/>

act_chart xml实现

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical">
  6. <LinearLayout
  7. android:id="@+id/chart"
  8. android:layout_width="match_parent"
  9. android:layout_height="150dp"
  10. android:orientation="vertical">
  11. </LinearLayout>
  12. <com.github.mikephil.charting.charts.LineChart
  13. android:id="@+id/spread_line_chart"
  14. android:layout_width="match_parent"
  15. android:layout_height="150dp" />
  16. <com.github.mikephil.charting.charts.PieChart
  17. android:id="@+id/spread_pie_chart"
  18. android:layout_width="match_parent"
  19. android:layout_height="200dp"/>
  20. <Button
  21. android:id="@+id/getData"
  22. android:layout_height="wrap_content"
  23. android:layout_width="match_parent"
  24. android:text="获取当访问量" />
  25. </LinearLayout>

ChartActivity java代码实现:

  代码的主要介绍在注释里面:

  1. package com.jared.emdatabindingstudy.ui;
  2. import android.graphics.Color;
  3. import android.graphics.Paint;
  4. import android.graphics.Typeface;
  5. import android.os.Bundle;
  6. import android.support.annotation.Nullable;
  7. import android.util.DisplayMetrics;
  8. import android.view.View;
  9. import android.widget.Button;
  10. import android.widget.LinearLayout;
  11. import com.github.mikephil.charting.charts.LineChart;
  12. import com.github.mikephil.charting.charts.PieChart;
  13. import com.github.mikephil.charting.components.Legend;
  14. import com.github.mikephil.charting.components.XAxis;
  15. import com.github.mikephil.charting.components.YAxis;
  16. import com.github.mikephil.charting.data.Entry;
  17. import com.github.mikephil.charting.data.LineData;
  18. import com.github.mikephil.charting.data.LineDataSet;
  19. import com.github.mikephil.charting.data.PieData;
  20. import com.github.mikephil.charting.data.PieDataSet;
  21. import com.jared.emdatabindingstudy.R;
  22. import org.achartengine.ChartFactory;
  23. import org.achartengine.GraphicalView;
  24. import org.achartengine.chart.PointStyle;
  25. import org.achartengine.model.CategorySeries;
  26. import org.achartengine.model.XYMultipleSeriesDataset;
  27. import org.achartengine.renderer.XYMultipleSeriesRenderer;
  28. import org.achartengine.renderer.XYSeriesRenderer;
  29. import java.util.ArrayList;
  30. import java.util.List;
  31. /**
  32. * Created by jared on 16/4/1.
  33. */
  34. public class ChartActivity extends BaseActivity {
  35. private final static String TAG = ChartActivity.class.getSimpleName();
  36. private LinearLayout chartLyt;
  37. private LineChart mLineChart;
  38. private PieChart mPieChart;
  39. Typeface mTf; // 自定义显示字体
  40. private Button getDataBtn;
  41. private List<Integer> lists = new ArrayList<Integer>();
  42. private void setLists() {
  43. lists.clear();
  44. for (int i = 1; i < 20; i++) {
  45. int value = ((int) (Math.random() * 100));
  46. lists.add(value);
  47. }
  48. }
  49. @Override
  50. protected void onCreate(@Nullable Bundle savedInstanceState) {
  51. super.onCreate(savedInstanceState);
  52. setContentView(R.layout.act_chart);
  53. getDataBtn = (Button) findViewById(R.id.getData);
  54. getDataBtn.setOnClickListener(this);
  55. chartLyt = (LinearLayout) findViewById(R.id.chart);
  56. mTf = Typeface.createFromAsset(getAssets(), "OpenSans-Bold.ttf");
  57. drawTheChart();
  58. drawTheChartByMPAndroid();
  59. drawPieChart();
  60. }
  61. private void drawPieChart() {
  62. mPieChart = (PieChart) findViewById(R.id.spread_pie_chart);
  63. PieData mPieData = getPieData(4, 100);
  64. showPieChart(mPieChart, mPieData);
  65. }
  66. private void showPieChart(PieChart pieChart, PieData pieData) {
  67. pieChart.setHoleColorTransparent(true);
  68. pieChart.setHoleRadius(40f); //半径
  69. pieChart.setTransparentCircleRadius(50f); //半透明圈
  70. pieChart.setDescription("");
  71. pieChart.setDrawHoleEnabled(true);
  72. pieChart.setRotationAngle(90); //初始角度
  73. pieChart.setRotationEnabled(true); //可以手动旋转
  74. pieChart.setUsePercentValues(true); //显示百分比
  75. pieChart.setDrawCenterText(true); //饼状图中间可以添加文字
  76. pieChart.setCenterText("人员分布");
  77. pieChart.setCenterTextColor(Color.GRAY);
  78. pieChart.setCenterTextTypeface(mTf);
  79. pieChart.setData(pieData);
  80. Legend mLegend = pieChart.getLegend(); //设置比例图
  81. mLegend.setPosition(Legend.LegendPosition.RIGHT_OF_CHART); //坐右边显示
  82. mLegend.setXEntrySpace(10f);
  83. mLegend.setYEntrySpace(5f);
  84. mLegend.setTypeface(mTf);
  85. mLegend.setTextColor(Color.GRAY);
  86. pieChart.animateXY(1000, 1000);
  87. }
  88. private PieData getPieData(int count, float range) {
  89. ArrayList<String> xValues = new ArrayList<String>(); //用来表示每个饼块上的内容
  90. String[] content = new String[] {
  91. "<10", "10~20", "21~40", ">40"};
  92. for (int i = 0; i < count; i++) {
  93. xValues.add("年龄("+content[i]+")");
  94. }
  95. ArrayList<Entry> yValue = new ArrayList<Entry>(); //用来表示封装每个饼块的实际数据
  96. List<Float> qs = new ArrayList<Float>();
  97. qs.add(14f); qs.add(14f);qs.add(34f);qs.add(38f);
  98. for (int i = 0; i < qs.size(); i++) {
  99. yValue.add(new Entry(qs.get(i), i));
  100. }
  101. PieDataSet pieDataSet = new PieDataSet(yValue, "2015浏览量统计");
  102. pieDataSet.setSliceSpace(0f);
  103. ArrayList<Integer> colors = new ArrayList<Integer>();
  104. //饼图颜色
  105. colors.add(Color.rgb(205, 205, 205));
  106. colors.add(Color.rgb(114, 188, 223));
  107. colors.add(Color.rgb(255, 123, 124));
  108. colors.add(Color.rgb(57, 135, 200));
  109. pieDataSet.setColors(colors); //设置颜色
  110. pieDataSet.setValueTextSize(8f);
  111. pieDataSet.setValueTextColor(Color.WHITE);
  112. pieDataSet.setValueTypeface(mTf); //设置字体样式
  113. DisplayMetrics metrics = getResources().getDisplayMetrics();
  114. float px = 5 * (metrics.densityDpi / 160f);
  115. pieDataSet.setSelectionShift(px); //选中态多出的长度
  116. PieData pieData = new PieData(xValues, pieDataSet);
  117. return pieData;
  118. }
  119. private void drawTheChartByMPAndroid() {
  120. mLineChart = (LineChart) findViewById(R.id.spread_line_chart);
  121. LineData lineData = getLineData(36, 1000);
  122. showChart(mLineChart, lineData, Color.rgb(137, 230, 81));
  123. }
  124. private void showChart(LineChart lineChart, LineData lineData, int color) {
  125. lineChart.setDrawBorders(false); //在折线图上添加边框
  126. lineChart.setDescription(""); //数据描述
  127. lineChart.setNoDataTextDescription("You need to provide data for the chart.");
  128. lineChart.setDrawGridBackground(false); //表格颜色
  129. lineChart.setGridBackgroundColor(Color.WHITE & 0x70FFFFFF); //表格的颜色,设置一个透明度
  130. lineChart.setTouchEnabled(true); //可点击
  131. lineChart.setDragEnabled(true); //可拖拽
  132. lineChart.setScaleEnabled(true); //可缩放
  133. lineChart.setPinchZoom(false);
  134. lineChart.setBackgroundColor(color); //设置背景颜色
  135. lineChart.setData(lineData); //填充数据
  136. Legend mLegend = lineChart.getLegend(); //设置标示,就是那个一组y的value的
  137. mLegend.setForm(Legend.LegendForm.CIRCLE); //样式
  138. mLegend.setFormSize(6f); //字体
  139. mLegend.setTextColor(Color.WHITE); //颜色
  140. lineChart.setVisibleXRange(1, 7); //x轴可显示的坐标范围
  141. XAxis xAxis = lineChart.getXAxis(); //x轴的标示
  142. xAxis.setPosition(XAxis.XAxisPosition.BOTTOM); //x轴位置
  143. xAxis.setTextColor(Color.WHITE); //字体的颜色
  144. xAxis.setTextSize(10f); //字体大小
  145. xAxis.setGridColor(Color.WHITE);//网格线颜色
  146. xAxis.setDrawGridLines(false); //不显示网格线
  147. xAxis.setTypeface(mTf);
  148. YAxis axisLeft = lineChart.getAxisLeft(); //y轴左边标示
  149. YAxis axisRight = lineChart.getAxisRight(); //y轴右边标示
  150. axisLeft.setTextColor(Color.WHITE); //字体颜色
  151. axisLeft.setTextSize(10f); //字体大小
  152. axisLeft.setAxisMaxValue(1000f); //最大值
  153. axisLeft.setLabelCount(6, true); //显示格数
  154. axisLeft.setGridColor(Color.WHITE); //网格线颜色
  155. axisLeft.setTypeface(mTf);
  156. axisRight.setDrawAxisLine(false);
  157. axisRight.setDrawGridLines(false);
  158. axisRight.setDrawLabels(false);
  159. lineChart.animateX(2500); //立即执行动画
  160. }
  161. private LineData getLineData(int count, float range) {
  162. ArrayList<String> xValues = new ArrayList<String>();
  163. for (int i = 0; i < count; i++) {
  164. // x轴显示的数据,这里默认使用数字下标显示
  165. xValues.add("" + (i+1));
  166. }
  167. // y轴的数据
  168. ArrayList<Entry> yValues = new ArrayList<Entry>();
  169. for (int i = 0; i < count; i++) {
  170. float value = (int) (Math.random() * range);
  171. yValues.add(new Entry(value, i));
  172. }
  173. // create a dataset and give it a type
  174. // y轴的数据集合
  175. LineDataSet lineDataSet = new LineDataSet(yValues, "访问量统计");
  176. // mLineDataSet.setFillAlpha(110);
  177. // mLineDataSet.setFillColor(Color.RED);
  178. //用y轴的集合来设置参数
  179. lineDataSet.setLineWidth(1.75f); // 线宽
  180. lineDataSet.setCircleSize(3f);// 显示的圆形大小
  181. lineDataSet.setColor(Color.WHITE);// 显示颜色
  182. lineDataSet.setCircleColor(Color.WHITE);// 圆形的颜色
  183. lineDataSet.setHighLightColor(Color.WHITE); // 高亮的线的颜色
  184. lineDataSet.setHighlightEnabled(true);
  185. lineDataSet.setValueTextColor(Color.WHITE); //数值显示的颜色
  186. lineDataSet.setValueTextSize(8f); //数值显示的大小
  187. lineDataSet.setValueTypeface(mTf);
  188. ArrayList<LineDataSet> lineDataSets = new ArrayList<LineDataSet>();
  189. lineDataSets.add(lineDataSet); // 添加数据集合
  190. //创建lineData
  191. LineData lineData = new LineData(xValues, lineDataSets);
  192. return lineData;
  193. }
  194. public void drawTheChart() {
  195. XYMultipleSeriesRenderer mRenderer = getXYMulSeriesRenderer();
  196. XYSeriesRenderer renderer = getXYSeriesRenderer();
  197. mRenderer.addSeriesRenderer(renderer);
  198. setLists();
  199. XYMultipleSeriesDataset dataset = getDataSet();
  200. GraphicalView chartView = ChartFactory.getLineChartView(this, dataset, mRenderer);
  201. chartLyt.addView(chartView, 0);
  202. //chartLyt.invalidate();
  203. }
  204. public XYSeriesRenderer getXYSeriesRenderer() {
  205. XYSeriesRenderer renderer = new XYSeriesRenderer();
  206. //设置折线宽度
  207. renderer.setLineWidth(2);
  208. //设置折线颜色
  209. renderer.setColor(Color.GRAY);
  210. renderer.setDisplayBoundingPoints(true);
  211. //点的样式
  212. renderer.setPointStyle(PointStyle.CIRCLE);
  213. //设置点的大小
  214. renderer.setPointStrokeWidth(3);
  215. //设置数值显示的字体大小
  216. renderer.setChartValuesTextSize(30);
  217. //显示数值
  218. renderer.setDisplayChartValues(true);
  219. return renderer;
  220. }
  221. public XYMultipleSeriesDataset getDataSet() {
  222. XYMultipleSeriesDataset barDataset = new XYMultipleSeriesDataset();
  223. CategorySeries barSeries = new CategorySeries("2016年");
  224. for (int i = 0; i < lists.size(); i++) {
  225. barSeries.add(lists.get(i));
  226. }
  227. barDataset.addSeries(barSeries.toXYSeries());
  228. return barDataset;
  229. }
  230. public XYMultipleSeriesRenderer getXYMulSeriesRenderer() {
  231. XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer();
  232. renderer.setMarginsColor(Color.argb(0x00, 0xF3, 0xF3, 0xF3));
  233. // 设置背景颜色
  234. renderer.setApplyBackgroundColor(true);
  235. renderer.setBackgroundColor(Color.WHITE);
  236. //设置Title的内容和大小
  237. renderer.setChartTitle("访问量统计");
  238. renderer.setChartTitleTextSize(50);
  239. //图表与四周的边距
  240. renderer.setMargins(new int[]{
  241. 80, 80, 50, 50});
  242. //设置X,Y轴title的内容和大小
  243. renderer.setXTitle("日期");
  244. renderer.setYTitle("访问数");
  245. renderer.setAxisTitleTextSize(30);
  246. //renderer.setAxesColor(Color.WHITE);
  247. renderer.setLabelsColor(Color.BLACK);
  248. //图例文字的大小
  249. renderer.setLegendTextSize(20);
  250. // x、y轴上刻度颜色和大小
  251. renderer.setXLabelsColor(Color.BLACK);
  252. renderer.setYLabelsColor(0, Color.BLACK);
  253. renderer.setLabelsTextSize(20);
  254. renderer.setYLabelsPadding(30);
  255. // 设置X轴的最小数字和最大数字,由于我们的数据是从1开始,所以设置为0.5就可以在1之前让出一部分
  256. // 有兴趣的童鞋可以删除下面两行代码看一下效果
  257. renderer.setPanEnabled(false, false);
  258. //显示网格
  259. renderer.setShowGrid(true);
  260. //X,Y轴上的数字数量
  261. renderer.setXLabels(10);
  262. renderer.setYLabels(10);
  263. // 设置X轴的最小数字和最大数字
  264. renderer.setXAxisMin(1);
  265. renderer.setXAxisMax(20);
  266. // 设置Y轴的最小数字和最大数字
  267. renderer.setYAxisMin(0);
  268. renderer.setYAxisMax(100);
  269. // 设置渲染器显示缩放按钮
  270. renderer.setZoomButtonsVisible(true);
  271. // 设置渲染器允许放大缩小
  272. renderer.setZoomEnabled(true);
  273. // 消除锯齿
  274. renderer.setAntialiasing(true);
  275. // 刻度线与X轴坐标文字左侧对齐
  276. renderer.setXLabelsAlign(Paint.Align.LEFT);
  277. // Y轴与Y轴坐标文字左对齐
  278. renderer.setYLabelsAlign(Paint.Align.LEFT);
  279. // 允许左右拖动,但不允许上下拖动.
  280. renderer.setPanEnabled(true, false);
  281. return renderer;
  282. }
  283. @Override
  284. public void onClick(View view) {
  285. super.onClick(view);
  286. switch (view.getId()) {
  287. case R.id.getData:
  288. drawTheChart();
  289. drawTheChartByMPAndroid();
  290. drawPieChart();
  291. break;
  292. default:
  293. break;
  294. }
  295. }
  296. }

  这里主要是介绍了chart的简单使用,具体得看需求再进行修改了,个人还是比较喜欢MPAndroidChart,不管是显示的效果还是使用的方便。

发表评论

表情:
评论列表 (有 0 条评论,470人围观)

还没有评论,来说两句吧...

相关阅读

    相关 springcloud体验

    前面几篇博客中我们大概讲解了一下spring boot的知识,话说管理这些微服务的架构就构成了spring cloud,我们一样,先不说原理先搭建出来再说; 我们今天主要搭

    相关 【YOLO学习笔记】YOLO体验

    前言 因为要完成毕业论文,所以最近正在学习计算机视觉,如果大家有什么问题,都可以跟我沟通交流。除了通过博客交流外,欢迎你加入我的QQ群,一起交流有关于机器学习、深度学习、