【Android 应用开发】Android 图表绘制 achartengine 示例解析(二)

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 【Android 应用开发】Android 图表绘制 achartengine 示例解析(二)

3. 饼图数据集





(1) 单个饼图数据集



相关类介绍 :


-- CategorySeries : 饼图数据集;




相关方法介绍 :


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




代码示例 :



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


(2) 多饼图图表数据集



相关类介绍 :


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




准备数据 :


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


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




相关方法介绍 :


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


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




示例代码 :



/**
   * 饼图(数据集) : 创建包含多个饼图的图表数据集
   *  多个饼图通过大小环嵌套形式展示
   * 
   * @param titles 图表的标题
   * @param tittles 图表中 每个饼图的标题 组成的数组
   * @param values 饼图的值组成的数组 组成的集合
   * @return 返回饼图图表
   */
  protected MultipleCategorySeries buildMultipleCategoryDataset(String title,
      List<String[]> titles, List<double[]> values) {
    MultipleCategorySeries series = new MultipleCategorySeries(title);  /* 多个饼图组成的图表 */
    int k = 0;
    for (double[] value : values) {
      /*
       * 第一个参数是 饼图的名称
       * 第二个参数是 饼图的元素名称组成的数组
       * 第三个参数是 饼图的元素对应的数值组成的数组SimpleSeriesRenderer
       * 
       * 注意 饼图元素名称数组 与 饼图值数组 个数是相同的, 并且是对应的
       */
      series.add(2007 + k + "", titles.get(k), value);
      k++;
    }
    return series;
  }


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);




示例代码 :



 

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




5. 柱状图数据集



相关类介绍 :


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


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




数据准备 :


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


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




CategorySeries 方法介绍 :


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


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


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




示例代码 :



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

6. 柱状图渲染器



相关类介绍 :


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


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




准备数据 :


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




代码示例 :



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




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



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





package org.achartengine.chartdemo.demo.chart;
import java.util.ArrayList;
import java.util.List;
import org.achartengine.ChartFactory;
import org.achartengine.GraphicalView;
import org.achartengine.chart.PointStyle;
import org.achartengine.renderer.XYMultipleSeriesRenderer;
import org.achartengine.renderer.XYSeriesRenderer;
import org.achartengine.renderer.XYSeriesRenderer.FillOutsideLine;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.Typeface;
/**
 * 销售额对比图表
 */
public class SalesComparisonChart extends AbstractDemoChart {
  /**
   * 获取图表名称
   * 
   * @return 图表名称
   */
  public String getName() {
    return "销售额对比";
  }
  /**
   * 获取图表的描述信息
   * 
   * @return 返回图表的详细信息
   */
  public String getDesc() {
    return "2年内的月度销售额发展 (插入了 折线图 和 面积图)";
  }
  /**
   * 获取图表
   * 
   * @param context 上下文对象
   * @return the built intent
   */
  public Intent execute(Context context) {
    String[] titles = new String[] { "2008 年销售额", "2007 年销售额",
        "2008年销售额与2007年对比" };
    /* 初始化数据集 */
    List<double[]> values = new ArrayList<double[]>();
    /* 2008年销售额 */
    values.add(new double[] { 14230, 12300, 14240, 15244, 14900, 12200, 11030, 12000, 12500, 15500,
        14600, 15000 });
    /* 2007年销售额 */
    values.add(new double[] { 10230, 10900, 11240, 12540, 13500, 14200, 12530, 11200, 10500, 12500,
        11600, 13500 });
    /* 计算出两年销售额的对比差 2008年 减去 2007年 */
    int length = values.get(0).length;
    double[] diff = new double[length];
    for (int i = 0; i < length; i++) {
      diff[i] = values.get(0)[i] - values.get(1)[i];
    }
    values.add(diff);
    /* 第一条线 蓝色 08年销售额, 第二条线 蓝绿色 07年销售额, 第三个面积图 绿色 两年销售额对比 */
    int[] colors = new int[] { Color.BLUE, Color.CYAN, Color.GREEN };
    PointStyle[] styles = new PointStyle[] { PointStyle.POINT, PointStyle.POINT, PointStyle.POINT };
    /* 创建图表渲染器 */
    XYMultipleSeriesRenderer renderer = buildRenderer(colors, styles);
    setChartSettings(renderer,  /* 渲染器 */
      "两年内的月度销售额",  /* 图表标题 */
      "月份",        /* x轴标题 */
      "销售单位",    /* y轴标题 */
      0.75,    /* x轴最小值 */
      12.25,      /* x轴最大值 */
      -5000,      /* y轴最小值 */
      19000,      /* y轴最大值 */
      Color.GRAY,   /* 坐标轴颜色 */
      Color.LTGRAY);  /* 标签颜色 标签即 图表标题 xy轴标题 */
    renderer.setXLabels(12);        /* 设置 x 轴刻度个数 */
    renderer.setYLabels(10);        /* 设置 y 轴刻度个数 */
    renderer.setChartTitleTextSize(20);      /* 设置表格标题字体大小 */
    renderer.setTextTypeface("sans_serif", Typeface.BOLD);  /* 设置字体 */
    renderer.setLabelsTextSize(14f);      /*  */
    renderer.setAxisTitleTextSize(15);
    renderer.setLegendTextSize(15);
    length = renderer.getSeriesRendererCount();
    for (int i = 0; i < length; i++) {
      /* 获取具体的 渲染器 */
      XYSeriesRenderer seriesRenderer = (XYSeriesRenderer) renderer.getSeriesRendererAt(i);
      if (i == length - 1) {
      /* 单独对面积图渲染器进行设置 */
        FillOutsideLine fill = new FillOutsideLine(FillOutsideLine.Type.BOUNDS_ALL);
        fill.setColor(Color.GREEN);
        seriesRenderer.addFillOutsideLine(fill);
      }
      /* 设置折线图渲染器 */
      seriesRenderer.setLineWidth(2.5f);
      seriesRenderer.setDisplayChartValues(true);
      seriesRenderer.setChartValuesTextSize(10f);
    }
    /*  */
    GraphicalView view = ChartFactory.getCubeLineChartView(context, buildBarDataset(titles, values), renderer, 0.5f);
    return ChartFactory.getCubicLineChartIntent(context, buildBarDataset(titles, values), renderer,
        0.5f);
  }
}




