作者 : 韩曙亮

转载请注明出处http://blog.csdn.net/shulianghan/article/details/38420197

一. AChartEngine 简介

1. 项目地址

AChartEngine 简介 : AChartEngine 是 Android 平台的图表开发库, 能绘制 折线图, 饼图, 气泡图, 柱状图, 散点图, 面积图等统计图表;

最新版本 : 1.1.0 版本;

AChartEngine 地址https://code.google.com/p/achartengine/ ;

-- 示例代码下载地址 : https://achartengine.googlecode.com/files/achartengine-1.1.0-demo-source.zip;

-- 参考文档下载地址 : https://achartengine.googlecode.com/files/achartengine-1.1.0-javadocs.zip;

-- jar包下载地址 : https://achartengine.googlecode.com/files/achartengine-1.1.0.jar;

CSDN资源下载 :http://download.csdn.net/detail/han1202012/7741579;

-- Google被墙因素 : 鉴于 Google 被河蟹了, 提供 CSDN 资源下载最新的 AChartEngine-1.1.0 版本的 JAR包 文档 和 示例程序;

2. AChartEngine 运行机制

AChartEngine 运行示例图 : 每个图表都需要一个数据集 (Dataset) 和 渲染器集合 (Renderer);

-- 数据集 : 又由许多数据组成,

-- 渲染器 : 也由不同的子渲染器组成,

-- 获取Activity 或 组件 : 图表工厂 (ChartFactory) 通过调用 数据集 (Dataset) 和 渲染器集合 (Renderer) 可以生成带图表的 GraphicalView 或者 GraphicalActivity;

AChartEngine 相关类介绍 :

-- ChartFactory : 图表生成的工厂类, 通过你传入 数据集 和 渲染器集合, 即可生成 GraphicalView 或者 GraphicalActivity;

-- XYMultipleSeriesDataset : 数据集, 其中可以封装图表所需的数据;

-- XYSeries : 属于 图表数据集的一部分, 每个都代表了一个数据集合 例如 折线, 一个图表中可以有多条折线, 所有的数据放在一起就是 数据集 XYMultipleSeriesDataset ;

-- XYMultipleSeriesRenderer : 渲染器集合, 图表中多个曲线的渲染器;

-- XYSeriesRenderer : 单个曲线或单元的渲染器, 一个图表中可能有多条曲线或者柱状图等, 每个都需要一个渲染器, 所有的渲染器放在一起就是渲染器集合 XYMultipleSeriesRenderer;

二. AChartEngine 主要代码解析

1. 曲线图 柱状图 图表数据集

(1) 针对 x y 轴数据都是 Double 的情况

相关类介绍 :

-- XYMultipleSeriesDataset 类 : 该类可以封装 曲线图 柱状图 等图表的数据集, 这些图表的共性是值都是由 x 和 y 数值组成的, 需要分别传入 x 轴数据 和 y 轴数据;

-- XYSeries 类 : 图表中有多个曲线, 该类封装单个曲线的集合, XYMultipleSeriesDataset 封装了多个 XYSeries;

需要准备的数据 :

-- 单组数据名称集合 : String[] titles, 单组数据名称 每条曲线可能有一个名称, 一个图表可能有多个曲线, 因此这里需要一个 标题数组;

-- x轴数据组集合 : List<double[]> xValues, x 轴数据集合, 其中每个数组都是一个 曲线的x轴数据, 整个 List 集合是多个曲线的数据;

-- y轴数据组集合 : List<double[]> yValues, y 轴数据集合, 整个 List 集合是多个曲线的 y 轴数据集合;

相关方法详解 :

-- 创建 XYMultipleSeriesDataset 对象 : 直接调用无参数的构造方法即可, XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();

-- 创建 XYSeries 对象 : 该对象是单条曲线数据, 可以设置 单条曲线标题, x 轴数据数组, y 轴数据数组, XYSeries series = new XYSeries(String titles, float scale);

-- 为单个曲线添加数据 : 即未 XYSeries 对象添加两个数组, 分别是 x 轴和 y 轴的数据, series.add(xV[k], yV[k]);

-- 将 XYSeries 对象添加到 XYMultipleSeriesDataset 对象中 : dataset.addSeries(series);

