AchartEngine 画柱状图

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*****************************************************/


5、现在来完成step4与step5。本案例完成了一个只有一组数据的柱状图,名为“照明电表月统计图”, 横坐标为“月份”,纵轴表为“用电量/度”,这组图的名为”柱状图“,颜色为蓝色(0xff0000ff),有30个数据(即30个柱体),横坐标的标签如TextLable数组(有几个数据就有几个标签),纵坐标的范围是0-100。

    /***************************************************************************************************************
     * 功能:重写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*****************************************************/








评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值