执行效果 :

image.png


目录
相关文章
|
3天前
|
Android开发 Swift iOS开发
深入探索iOS与Android操作系统的架构差异及其对应用开发的影响
在当今数字化时代,移动设备已经成为我们日常生活和工作不可或缺的一部分。其中,iOS和Android作为全球最流行的两大移动操作系统,各自拥有独特的系统架构和设计理念。本文将深入探讨iOS与Android的系统架构差异,并分析这些差异如何影响应用开发者的开发策略和用户体验设计。通过对两者的比较,我们可以更好地理解它们各自的优势和局限性,从而为开发者提供有价值的见解,帮助他们在这两个平台上开发出更高效、更符合用户需求的应用。
|
12天前
|
搜索推荐 前端开发 Android开发
安卓应用开发中的自定义视图实现
【10月更文挑战第30天】在安卓开发的海洋中,自定义视图是那抹不可或缺的亮色,它为应用界面的个性化和交互体验的提升提供了无限可能。本文将深入探讨如何在安卓平台创建自定义视图,并展示如何通过代码实现这一过程。我们将从基础出发,逐步引导你理解自定义视图的核心概念,然后通过一个实际的代码示例,详细讲解如何将理论应用于实践,最终实现一个美观且具有良好用户体验的自定义控件。无论你是想提高自己的开发技能,还是仅仅出于对安卓开发的兴趣,这篇文章都将为你提供价值。
|
12天前
|
Android开发 Swift iOS开发
探索iOS与安卓应用开发的差异性
探索iOS与安卓应用开发的差异性
32 2
|
19天前
|
传感器 XML IDE
探索安卓应用开发:从基础到进阶
【10月更文挑战第23天】在数字化时代的浪潮中,移动应用已成为人们日常生活的延伸。本文以安卓平台为例,深入浅出地介绍了如何从零开始构建一个安卓应用,涵盖了开发环境搭建、基本组件使用、界面设计原则以及进阶技巧等关键步骤。通过实例演示和代码片段,引导读者逐步掌握安卓应用开发的核心技能,旨在激发更多开发者对安卓平台的探索热情,并为初学者提供一条清晰的学习路径。
|
16天前
|
监控 Cloud Native 持续交付
云原生技术深度解析:重塑现代应用开发与部署范式####
本文深入探讨了云原生技术的核心概念、关键技术组件及其在现代软件开发中的重要性。通过剖析容器化、微服务架构、持续集成/持续部署(CI/CD)等关键技术,本文旨在揭示云原生技术如何促进应用的敏捷性、可扩展性和高可用性,进而推动企业数字化转型进程。不同于传统摘要仅概述内容要点,本部分将融入具体案例分析,直观展示云原生技术在实际应用中的显著成效与挑战应对策略,为读者提供更加丰富、立体的理解视角。 ####
|
7天前
|
前端开发 Android开发 UED
安卓应用开发中的自定义控件实践
【10月更文挑战第35天】在移动应用开发中,自定义控件是提升用户体验、增强界面表现力的重要手段。本文将通过一个安卓自定义控件的创建过程,展示如何从零开始构建一个具有交互功能的自定义视图。我们将探索关键概念和步骤,包括继承View类、处理测量与布局、绘制以及事件处理。最终,我们将实现一个简单的圆形进度条,并分析其性能优化。
|
18天前
|
开发工具 Android开发 Swift
探索iOS与安卓应用开发的异同点
【10月更文挑战第24天】本文通过比较iOS和安卓开发环境,旨在揭示两大移动平台在开发过程中的相似性与差异性。我们将探讨开发工具、编程语言、用户界面设计、性能优化及市场分布等方面,以期为开发者提供全面的视角。通过深入浅出的分析,文章将帮助读者更好地理解每个平台的独特之处及其对应用开发的影响。
|
3天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
15 2
|
1月前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
66 0
|
1月前
|
算法 Java 容器
Map - HashSet & HashMap 源码解析
Map - HashSet & HashMap 源码解析
52 0

推荐镜像

更多