代码示例 :

  1. /**
  2. * 曲线图(数据集) : 创建曲线图图表数据集
  3. *
  4. * @param 赋予的标题
  5. * @param xValues x轴的数据
  6. * @param yValues y轴的数据
  7. * @return XY轴数据集
  8. */
  9. protected XYMultipleSeriesDataset buildDataset(String[] titles, List<double[]> xValues,
  10. List<double[]> yValues) {
  11. XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();/* 创建图表数据集 */
  12. addXYSeries(dataset, titles, xValues, yValues, 0); /* 添加单条曲线数据到图表数据集中 */
  13. return dataset;
  14. }
  15.  
  16. /**
  17. * 曲线图(被调用方法) : 添加 XY 轴坐标数据 到 XYMultipleSeriesDataset 数据集中
  18. *
  19. * @param dataset 最后的 XY 数据集结果, 相当与返回值在参数中
  20. * @param titles 要赋予的标题
  21. * @param xValues x轴数据集合
  22. * @param yValues y轴数据集合
  23. * @param scale 缩放
  24. *
  25. * titles 数组个数 与 xValues, yValues 个数相同
  26. * tittle 与 一个图标可能有多条曲线, 每个曲线都有一个标题
  27. * XYSeries 是曲线图中的 一条曲线, 其中封装了 曲线名称, X轴和Y轴数据
  28. */
  29. public void addXYSeries(XYMultipleSeriesDataset dataset, String[] titles, List<double[]> xValues,
  30. List<double[]> yValues, int scale) {
  31. int length = titles.length; /* 获取标题个数 */
  32. for (int i = 0; i < length; i++) {
  33. XYSeries series = new XYSeries(titles[i], scale); /* 单条曲线数据 */
  34. double[] xV = xValues.get(i); /* 获取该条曲线的x轴坐标数组 */
  35. double[] yV = yValues.get(i); /* 获取该条曲线的y轴坐标数组 */
  36. int seriesLength = xV.length;
  37. for (int k = 0; k < seriesLength; k++) {
  38. series.add(xV[k], yV[k]); /* 将该条曲线的 x,y 轴数组存放到 单条曲线数据中 */
  39. }
  40. dataset.addSeries(series); /* 将单条曲线数据存放到 图表数据集中 */
  41. }
  42. }

(2) x 轴是日期 y 轴是 Double

相关类介绍 :

-- XYMultipleSeriesDataset : 这种 日期-值 图, 使用的图表数据集也是该类;

-- TimeSeries : 这里就不同了, 单个曲线的数据中因为要封装 Date 数组, 因此要使用该类封装 Date[] 和 Double[] 数据;

需要准备的数据 :

-- String[] titles : 图表中有多个折线, 数组中每个元素都是一个折线的标题;

-- List<Date[]> xValues : List 集合中每个 Date[] 都是一条曲线的 x 轴数据;

-- List<double[]> yValues : List 集合中每个 double[] 都是一条曲线的 y 轴数据;

相关方法介绍 :

-- 创建单条曲线数据 TimeSeries 对象 : TimeSeries series = new TimeSeries(titles[i]), 参数是该条曲线的标题名称;

-- 设置 日期 和 值数组给 TimeSeries 对象 : series.add(xV[k], yV[k]);

-- 将 TimeSeries 对象设置给 XYMultipleSeriesDataset 对象 : dataset.addSeries(series);

代码示例 :

  1. /**
  2. * 曲线图(日期数据集) : 创建曲线图数据集, x轴是日期, y轴是具体的数值
  3. *
  4. * @param titles 各条曲线的标题, 放在一个数组中
  5. * @param xValues x轴的日志值数组组成的集合
  6. * @param yValusey轴具体的数据值数组组成的集合
  7. * @return 具体的曲线图图表
  8. */
  9. protected XYMultipleSeriesDataset buildDateDataset(String[] titles, List<Date[]> xValues,
  10. List<double[]> yValues) {
  11. XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();/* 创建图表数据集 */
  12. int length = titles.length; /* 获取曲线个数, 每个曲线都有一个标题 */
  13. for (int i = 0; i < length; i++) {
  14. TimeSeries series = new TimeSeries(titles[i]); /* 带日期的单条曲线数据 */
  15. Date[] xV = xValues.get(i); /* 获取该条曲线数据的 日期数组 */
  16. double[] yV = yValues.get(i); /* 获取该条曲线数据的 值数组 */
  17. int seriesLength = xV.length; /* 获取该条曲线的值的个数, 即x轴点个数 */
  18. for (int k = 0; k < seriesLength; k++) {
  19. series.add(xV[k], yV[k]); /* 将日期数组 和 值数组设置给 带日期的单条曲线数据 */
  20. }
  21. dataset.addSeries(series); /* 将单条曲线数据设置给 图标曲线数据集 */
  22. }
  23. return dataset;
  24. }

