最近在帮老师做一个课题,其中app端需要显示折线图以便直观地看数据波动,上网查了些资料后发现了这款图标引擎,另外感谢李坤老师的博客,帮助很大。

废话不多说,下面写代码。

一.AChartEngine是一款非常强大的绘图引擎,不过我这里只需用到折线图,所以并没有其他图的使用。首先我们要导入achartengine-xxx.jar,我这里使用的是achartengine-0.7.0.jar.

二.工欲善其事,必先利其器。由于在项目中需要使用图表的地方不止一处,我根据自己实际所需情况先封了个工具类。

 package xidian.zhr.utils;

 import java.util.ArrayList;
import java.util.List; import org.achartengine.ChartFactory;
import org.achartengine.chart.PointStyle;
import org.achartengine.model.XYMultipleSeriesDataset;
import org.achartengine.model.XYSeries;
import org.achartengine.renderer.XYMultipleSeriesRenderer;
import org.achartengine.renderer.XYSeriesRenderer; import android.content.Context;
import android.graphics.Color;
import android.graphics.Paint.Align;
import android.view.View;
import android.widget.LinearLayout; public class AChartEngineUtil
{ /**
* 获取坐标序列
* @param size 序列点数
* @param values y轴值
* @return 坐标x轴序列 或 坐标y轴序列
*/
public static List<double[]> getlist(int size,List<String> values)
{
List<double[]> xy = new ArrayList<double[]>(); double[] list = new double[size];
for(int i = 0 ; i < size ;i++)
{
list[i] = (values.isEmpty())? i : Double.valueOf(values.get(i));
} xy.add(list); return xy;
} /**
* 构建XYMultipleSeriesRenderer.
*
* @param colors 每个序列的颜色
* @param styles 每个序列点的类型(可设置三角,圆点,菱形,方块等多种)
* ( PointStyle.CIRCLE, PointStyle.DIAMOND,PointStyle.TRIANGLE, PointStyle.SQUARE )
* @return XYMultipleSeriesRenderer
*/
public static XYMultipleSeriesRenderer buildRenderer(int[] colors,PointStyle[] styles)
{
XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer();
// 控制横纵轴的属性字大小
renderer.setAxisTitleTextSize(15);
// 控制横纵轴的值大小
renderer.setChartTitleTextSize(20);
renderer.setLabelsTextSize(15);
renderer.setLegendTextSize(15);
renderer.setPointSize(5f);
renderer.setMargins(new int[]
{ 20, 30, 15, 0 });
int length = colors.length;
for (int i = 0; i < length; i++)
{
XYSeriesRenderer r = new XYSeriesRenderer();
r.setColor(colors[i]);
r.setPointStyle(styles[i]);
renderer.addSeriesRenderer(r);
}
return renderer;
} /**
* 设置renderer的一些坐标轴属性.
*
* @param renderer 要设置的renderer
* @param title 图表标题
* @param xTitle X轴标题
* @param yTitle Y轴标题
* @param xMin X轴最小值
* @param xMax X轴最大值
* @param yMin Y轴最小值
* @param yMax Y轴最大值
* @param axesColor X轴颜色
* @param labelsColor Y轴颜色
*/
public static void setChartSettings(XYMultipleSeriesRenderer renderer,
String title, String xTitle, String yTitle, double xMin,
double xMax, double yMin, double yMax, int axesColor,
int labelsColor)
{
renderer.setChartTitle(title);
renderer.setXTitle(xTitle);
renderer.setYTitle(yTitle);
renderer.setXAxisMin(xMin);
renderer.setXAxisMax(xMax);
renderer.setYAxisMin(yMin);
renderer.setYAxisMax(yMax);
renderer.setAxesColor(axesColor);
renderer.setLabelsColor(labelsColor);
} /**
* 构建和时间有关的XYMultipleSeriesDataset,这个方法与buildDataset在参数上区别是需要List<Date[]>作参数.
*
* @param titles 序列图例
* @param xValues X轴值
* @param yValues Y轴值
* @return XYMultipleSeriesDataset
*/
public static XYMultipleSeriesDataset buildDataset(String[] titles,
List<double[]> xValues, List<double[]> yValues)
{
XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
int length = titles.length;
for (int i = 0; i < length; i++)
{
XYSeries series = new XYSeries(titles[i]);
double[] xV = xValues.get(i);
double[] yV = yValues.get(i);
int seriesLength = xV.length;
for (int k = 0; k < seriesLength; k++)
{
series.add(xV[k], yV[k]);
}
dataset.addSeries(series);
}
return dataset;
} /**
* 绘制图表
* @param context 当前环境
* @param layout 承载图标的容器
* @param titles 折线名称
* @param colors 折线颜色
* @param data y轴坐标数据
* @param xname x轴名字
* @param yname y轴名字
*/
public static void setchart(Context context,LinearLayout layout,String[] titles,int[] colors,
List<String> data,String xname,String yname)
{ //获取x轴坐标
List<double[]> x = getlist(data.size(), new ArrayList<String>());
//获取y轴坐标
List<double[]> values = getlist(data.size(),data); PointStyle[] styles = new PointStyle[] {PointStyle.CIRCLE};
//构建XYMultipleSeriesRenderer
XYMultipleSeriesRenderer renderer = buildRenderer(colors, styles); setChartSettings(renderer, "", xname, yname, 0.5, 12.5, 0, 30,Color.LTGRAY, Color.LTGRAY); int length = renderer.getSeriesRendererCount();//获取点数量
for (int i = 0; i < length; i++)
{
((XYSeriesRenderer) renderer.getSeriesRendererAt(i)).setFillPoints(true);//设置图上的点为实心
}
renderer.setXLabels(12);//设置x轴显示12个点,根据setChartSettings的最大值和最小值自动计算点的间隔
renderer.setYLabels(10);//设置y轴显示10个点,根据setChartSettings的最大值和最小值自动计算点的间隔
renderer.setShowGrid(true);//是否显示网格
renderer.setXLabelsAlign(Align.RIGHT);//刻度线与刻度标注之间的相对位置关系
renderer.setYLabelsAlign(Align.CENTER);//刻度线与刻度标注之间的相对位置关系
renderer.setZoomButtonsVisible(true);//是否显示放大缩小按钮
renderer.setPanLimits(new double[] { -10, 300, -10, 300 }); //设置拖动时X轴Y轴允许的最大值最小值.
renderer.setZoomLimits(new double[] { -10, 300, -10, 300 });//设置放大缩小时X轴Y轴允许的最大最小值. //构建view
View v = ChartFactory.getLineChartView(context,buildDataset(titles, x, values),renderer); layout.addView(v);
}
}

