AchartEngine 是android应用中的图表库,它的功能有很多,曲线图、柱状图、饼图、气泡图等,具体参考goole官网http://code.google.com/p/achartengine/本文中主要介绍AchartEngine 画柱状图。
效果图:
step1. 刚刚介绍到AchartEngine是android应用的库,那么首先我们应该将这个库导入我们的工程;AchartEngine库可到 http://code.google.com/p/achartengine/downloads/list 下载。
step2. 构造渲染图,作为getBarChartView方法的参数;
step3. 构造柱状图的数据集,作为getBarChartView方法的参数;
step4. 利用AchartEngine库中ChartFactory类的getBarChartView获取一个柱状图,做为GraphicalView类的对象;getBarChartView带有四个参数,ChartFactory.getBarChartView(context, dataset, renderer, type)),第二个参数dataset是柱状图的数据集,第三个参数renderer是渲染图,最后一个参数type为图标的显示类型;
step5. 将GraphicalView对象添加到一个布局显示出来。
本工程中,将构造渲染图和构造数据集放到一个自定义类BarChart中,在这个类中包含一个带参数的构造方法public BarChart( String ChartTitle, String XTitle, String YTitle, int BarNum, int YValueMax ),构建渲染器的方法XYMultipleSeriesRenderer GetRenderer ( int seriesnum, int[] rdcolor, String[ ] textlable ),构建数据集的方法XYMultipleSeriesDataset GetDataset( int seriesnum, String[ ] seriesname, double[ ] val )。
1、如何将库导入工程
代补充……
2、BarChart类的构造方法如下:
// 柱状图标题
public String ChartTitle ;
// 横轴标题
public String XTitle ;
// 纵轴标题
public String YTitle ;
// 柱体个数
public int BarNum ;
// 纵轴最大值
public int YValueMax ;
/***************************************************************************************************************
* 功能:构建方法
* 参数:1.ChartTitle-柱状图标题 2.XTitle-横轴标题 3.YTitle-纵轴标题 4.BarNum-柱体个数 5.YValueMax-纵轴最大值
* 说明:构建一个BarChart类
* 日期:2014.01.21
* 作者:lwj
***************************************************************************************************************/
public BarChart( String ChartTitle, String XTitle, String YTitle, int BarNum, int YValueMax )
{
this.ChartTitle = ChartTitle;
this.XTitle = XTitle;
this.YTitle = YTitle;
this.BarNum = BarNum;
this.YValueMax = YValueMax;
}
/*******************************************************end*****************************************************/
3、构造渲染器方法代码如下:
/***************************************************************************************************************
* 功能:构建渲染器renderer
* 参数:1.seriesnum-柱体组数 2.rdcolor-柱体颜色,注意:此处要设置透明度,如没有设置(例0x0000ff)则无法显示
* 3.textlable-横轴标签文本
* 说明:完成将柱体添加到渲染器中,设置柱体颜色以及渲染器的各种设置
* 日期:2014.01.21
* 作者:lwj
***************************************************************************************************************/
public XYMultipleSeriesRenderer GetRenderer ( int seriesnum, int[] rdcolor, String[] textlable )
{
// 构造显示渲染图
XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer();
// 新建柱状图
SimpleSeriesRenderer rd = new SimpleSeriesRenderer();
// 设置柱状图的颜色(有几个柱状图就要设几次,否则会出现异常)
for( int i = 0; i<seriesnum; i++ )
rd.setColor(rdcolor[i]);
// 将柱体添加到渲染图
renderer.addSeriesRenderer(rd);
// 自定义方法,renderer设置
RendererSet( renderer, textlable );
return renderer;
}
/*******************************************************end*****************************************************/
在此方法中含有一个自定义方法RendererSet,此方法用于设置渲染器的显示效果,具体代码如下(当然可根据需求设置):
/***************************************************************************************************************
* 功能:渲染器renderer相关设置
* 说明:除了柱体的颜色,别的设置均在此方法中设置
* 日期:2014.01.21
* 作者:lwj
***************************************************************************************************************/
@SuppressWarnings("deprecation")
protected void RendererSet( XYMultipleSeriesRenderer rd, String[] tl )
{
// 设置标题
rd.setChartTitle(ChartTitle);
// 设置横轴标题
rd.setXTitle( XTitle );
// 设置纵轴标题
rd.setYTitle( YTitle );
// 设置拖动时X轴Y轴允许的最大值最小值(貌似必须有四个数,第一个是最小值,第二个是最大值,后面两个没什么用)
rd.setPanLimits(new double[] { 0, BarNum, 0, 0 });
// 设置拖动时X轴标签文本,注:这里必须设置setXLabels(0)
rd.setXLabels(0);
for( int i=0; i<BarNum; i++ )
rd.addTextLabel(i+1, tl[i]);
// 设置默认横轴最小值和最大值
rd.setXAxisMin(BarNum-12);
rd.setXAxisMax(BarNum);
// 设置默认纵轴最小值和最大值
rd.setYAxisMin(0);
rd.setYAxisMax(YValueMax);
// 设置纵轴标签个数(决定纵轴每格表示值,如纵轴最大值为100,标签个数为20,则每格表示5)
rd.setYLabels(20);
// 设置每个柱形相隔距离1.0表示和柱体同宽,2.0表示是柱体的2倍,以此类推
rd.setBarSpacing(1.0);
// 设置横纵轴是否能放大
rd.setZoomEnabled(false, false);
// 设置横纵轴是否能移动
rd.setPanEnabled(true, false);
// 设置是否显示网格
rd.setShowGrid(true);
// 刻度线与刻度标注之间的相对位置关系(刻度线在标注的上方)
rd.setXLabelsAlign(Align.CENTER);
// 刻度线在标注的右边
rd.setYLabelsAlign(Align.RIGHT);
// 设置颜色
rd.setApplyBackgroundColor(true);
// 坐标轴内的颜色
rd.setBackgroundColor(0xffffff);
// 坐标轴外的颜色
rd.setMarginsColor(0xffffff);
}
/*******************************************************end*****************************************************/
4、构造数据集方法代码如下:
/***************************************************************************************************************
* 功能:构建多组数据dataset
* 参数:1.seriesnum-柱体组数 2.seriesname-主体集名称 3.val-数据,决定柱体高度
* 说明:可再此构造柱体个数,柱体的高度
* 日期:2014.01.21
* 作者:lwj
***************************************************************************************************************/
public XYMultipleSeriesDataset GetDataset( int seriesnum, String[] seriesname, double[][] val )
{
// 构建柱状图的数据
XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
// 循环的次数为柱体的个数
for (int i = 0; i < seriesnum; i++) {
// 构造柱形图设置柱状标题
CategorySeries series = new CategorySeries(seriesname[i]);
// 填充数据
for (int k = 0; k < BarNum; k++) {
// 填y值(柱形高度)
series.add(val[i][k]);
}
// 需要绘制的柱体放进dataset中
dataset.addSeries(series.toXYSeries());
}
return dataset;
}
/*******************************************************end*****************************************************/
/***************************************************************************************************************
* 功能:重写onCreate
* 说明:实现显示柱状图
* 日期:2014.01.21
* 重写:lwj
***************************************************************************************************************/
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 柱体组数
final int SERIERS_NUM = 1;
// 柱体集的名称
final String[] SERIERS_NAME = {"柱状图"};
// 各柱体集的颜色,注意:此处要设置透明度,如没有设置(例0x0000ff)则无法显示
final int[] RENDERER_COLOR = {0xff0000ff};
// 存放横坐标标注名称的数组
String[] TextLable = {"1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月",
"11月", "12月", "1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月",
"9月", "10月","11月", "12月", "1月", "2月", "3月", "4月", "5月", "6月"};
// 存放数据的数组(决定柱体高度)
double[][] BarValue = {{50, 56, 43, 22, 60, 98, 67, 45, 67, 78,
89, 43, 90, 96, 87, 80, 70, 90, 67, 91,
97, 98, 78, 69, 67, 46, 87, 97, 78, 88}};
// 新建一个LinearLayout布局,用于显示柱状图
LinearLayout linearView=(LinearLayout)findViewById(R.id.chart_show);
// 新建一个BarChart类,用于获取数据集Dataset和渲染器Renderer,柱状图名为“照明电表月统计图”,
// 横坐标为“月份”,纵轴表为“用电量/度”,30个数据,纵坐标最大为100
BarChart barchart = new BarChart("照明电表月统计图", "月份", "用电量/度", 30, 100);
// 将图形放入GraphicalView,参数中的GetDataset和GetRenderer为自定义类BarChart中的方法
GraphicalView chartview = ChartFactory.getBarChartView(this, barchart.GetDataset(SERIERS_NUM, SERIERS_NAME, BarValue), barchart.GetRenderer(SERIERS_NUM, RENDERER_COLOR, TextLable), Type.DEFAULT);
// 将GraphicalView添加到线性布局中
linearView.addView(chartview, new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT));
// // 利用Intent显示柱状图
// Intent intent = ChartFactory.getBarChartIntent ( this , GetDataset(), GetRenderer(), Type. DEFAULT );
// startActivity(intent);
}
/*******************************************************end*****************************************************/