2. 曲线图图表渲染器

(1) 曲线渲染

相关类介绍 :

-- XYMultipleSeriesRenderer : 曲线图整体渲染器, 其中封装了许多 XYSeriesRenderer 单曲线渲染器;

-- XYSeriesRenderer : 单个曲线渲染器, 设置曲线的颜色 和 风格样式;

数据准备 :

-- int[] colors : 颜色集合, 每种曲线都要有一个颜色值;

-- PointStyle[] styles : 曲线样式集合, 每条曲线都有其绘制样式;

XYMultipleSeriesRenderer 相关方法介绍 :

-- 设置 xy 轴标题字体大小 : setAxisTitleTextSize(int size);

-- 设置表格标题大小 : setChartTitleTextSize(int size);

-- 设置标签文字大小 : setLabelsTextSize(int size);

-- 设置说明文字大小 : setLegendTextSize(int size);

-- 设置点的大小: setPointSize(int size);

-- 添加单曲线渲染器 : addSeriesRenderer(render);

XYSeriesRenderer 相关方法介绍 :

-- 创建对象 : XYSeriesRenderer r = new XYSeriesRenderer();

-- 设置单个曲线颜色 : r.setColor(colors[i]);

-- 设置单个曲线绘制风格 : r.setPointStyle(styles[i]);

代码示例 :

  1. /**
  2. * 曲线图(渲染器) : 创建曲线图图表渲染器
  3. *
  4. * @param 每条曲线要渲染的颜色, 把这些颜色放入数组
  5. * @param 每条曲线绘制点的风格
  6. * @return 数据渲染器集合
  7. */
  8. protected XYMultipleSeriesRenderer buildRenderer(int[] colors, PointStyle[] styles) {
  9. XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer();/* 创建曲线图图表渲染器 */
  10. setRenderer(renderer, colors, styles); /* 为曲线图渲染器设置颜色和样式 */
  11. return renderer;
  12. }
  13.  
  14. /**
  15. * 曲线图(渲染器 - 被调用方法) : 设置坐标轴渲染器
  16. *
  17. * @param renderer 设置的渲染器集合, 这个参数相当与返回值, 设置渲染器结果保存在这个参数中
  18. * @param colors 要渲染的颜色集合
  19. * @param styles 要渲染的样式集合
  20. */
  21. protected void setRenderer(XYMultipleSeriesRenderer renderer, int[] colors, PointStyle[] styles) {
  22. renderer.setAxisTitleTextSize(16); /* 设置XY轴标题字体大小 */
  23. renderer.setChartTitleTextSize(20); /* 设置表格标题文字大小 */
  24. renderer.setLabelsTextSize(15); /* 设置标签文字大小 */
  25. renderer.setLegendTextSize(15); /* 设置说明文字大小 */
  26. renderer.setPointSize(5f); /* 设置点的大小 */
  27. renderer.setMargins(new int[] { 20, 30, 15, 20 }); /* 设置 margin, 单位像素 */
  28. int length = colors.length; /* 获取渲染器的个数, 即有多少条曲线 */
  29. for (int i = 0; i < length; i++) {
  30. XYSeriesRenderer r = new XYSeriesRenderer(); /* 单个曲线的渲染器 */
  31. r.setColor(colors[i]); /* 为单个曲线渲染器设置曲线颜色 */
  32. r.setPointStyle(styles[i]); /* 为单个曲线渲染器设置曲线风格 */
  33. renderer.addSeriesRenderer(r); /* 将单个曲线渲染器设置到渲染器集合中 */
  34. }
  35. }

(2) 坐标轴设置

渲染器参数设置 : 坐标轴渲染主要是对 XYMultipleSeriesRenderer 进行一系列的参数设置, 都是调用的 XYMultipleSeriesRenderer 对象中的方法;

-- 设置曲线标题 : setChartTitle(String tittle);