三.下面是我的界面代码,由于这课题并不在乎界面,我这里也就简陋了点

 <?xml version="1.0" encoding="UTF-8"?>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:background="@color/black"
xmlns:android="http://schemas.android.com/apk/res/android"> <LinearLayout
android:layout_width="fill_parent"
android:layout_height="25dp"
android:orientation="horizontal"
android:layout_marginLeft="25dp"
android:layout_marginRight="10dp"
android:layout_marginTop="5dp"
android:gravity="left|center_vertical"
android:background="@drawable/prompt">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#FFFFFF"
android:textStyle="bold"
android:textSize="15dp"
android:text="@string/glu_value"
android:layout_marginLeft="60dp"
android:paddingTop="3dp"/>
</LinearLayout> <LinearLayout
android:id="@+id/gluc_glulay"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="230dp"
android:gravity="center_horizontal">
</LinearLayout> <LinearLayout
android:layout_width="fill_parent"
android:layout_height="25dp"
android:orientation="horizontal"
android:layout_marginLeft="25dp"
android:layout_marginRight="10dp"
android:layout_marginTop="5dp"
android:gravity="left|center_vertical"
android:background="@drawable/prompt">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#FFFFFF"
android:textStyle="bold"
android:textSize="15dp"
android:text="@string/insulin_value"
android:layout_marginLeft="60dp"
android:paddingTop="3dp"/>
</LinearLayout> <LinearLayout
android:id="@+id/gluc_ydslay"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="230dp"
android:gravity="center_horizontal">
</LinearLayout> </LinearLayout>

四.下面来到我们的Activity,这部分代码就很简单了,就是实例化控件以及筹备数据,再调用工具类绘图方法即可,就不全部贴出了。

         glu_chart = (LinearLayout)findViewById(R.id.gluc_glulay);
yds_chart = (LinearLayout)findViewById(R.id.gluc_ydslay);
sqlitedatabase = DbManager.open(GlucoseChartA
ctivity.this);
GlucoseDao glucoseDao = new GlucoseDao(sqlitedatabase);
glulist = glucoseDao.getglucose(getsql(" and GlucoseDate = ? "), new String[]{TimeUtil.getNowDate()});
//获取数据
List<String> glu_data = new ArrayList<String>();
List<String> yds_data = new ArrayList<String>();
for(int i = 0; i< glulist.size() ;i++)
{
glu_data.add(String.valueOf(glulist.get(i).getGlucoseValue()));
yds_data.add(String.valueOf(glulist.get(i).getGlucoseYDSValue()));
}
//调用工具类方法
AChartEngineUtil.setchart(GlucoseChartActivity.this,glu_chart,new String[]{"血糖值"},new int[]{Color.GREEN},glu_data,"时间","血糖值");
AChartEngineUtil.setchart(GlucoseChartActivity.this,yds_chart,new String[]{"胰岛素值"},new int[]{Color.YELLOW},yds_data,"时间","胰岛素值");