-- 设置 x 轴标题 : setXTitle(String tittle);

-- 设置 y 轴标题 : setYTitle(String tittle);

-- 设置 x 轴最小值 : setXAxisMin(double);

-- 设置 x 轴最大值 : setXAxisMax(double);

-- 设置 y 轴最小值 : setYAxisMin(double);

-- 设置 y 轴最大值 : setYAxisMax(double);

-- 设置坐标轴颜色 : setAxesColor();

-- 设置标签颜色 : setLabelsColor();

代码示例 :

  1. /**
  2. * 坐标轴(渲染器) : 对曲线图渲染器进行配置, 主要配置坐标轴
  3. *
  4. * @param renderer 要进行配置的渲染器
  5. * @param title 图表的名称
  6. * @param xTitle x轴坐标的名称
  7. * @param yTitle y轴坐标的名称
  8. * @param xMin x轴最小值
  9. * @param xMax x轴最大值
  10. * @param yMin y轴最小值
  11. * @param yMax y轴最大值
  12. * @param axesColor 坐标轴的颜色
  13. * @param labelsColor 标签的颜色
  14. */
  15. protected void setChartSettings(XYMultipleSeriesRenderer renderer, String title, String xTitle,
  16. String yTitle, double xMin, double xMax, double yMin, double yMax, int axesColor,
  17. int labelsColor) {
  18. renderer.setChartTitle(title); /* 设置曲线图标题 */
  19. renderer.setXTitle(xTitle); /* 设置x轴标题 */
  20. renderer.setYTitle(yTitle); /* 设置y轴标题 */
  21. renderer.setXAxisMin(xMin); /* 设置x轴最小值 */
  22. renderer.setXAxisMax(xMax); /* 设置x轴最大值 */
  23. renderer.setYAxisMin(yMin); /* 设置y轴最小值 */
  24. renderer.setYAxisMax(yMax); /* 设置y轴最大值 */
  25. renderer.setAxesColor(axesColor); /* 设置坐标轴颜色 */
  26. renderer.setLabelsColor(labelsColor); /* 设置标签颜色 */
  27. }

3. 饼图数据集

(1) 单个饼图数据集

相关类介绍 :

-- CategorySeries : 饼图数据集;

相关方法介绍 :

-- 添加数据元素 : CategorySeries.add(String category, double value), 参数分别是 名称 和 值;

代码示例 :

  1. /**
  2. * 饼图(单数据) : 创建只包含一个饼图的图表数据集
  3. *
  4. * @param titles 饼图的标题
  5. * @param values 饼图的值组成的数组
  6. * @return 返回饼图
  7. */
  8. protected CategorySeries buildCategoryDataset(String title, double[] values) {
  9. CategorySeries series = new CategorySeries(title); /* 创建单个饼状图数据, 传入饼状图标题 */
  10. int k = 0;
  11. for (double value : values) {
  12. series.add("Project " + ++k, value); /* 键值对, 键是饼图元素的标题, 值是大小 */
  13. }
  14.  
  15. return series;
  16. }

(2) 多饼图图表数据集

相关类介绍 :

-- MultipleCategorySeries : 多饼图图表数据集, 该类对象与单饼图图表数据集 CategorySeries 对象没有包含关系;

准备数据 :

-- 饼图每个元素名称 : List<String[]> titles, 其中集合中的数组就是一个饼图每个元素的集合;

-- 饼图每个元素的大小 : List<double[]> values, 其中的数组就是一个饼图每个元素的大小;

相关方法介绍 :

-- 创建多饼图数据集 : MultipleCategorySeries series = new MultipleCategorySeries(title), 传入图表的名称;

-- 添加一个饼图的数据 : series.add(tittle, titles.get(k), value), 第一个参数是单个饼图名称, 第二个参数是饼图元素名称字符串数组, 第三个是饼图元素大小 double[] 数组;

示例代码 :

  1. /**
  2. * 饼图(数据集) : 创建包含多个饼图的图表数据集
  3. * 多个饼图通过大小环嵌套形式展示
  4. *
  5. * @param titles 图表的标题
  6. * @param tittles 图表中 每个饼图的标题 组成的数组
  7. * @param values 饼图的值组成的数组 组成的集合
  8. * @return 返回饼图图表
  9. */
  10. protected MultipleCategorySeries buildMultipleCategoryDataset(String title,
  11. List<String[]> titles, List<double[]> values) {
  12. MultipleCategorySeries series = new MultipleCategorySeries(title); /* 多个饼图组成的图表 */
  13. int k = 0;
  14. for (double[] value : values) {
  15. /*
  16. * 第一个参数是 饼图的名称
  17. * 第二个参数是 饼图的元素名称组成的数组
  18. * 第三个参数是 饼图的元素对应的数值组成的数组SimpleSeriesRenderer
  19. *
  20. * 注意 饼图元素名称数组 与 饼图值数组 个数是相同的, 并且是对应的
  21. */
  22. series.add(2007 + k + "", titles.get(k), value);
  23. k++;
  24. }
  25. return series;
  26. }

4. 饼图渲染器

相关类介绍 :

-- DefaultRenderer : 饼图渲染器, 单饼图 和 多饼图使用的渲染器都是同一个;

-- DefaultRenderer : 饼图单个元素渲染器, 一个饼图有多个该渲染器渲染, 整个图表有多组该渲染器;

数据准备 :

-- 饼图元素的颜色 : int[] colors, 将饼图中所有的颜色放在一个数组中, 每个元素都有一个颜色;

DefaultRenderer 类方法介绍 :

-- 构造方法 : DefaultRenderer renderer = new DefaultRenderer();

-- 设置标签文字大小 : setLabelsTextSize(int size);

-- 设置说明文字大小 : setLegendTextSize(int size);

-- 设置边距 : setMargins(new int[] { 20, 30, 15, 0 });

-- 添加SimpleSeriesRenderer对象到该渲染器集合 : addSeriesRenderer(r);

SimpleSeriesRenderer 方法 :

-- 构造函数 : SimpleSeriesRenderer r = new SimpleSeriesRenderer();

-- 设置颜色 : setColor(color);

示例代码 :

  1. /**
  2. * 饼图(渲染器) : 使用现有颜色创建饼图渲染器
  3. *
  4. * @param colors 颜色数组
  5. * @return 返回饼图渲染器
  6. */
  7. protected DefaultRenderer buildCategoryRenderer(int[] colors) {
  8. DefaultRenderer renderer = new DefaultRenderer(); /* 默认的饼图图表渲染器 */
  9. renderer.setLabelsTextSize(15); /* 设置标签文字大小 */
  10. renderer.setLegendTextSize(15); /* 设置说明文字大小 */
  11. renderer.setMargins(new int[] { 20, 30, 15, 0 }); /* 设置边距 */
  12. for (int color : colors) {
  13. SimpleSeriesRenderer r = new SimpleSeriesRenderer(); /* 饼状图中单个数据的颜色渲染器 */
  14. r.setColor(color);
  15. renderer.addSeriesRenderer(r); /* 将单个元素渲染器设置到饼图图表渲染器中 */
  16. }
  17. return renderer;
  18. }

5. 柱状图数据集

相关类介绍 :

-- XYMultipleSeriesDataset : 封装柱状图的数据, 其中可能有多个柱状图, 每个都封装了若干个 CategorySeries 单个数据集对象;

-- CategorySeries : 柱状图图表中单个柱状图的数据, 可以被封装入 XYMultipleSeriesDataset 数据集中;

数据准备 :

-- 柱状图标题 : String[] titles, 由于一个柱状图图表中可能有多个柱状图, 因此需要一个字符串数组存放这些标题;

-- 柱状图值 : List<double[]> values, 集合中的每个数组都代表了一个柱状图的值;

CategorySeries 方法介绍 :

-- 构造函数 : CategorySeries series = new CategorySeries(titles[i]), 传入的参数是柱状图的值;

-- 设置值大小 : series.add(double), 具体的值需要一个一个去设定;

-- 转换类型 : series.toXYSeries(), 只有转换成 XYSeries 对象, 才能加入到 XYMultipleSeriesDataset 对象中;