五,最后看看我们的效果图,我这里随便拟了几条数据

 

Android图表引擎AChartEngine之折线图使用的更多相关文章

  1. 安卓图表引擎AChartEngine(三) - 示例源码折线图、饼图和柱状图

    折线图: package org.achartengine.chartdemo.demo.chart; import java.util.ArrayList; import java.util.Lis ...

  2. 安卓图表引擎AChartEngine(四) - 源码示例 嵌入Acitivity中的折线图

    前面几篇博客中都是调用ChartFactory.get***Intent()方法,本节讲的内容调用ChartFactory.get***View()方法,这个方法调用的结果可以嵌入到任何一个Activ ...

  3. Android绘图机制(四)——使用HelloCharts开源框架搭建一系列炫酷图表,柱形图,折线图,饼状图和动画特效,抽丝剥茧带你认识图表之美

    Android绘图机制(四)--使用HelloCharts开源框架搭建一系列炫酷图表,柱形图,折线图,饼状图和动画特效,抽丝剥茧带你认识图表之美 这里为什么不继续把自定义View写下去呢,因为最近项目 ...

  4. 安卓图表引擎AChartEngine(二) - 示例源码概述和分析

    首先看一下示例中类之间的关系: 1. ChartDemo这个类是整个应用程序的入口,运行之后的效果显示一个list. 2. IDemoChart接口,这个接口定义了三个方法, getName()返回值 ...

  5. 安卓图表引擎AChartEngine(一) - 简介

    AChartEngine 是一个安卓系统上制作图表的框架,目前它支持如下的图表类型: line chart (折线图) area chart (面积图:分区图,对比图) scatter chart ( ...

  6. 【开源项目10】安卓图表引擎AChartEngine

    安卓图表引擎AChartEngine(一) - 简介 http://blog.csdn.net/lk_blog/article/details/7645509 安卓图表引擎AChartEngine(二 ...

  7. 安卓图表引擎AChartEngine(六) - 框架源码结构图

    包结构: org.achartengine: org.achartengine.model: org.achartengine.renderer: org.achartengine.tools: 安卓 ...

  8. 安卓图表引擎AChartEngine(五) - Dataset和Render参数介绍

    下面只讲解一个Renderer和一个DataSet,更多内容参看官方文档 DefaultRenderer: void addSeriesRenderer(int index, SimpleSeries ...

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

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

随机推荐

  1. Windows Azure 配置SSTP

    方法參考下面文章的步驟. 这个成功.http://freevpnba.com/windows-azure-sstp-vpn/ 这个没成功,不知道为什么.http://diaosbook.com/pos ...

  2. unity 基础之InputManager

    unity  基础之InputManager 说一下unity中的InputManager,先截个图 其中Axes指的是有几个轴向!Size指的是有几个轴,改变Size可以添加或者减少轴! Name指 ...

  3. 大数据计算新贵Spark在腾讯雅虎优酷成功应用解析

    http://www.csdn.net/article/2014-06-05/2820089 摘要:MapReduce在实时查询和迭代计算上仍有较大的不足,目前,Spark由于其可伸缩.基于内存计算等 ...

  4. JSch - Java实现的SFTP(文件上传详解篇)(转)

    JSch是Java Secure Channel的缩写.JSch是一个SSH2的纯Java实现.它允许你连接到一个SSH服务器,并且可以使用端口转发,X11转发,文件传输等,当然你也可以集成它的功能到 ...

  5. random随机函数

    SQL> select * from (select ename,job from emp order by dbms_random.value() ) where rownum <5 2 ...

  6. WITH AS and materialize hints

    WITH AS: 就是将一个子查询部分独立出来,有时候是为了提高SQL语句的可读性,有时候是为了提高SQL语句性能. 如果一个SQL语句中,某个表会被访问多次,而且每次访问的限制条件一样的话,就可以使 ...

  7. C 常用的输入输出 栈 哈希 文件写读 实现 字符串处理

    #include "stdafx.h"#include <stdio.h>#include <string.h>#include <stdlib.h& ...

  8. Error: opening registry key 'Software\JavaSoft\Java Runtime Environment' Error: could not find java.dll

    java -jar yxCollector-1.1.0.jarError: opening registry key 'Software\JavaSoft\Java Runtime Environme ...

  9. 【游戏框架】Phaser

    PhaserDesktop and Mobile HTML5 game framework Phaser Examples

  10. IE的表头固定/表头不动(使用expression)

    本文主要介绍在IE浏览器中,实现表头固定的一种方法.这种方法使用到了 IE 浏览器特有的 expression 方法. 表头固定DEMO1 主要代码: <style type="tex ...