示例代码 :

  1. /**
  2. * 柱状图(数据集) : 使用现有的数据, 创建一个柱状图数据集
  3. *
  4. * @param titles 柱状图名称数组
  5. * @param values 每个柱状图中具体的多个值组成的数组 组成的 集合
  6. * @return the XY multiple bar dataset
  7. */
  8. protected XYMultipleSeriesDataset buildBarDataset(String[] titles, List<double[]> values) {
  9. XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset(); /* 创建 XYMultipleSeriesDataset对象, 图表的总数据集 */
  10. int length = titles.length; /* 获取图表中柱状图个数 */
  11. for (int i = 0; i < length; i++) {
  12. CategorySeries series = new CategorySeries(titles[i]); /* 创建一个 CategorySeries对象, 单个柱状图数据 */
  13. double[] v = values.get(i); /* 获取本柱状图数值数组 */
  14. int seriesLength = v.length; /* 获取单个柱状图值的个数 */
  15. for (int k = 0; k < seriesLength; k++) {
  16. series.add(v[k]); /* 将具体的值设置给 CategorySeries对象, 单个柱状图数据 */
  17. }
  18. dataset.addSeries(series.toXYSeries()); /* 将单个柱状图数据 CategorySeries对象 设置给 图表数据集 XYMultipleSeriesDataset对象 */
  19. }
  20. return dataset;
  21. }

6. 柱状图渲染器

相关类介绍 :

-- XYMultipleSeriesRenderer : 柱状图渲染器集合, 与曲线图的渲染器是一样的, 其中封装了很多 SimpleSeriesRenderer 对象;

-- SimpleSeriesRenderer : 柱状图中的单个柱状图渲染器, 可以封装到 XYMultipleSeriesRenderer 对象中;

准备数据 :

-- 柱状图颜色 : int[] colors, 一个柱状图的图表中含有若干个柱状图, 每个柱状图都设定一个颜色;

代码示例 :

  1. /**
  2. * 柱状图(渲染器) : 创建柱状图渲染器
  3. *
  4. * @param colors 柱状图的颜色数组
  5. * @return 返回柱状图渲染器colors
  6. */
  7. protected XYMultipleSeriesRenderer buildBarRenderer(int[] colors) {
  8. XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer(); /* 创建图表渲染器 */
  9. renderer.setAxisTitleTextSize(16); /* 设置坐标轴标题字体大小 */
  10. renderer.setChartTitleTextSize(20); /* 设置图表标题字体大小 */
  11. renderer.setLabelsTextSize(15); /* 设置标签字体大小 */
  12. renderer.setLegendTextSize(15); /* 设置说明文字字体大小 */
  13. int length = colors.length; /* 获取图表中柱状图个数 */
  14. for (int i = 0; i < length; i++) {
  15. SimpleSeriesRenderer r = new SimpleSeriesRenderer(); /* 单个柱状图渲染器 */
  16. r.setColor(colors[i]); /* 为单个柱状图渲染器设置颜色 */
  17. renderer.addSeriesRenderer(r); /* 将单个柱状图渲染器设置给图表渲染器 */
  18. }
  19. return renderer;
  20. }

三. 销售额对比图(折线图 面积图)示例

需求分析 : 给出 2007 年和 2008 年销售额, 将销售额绘制到折线图中, 并将它们的差绘制到面积图中;

  1. package org.achartengine.chartdemo.demo.chart;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.List;
  5.  
  6. import org.achartengine.ChartFactory;
  7. import org.achartengine.GraphicalView;
  8. import org.achartengine.chart.PointStyle;
  9. import org.achartengine.renderer.XYMultipleSeriesRenderer;
  10. import org.achartengine.renderer.XYSeriesRenderer;
  11. import org.achartengine.renderer.XYSeriesRenderer.FillOutsideLine;
  12.  
  13. import android.content.Context;
  14. import android.content.Intent;
  15. import android.graphics.Color;
  16. import android.graphics.Typeface;
  17.  
  18. /**
  19. * 销售额对比图表
  20. */
  21. public class SalesComparisonChart extends AbstractDemoChart {
  22. /**
  23. * 获取图表名称
  24. *
  25. * @return 图表名称
  26. */
  27. public String getName() {
  28. return "销售额对比";
  29. }
  30.  
  31. /**
  32. * 获取图表的描述信息
  33. *
  34. * @return 返回图表的详细信息
  35. */
  36. public String getDesc() {
  37. return "2年内的月度销售额发展 (插入了 折线图 和 面积图)";
  38. }
  39.  
  40. /**
  41. * 获取图表
  42. *
  43. * @param context 上下文对象
  44. * @return the built intent
  45. */
  46. public Intent execute(Context context) {
  47. String[] titles = new String[] { "2008 年销售额", "2007 年销售额",
  48. "2008年销售额与2007年对比" };
  49.  
  50. /* 初始化数据集 */
  51. List<double[]> values = new ArrayList<double[]>();
  52. /* 2008年销售额 */
  53. values.add(new double[] { 14230, 12300, 14240, 15244, 14900, 12200, 11030, 12000, 12500, 15500,
  54. 14600, 15000 });
  55. /* 2007年销售额 */
  56. values.add(new double[] { 10230, 10900, 11240, 12540, 13500, 14200, 12530, 11200, 10500, 12500,
  57. 11600, 13500 });
  58.  
  59. /* 计算出两年销售额的对比差 2008年 减去 2007年 */
  60. int length = values.get(0).length;
  61. double[] diff = new double[length];
  62. for (int i = 0; i < length; i++) {
  63. diff[i] = values.get(0)[i] - values.get(1)[i];
  64. }
  65. values.add(diff);
  66.  
  67. /* 第一条线 蓝色 08年销售额, 第二条线 蓝绿色 07年销售额, 第三个面积图 绿色 两年销售额对比 */
  68. int[] colors = new int[] { Color.BLUE, Color.CYAN, Color.GREEN };
  69. PointStyle[] styles = new PointStyle[] { PointStyle.POINT, PointStyle.POINT, PointStyle.POINT };
  70.  
  71. /* 创建图表渲染器 */
  72. XYMultipleSeriesRenderer renderer = buildRenderer(colors, styles);
  73. setChartSettings(renderer, /* 渲染器 */
  74. "两年内的月度销售额", /* 图表标题 */
  75. "月份", /* x轴标题 */
  76. "销售单位", /* y轴标题 */
  77. 0.75, /* x轴最小值 */
  78. 12.25, /* x轴最大值 */
  79. -5000, /* y轴最小值 */
  80. 19000, /* y轴最大值 */
  81. Color.GRAY, /* 坐标轴颜色 */
  82. Color.LTGRAY); /* 标签颜色 标签即 图表标题 xy轴标题 */
  83.  
  84. renderer.setXLabels(12); /* 设置 x 轴刻度个数 */
  85. renderer.setYLabels(10); /* 设置 y 轴刻度个数 */
  86. renderer.setChartTitleTextSize(20); /* 设置表格标题字体大小 */
  87. renderer.setTextTypeface("sans_serif", Typeface.BOLD); /* 设置字体 */
  88. renderer.setLabelsTextSize(14f); /* */
  89. renderer.setAxisTitleTextSize(15);
  90. renderer.setLegendTextSize(15);
  91. length = renderer.getSeriesRendererCount();
  92.  
  93. for (int i = 0; i < length; i++) {
  94. /* 获取具体的 渲染器 */
  95. XYSeriesRenderer seriesRenderer = (XYSeriesRenderer) renderer.getSeriesRendererAt(i);
  96. if (i == length - 1) {
  97. /* 单独对面积图渲染器进行设置 */
  98. FillOutsideLine fill = new FillOutsideLine(FillOutsideLine.Type.BOUNDS_ALL);
  99. fill.setColor(Color.GREEN);
  100. seriesRenderer.addFillOutsideLine(fill);
  101. }
  102.  
  103. /* 设置折线图渲染器 */
  104. seriesRenderer.setLineWidth(2.5f);
  105. seriesRenderer.setDisplayChartValues(true);
  106. seriesRenderer.setChartValuesTextSize(10f);
  107. }
  108. /* */
  109. GraphicalView view = ChartFactory.getCubeLineChartView(context, buildBarDataset(titles, values), renderer, 0.5f);
  110. return ChartFactory.getCubicLineChartIntent(context, buildBarDataset(titles, values), renderer,
  111. 0.5f);
  112. }
  113. }

执行效果 :

作者 : 韩曙亮

转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/38420197

【Android 应用开发】Android 图表绘制 achartengine 示例解析的更多相关文章

  1. Android 图表绘制 achartengine 示例解析

    一. AChartEngine 简介 1. 项目地址 AChartEngine 简介 : AChartEngine 是 Android 平台的图表开发库, 能绘制 折线图, 饼图, 气泡图, 柱状图, ...

  2. android studio 开发android app 真机调试

    大家都知道开发android app 的时候可以有2种调试方式, 一种是Android Virtual Device(虚拟模拟器) ,另一种就是真机调试. 这里要说的是真机调试的一些安装步骤: 1. ...

  3. 码农人生——从未学过Android如何开发Android App 案例讲解-第002期案例

    标题有点晃眼,本次分享是002期博文的实践故事,不会有任何代码.也不会教别人android 如何开发,类似博文已经有大批大批,而且还会有陆陆续续的人写,我写的文章,主要是经验之谈,希望总结出的一些方法 ...

  4. 用Android Studio 开发Android应用

    目前AndroidStudio已经到了1.2版本了,我用了下,觉得还蛮好的,有些自动生成的资源,它会自动帮你管理.下面开始列一下,我的开发环境搭配.在开始前,你得有个VPN,可者代理.嗯.不然你下不了 ...

  5. [Hybrid App]--Android混合开发,Android、Js的交互

    AndroidJs通信 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !imp ...

  6. Android Studio开发Android应用如何签名

    1.使用jdk自带的工具生成keystore 使用cmd命令行进入到jdk的bin目录(比如:C:\Program Files\Java\jdk1.7.0_01\bin) 运行如下命令: C:\Pro ...

  7. Android BLE开发——Android手机与BLE终端通信初识

    蓝牙BLE官方Demo下载地址:   http://download.csdn.net/detail/lqw770737185/8116019参考博客地址:    http://www.eoeandr ...

  8. Android多媒体开发-- android中OpenMax的实现整体框架

    1.android中用openmax来干啥? android中的AwesomePlayer就 是用openmax来做(code)编解码,其实在openmax接口设计中,他不光能用来当编解码.通过他的组 ...

  9. 【Android 多媒体开发】 MediaPlayer 状态机 接口 方法 解析

    作者 : 韩曙亮 转载请著名出处 :  http://blog.csdn.net/shulianghan/article/details/38487967 一. MediaPlayer 状态机 介绍 ...

随机推荐

  1. weblogic静默方式创建域

    创建域目录:mkdir -p /home/weblogic/Oracle/Middleware/user_projects/domains/base_domain/ 创建文件: create_doma ...

  2. ACM Where is the Marble?

    Description   Raju and Meena love to play with Marbles. They have got a lot of marbles with numbers ...

  3. Node.js TTY

    稳定性: 2 - 不稳定 tty 模块包含 tty.ReadStream 和 tty.WriteStream 类.多数情况下,你不必直接使用这个模块. 当 node 检测到自己正运行于 TTY 上下文 ...

  4. Window下通过CuteFTP与Linux虚拟机连接失败的原因总结及解决方法

    环境:虚拟机类型Redhat Enterprise 6 (1) 虚拟机是否安装了ftp服务器? 若未安装,则yum install vsftpd,并启动ftp服务 (2) 虚拟机防火墙是否已关闭? 若 ...

  5. Android自定义View(CustomCalendar-定制日历控件)

    转载请标明出处: http://blog.csdn.net/xmxkf/article/details/54020386 本文出自:[openXu的博客] 目录: 1分析 2自定义属性 3onMeas ...

  6. Why Doesn't Python Have Switch/Case?

    Why Doesn't Python Have Switch/Case? Tuesday, June 09, 2015 (permalink) Unlike every other programmi ...

  7. Python 文本转语音

    文本转语音,一般会用在无障碍开发.下面介绍如何使用Python实现将文本文件转换成语音输出. 准备 使用Speech API 原理 示例代码 小总结 pyttsx方式 原理 示例代码 小总结 pytt ...

  8. Spring基础配置

    从毕业到现在我一直从事Android开发,但是对JavaEE一直念念不忘,毕业校招的时候,一个礼拜拿了三个offer,岗位分别是Android.JavaEE和JavaSE,后来觉得Android比较简 ...

  9. [ExtJS5学习笔记]第三十三节 sencha extjs 5 grid表格导出excel

    使用extjs肯定少不了使用表格控件,用到表格,领导们(一般)还是惯于使用excel看数据,所以用到extjs表格的技术猿们肯定也会有导出表格excel这一个需求,本文主要针对如何在用extjs将gr ...

  10. JRE System Library [JavaSE-1.7](unbound)

    window > preferences > java > Install jars >如果没有jdk1.7 ,点击下面的search,会自动找到已经安装对jdk1.7,选择, ...