安卓图表引擎AChartEngine

1 篇文章 0 订阅
1 篇文章 0 订阅

ACE官网查询:点击打开链接

ACE下载地址:点击打开链接

AChartEngine是一个针对Android程序开发的开源图表生成类库。支持以下几种图表类型:

  • 折线图
  • 区域图
  • 散点图
  • time chart
  • 柱状图
  • 饼状图
  • bubble chart
  • doughnut chart
  • range (high-low) bar chart

    其实ACE用起来也是非常的方便,具体集中在ChartFactory类中的各种方法中。比如ChartFactory.getLineChartView(context, dataset, renderer)得到的就是一个折线统计图,还有 ChartFactory.getPieChartView(context, series, renderer)得到的就是一个饼图,ChartFactory.getBarChartView(context, dataset, renderer, type)就是一个柱状图……


    详情如下:

    条形图

    static android.content.Intent

    getBarChartIntent(android.content.Context context,XYMultipleSeriesDataset dataset, XYMultipleSeriesRenderer renderer,BarChart.Type type) 

    条形图

    static android.content.Intent

    getBarChartIntent(android.content.Context context,XYMultipleSeriesDataset dataset, XYMultipleSeriesRenderer renderer,BarChart.Type type, java.lang.String activityTitle) 

    条形图

    static GraphicalView

    getBarChartView(android.content.Context context,XYMultipleSeriesDataset dataset, XYMultipleSeriesRenderer renderer,BarChart.Type type) 

    气泡图

    static android.content.Intent

    getBubbleChartIntent(android.content.Context context,XYMultipleSeriesDataset dataset, XYMultipleSeriesRenderer renderer) 

    气泡图

    static android.content.Intent

    getBubbleChartIntent(android.content.Context context,XYMultipleSeriesDataset dataset, XYMultipleSeriesRenderer renderer, java.lang.String activityTitle) 

    气泡图

    static GraphicalView

    getBubbleChartView(android.content.Context context,XYMultipleSeriesDataset dataset, XYMultipleSeriesRenderer renderer) 

    组合图

    static android.content.Intent

    getCombinedXYChartIntent(android.content.Context context,XYMultipleSeriesDataset dataset, XYMultipleSeriesRenderer renderer, java.lang.String[] types, java.lang.String activityTitle) 

    组合图

    static GraphicalView

    getCombinedXYChartView(android.content.Context context,XYMultipleSeriesDataset dataset, XYMultipleSeriesRenderer renderer, java.lang.String[] types) 

    立方折线图

    static GraphicalView

    getCubeLineChartView(android.content.Context context,XYMultipleSeriesDataset dataset, XYMultipleSeriesRenderer renderer, float smoothness) 

    立方折线图

    static android.content.Intent

    getCubicLineChartIntent(android.content.Context context,XYMultipleSeriesDataset dataset, XYMultipleSeriesRenderer renderer, float smoothness) 

    立方折线图

    static android.content.Intent

    getCubicLineChartIntent(android.content.Context context,XYMultipleSeriesDataset dataset, XYMultipleSeriesRenderer renderer, float smoothness, java.lang.String activityTitle) 

    拨号盘

    static android.content.Intent

    getDialChartIntent(android.content.Context context,CategorySeries dataset, DialRenderer renderer, java.lang.String activityTitle) 

    拨号盘

    static GraphicalView

    getDialChartView(android.content.Context context, CategorySeries dataset,DialRenderer renderer) 

    圆环图

    static android.content.Intent

    getDoughnutChartIntent(android.content.Context context,MultipleCategorySeries dataset, DefaultRenderer renderer, java.lang.String activityTitle) 

    圆环图

    static GraphicalView

    getDoughnutChartView(android.content.Context context,MultipleCategorySeries dataset, DefaultRenderer renderer) 

    圆环图

    static android.content.Intent

    getLineChartIntent(android.content.Context context,XYMultipleSeriesDataset dataset, XYMultipleSeriesRenderer renderer) 

    折线图

    static android.content.Intent

    getLineChartIntent(android.content.Context context,XYMultipleSeriesDataset dataset, XYMultipleSeriesRenderer renderer, java.lang.String activityTitle) 

    折线图

    static GraphicalView

    getLineChartView(android.content.Context context,XYMultipleSeriesDataset dataset, XYMultipleSeriesRenderer renderer) 

    饼图

    static android.content.Intent

    getPieChartIntent(android.content.Context context, CategorySeries dataset,DefaultRenderer renderer, java.lang.String activityTitle) 

    饼图

    static GraphicalView

    getPieChartView(android.content.Context context, CategorySeries dataset,DefaultRenderer renderer) 

    范围条形图

    static android.content.Intent

    getRangeBarChartIntent(android.content.Context context,XYMultipleSeriesDataset dataset, XYMultipleSeriesRenderer renderer,BarChart.Type type, java.lang.String activityTitle) 

    范围条形图

    static GraphicalView

    getRangeBarChartView(android.content.Context context,XYMultipleSeriesDataset dataset, XYMultipleSeriesRenderer renderer,BarChart.Type type) 

    散点图

    static android.content.Intent

    getScatterChartIntent(android.content.Context context,XYMultipleSeriesDataset dataset, XYMultipleSeriesRenderer renderer) 

    散点图

    static android.content.Intent

    getScatterChartIntent(android.content.Context context,XYMultipleSeriesDataset dataset, XYMultipleSeriesRenderer renderer, java.lang.String activityTitle) 

    散点图

    static GraphicalView

    getScatterChartView(android.content.Context context,XYMultipleSeriesDataset dataset, XYMultipleSeriesRenderer renderer) 

    时间图

    static android.content.Intent

    getTimeChartIntent(android.content.Context context,XYMultipleSeriesDataset dataset, XYMultipleSeriesRenderer renderer, java.lang.String format) 

    时间图

    static android.content.Intent

    getTimeChartIntent(android.content.Context context,XYMultipleSeriesDataset dataset, XYMultipleSeriesRenderer renderer, java.lang.String format, java.lang.String activityTitle) 

    时间图

    static GraphicalView

    getTimeChartView(android.content.Context context,XYMultipleSeriesDataset dataset, XYMultipleSeriesRenderer renderer, java.lang.String format) 

     (图表摘自:lk_blog的csdn博客 链接地址:http://blog.csdn.net/lk_blog/article/details/7642751

    下面为编写的实例代码


    首先必须在AndroidManifest.xml:文件里面加入一个activity

     <activity android:name="org.achartengine.GraphicalActivity" />


    下面就是编写代码了

    package com.demo.linechartpro;
    
    import java.lang.reflect.Field;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;
    
    import org.achartengine.ChartFactory;
    import org.achartengine.chart.BarChart.Type;
    import org.achartengine.model.CategorySeries;
    import org.achartengine.model.XYMultipleSeriesDataset;
    import org.achartengine.renderer.SimpleSeriesRenderer;
    import org.achartengine.renderer.XYMultipleSeriesRenderer;
    
    import android.annotation.SuppressLint;
    import android.app.ListActivity;
    import android.content.Intent;
    import android.graphics.Color;
    import android.os.Bundle;
    import android.view.Menu;
    import android.view.View;
    import android.widget.ListView;
    
    import com.demo.linechartpro.entity.UserInfo;
    import com.demo.linechartpro.tools.InfoTools;
    
    @SuppressLint("NewApi")
    public class MainActivity extends ListActivity {
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    
    		InfoTools info = new InfoTools();
    		List<UserInfo> list = info.getInfo();
    
    		// 通过反射取得UserInfo里面的属性
    		Field[] field = UserInfo.class.getDeclaredFields();
    
    		XYMultipleSeriesRenderer renderer = getBarDemoRenderer(list);
    
    		Intent intent = ChartFactory.getBarChartIntent(this,
    				getBarDemoDataset(list, field), renderer, Type.DEFAULT);
    		startActivity(intent);
    
    	}
    
    	/**
    	 * 
    	 * @param list2
    	 * @param field
    	 * @return
    	 */
    	private XYMultipleSeriesDataset getBarDemoDataset(List<UserInfo> list2,
    			Field[] field) {
    		XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
    
    		// field[2].getName() 通过反射得出属性Money的值
    		CategorySeries series = new CategorySeries(field[2].getName());
    		for (UserInfo userInfo : list2) {
    			series.add(userInfo.getMoney());
    		}
    		dataset.addSeries(series.toXYSeries());
    
    		// field[4].getName() 通过反射得出属性spend的值
    		CategorySeries seriesSpend = new CategorySeries(field[4].getName());
    		for (UserInfo userInfo : list2) {
    			seriesSpend.add(userInfo.getSpend());
    		}
    		dataset.addSeries(seriesSpend.toXYSeries());
    
    		return dataset;
    	}
    
    	private XYMultipleSeriesRenderer getBarDemoRenderer(List<UserInfo> list2) {
    		XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer();
    		SimpleSeriesRenderer simpleRenderer = new SimpleSeriesRenderer();
    		simpleRenderer.setColor(Color.RED);
    		simpleRenderer.setDisplayChartValues(true);
    		renderer.addSeriesRenderer(simpleRenderer);
    		
    
    		simpleRenderer = new SimpleSeriesRenderer();
    		simpleRenderer.setColor(Color.BLUE);
    		simpleRenderer.setDisplayChartValues(true);
    		renderer.addSeriesRenderer(simpleRenderer);
    
    		setChartSettings(renderer, list2);
    
    		return renderer;
    	}
    
    	/**
    	 * 设置项
    	 * 
    	 * @param renderer
    	 * @param list2
    	 */
    	private void setChartSettings(XYMultipleSeriesRenderer renderer,
    			List<UserInfo> list2) {
    
    		renderer.setChartTitle("花费以及工资柱状图");
    		renderer.setXTitle("姓名");
    		renderer.setYTitle("钱数 单位:RMB");
    		renderer.setXAxisMax(list2.size() + 0.5);
    		renderer.setXAxisMin(0.5);
    		// 消除x轴上的数字
    		renderer.setXLabels(0);
    		for (int i = 0; i < list2.size(); i++) {
    			renderer.addXTextLabel(i+1,list2.get(i).getName());
    		}
    		// 调用方法
    		renderer.setYAxisMin(MinY(list2)/2);
    		// 调用方法
    		renderer.setYAxisMax(MaxY(list2));
    	}
    
    	@Override
    	public boolean onCreateOptionsMenu(Menu menu) {
    		// Inflate the menu; this adds items to the action bar if it is present.
    		getMenuInflater().inflate(R.menu.main, menu);
    		return true;
    	}
    
    	/**
    	 * 取得最大值
    	 * 
    	 * @param list2
    	 * @return
    	 */
    	public int MaxY(List<UserInfo> list2) {
    		int i = 0;
    
    		List<Integer> li = new ArrayList<Integer>();
    		// 这里对list里面设置Money和spend属性是为了显示Y轴数值时不至于出现显示不出来的效果
    		for (UserInfo userInfo : list2) {
    			li.add(userInfo.getMoney());
    			li.add(userInfo.getSpend());
    		}
    		i = Collections.max(li);
    		System.out.println("MaxY-----------------------" + i);
    		return i;
    	}
    
    	/**
    	 * 取得最小值
    	 * 
    	 * @param list2
    	 * @return
    	 */
    	public int MinY(List<UserInfo> list2) {
    		int i = 0;
    
    		List<Integer> li = new ArrayList<Integer>();
    		// 这里对list里面设置Money和spend属性是为了显示Y轴数值时不至于出现显示不出来的效果
    		for (UserInfo userInfo : list2) {
    			li.add(userInfo.getMoney());
    			li.add(userInfo.getSpend());
    		}
    		i = Collections.min(li);
    		System.out.println("MinY-----------------------" + i);
    		return i;
    	}
    }
    

    这个程序里面使用的是getBarChartIntent

    并且在上段代码中InfoTools类中的方法,在此说明一下,这里的代码很简单,就是从服务端取得数据显示在客户端而已

    这里也可以不使用这段代码,要显示结果的话,这里可以自己定义一个List来显示。

    infoTools里面的代码就不贴出来了。


    下面是运行结果图



    以下为饼图的实现过程,其实两者都非常的相似。这里使用getPieChartView

    以下为代码


    package com.demo.linechartpro;
    
    import java.lang.reflect.Field;
    import java.util.List;
    
    import org.achartengine.ChartFactory;
    import org.achartengine.GraphicalView;
    import org.achartengine.model.CategorySeries;
    import org.achartengine.renderer.DefaultRenderer;
    import org.achartengine.renderer.SimpleSeriesRenderer;
    
    import android.app.Activity;
    import android.content.Context;
    import android.graphics.Color;
    import android.os.Bundle;
    import android.view.Menu;
    
    import com.demo.linechartpro.entity.UserInfo;
    import com.demo.linechartpro.tools.InfoTools;
    
    public class PieActivity extends Activity {
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_pie);
    		GraphicalView view = this.execute(this);
    		setContentView(view);
    	}
    
    	@Override
    	public boolean onCreateOptionsMenu(Menu menu) {
    		// Inflate the menu; this adds items to the action bar if it is present.
    		getMenuInflater().inflate(R.menu.pie, menu);
    		return true;
    	}
    
    	/**
    	 * 取得
    	 * 
    	 * @param context
    	 * @return
    	 */
    	public GraphicalView execute(Context context) {
    
    		InfoTools info = new InfoTools();
    		// 获取数据
    		List<UserInfo> li = info.getInfo();
    		// 设置dataset
    		CategorySeries series = getDataset(li);
    		// 设置renderer
    		DefaultRenderer renderer = getDefaultRenderer(li);
    		return ChartFactory.getPieChartView(context, series, renderer);
    	}
    
    	/**
    	 * 设置数据
    	 * 
    	 * @return
    	 */
    	public CategorySeries getDataset(List<UserInfo> li) {
    		CategorySeries cs = new CategorySeries("饼状图");
    
    		// 循环出饼图的各个扇形大小和文字说明
    		for (UserInfo userInfo : li) {
    			cs.add(userInfo.getName(), userInfo.getMoney());
    		}
    		return cs;
    	}
    
    	public DefaultRenderer getDefaultRenderer(List<UserInfo> li) {
    		DefaultRenderer renderer = new DefaultRenderer();
    
    		// 反射Color类的属性
    		Field[] fields = Color.class.getDeclaredFields();
    		// 这里进行循环,有多少条数据就动态设置饼图里面每个扇形的颜色
    		// 如果Color类里面的颜色还嫌少的话可以自己定义一个数组,颜色的设置可以使用下面这个方法
    		// Color.parseColor("#000000");
    		for (int i = 0; i < li.size(); i++) {
    			SimpleSeriesRenderer ssr = new SimpleSeriesRenderer();
    			try {
    				System.out.println(fields[i].getName());
    				// 设置颜色
    				ssr.setColor(fields[i].getInt(Color.class));
    				ssr.setDisplayChartValues(true);
    			} catch (IllegalArgumentException e) {
    				e.printStackTrace();
    			} catch (IllegalAccessException e) {
    				e.printStackTrace();
    			}
    			renderer.addSeriesRenderer(ssr);
    		}
    		return renderer;
    	}
    }
    

    下图为运行效果



    还有折线统计图。其实跟柱状图很像。但是需要注意的是

    renderer里面不应该使用SimpleSeriesRenderer而应该为XYSeriesRenderer

    以下为代码:


    package com.demo.linechartpro;
    
    import java.lang.reflect.Field;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;
    
    import org.achartengine.ChartFactory;
    import org.achartengine.GraphicalView;
    import org.achartengine.model.CategorySeries;
    import org.achartengine.model.XYMultipleSeriesDataset;
    import org.achartengine.renderer.XYMultipleSeriesRenderer;
    import org.achartengine.renderer.XYSeriesRenderer;
    
    import android.app.Activity;
    import android.content.Context;
    import android.graphics.Color;
    import android.os.Bundle;
    import android.view.Menu;
    
    import com.demo.linechartpro.entity.UserInfo;
    import com.demo.linechartpro.tools.InfoTools;
    
    public class LineActivity extends Activity {
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_line);
    		GraphicalView view = this.execute(this);
    		setContentView(view);
    	}
    
    	@Override
    	public boolean onCreateOptionsMenu(Menu menu) {
    		// Inflate the menu; this adds items to the action bar if it is present.
    		getMenuInflater().inflate(R.menu.line, menu);
    		return true;
    	}
    	
    	/**
    	 * 取得
    	 * 
    	 * @param context
    	 * @return
    	 */
    	public GraphicalView execute(Context context) {
    		InfoTools info = new InfoTools();
    		List<UserInfo> li = info.getInfo();
    		XYMultipleSeriesDataset dataset = getSeriesDataset(li);
    
    		XYMultipleSeriesRenderer renderer = getSeriesRenderer(li);
    		return ChartFactory.getLineChartView(context, dataset, renderer);
    	}
    	
    	/**
    	 * 获取数据
    	 * @param li 数据库数据
    	 * @return
    	 */
    	public XYMultipleSeriesDataset getSeriesDataset(List<UserInfo> li) {
    		XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
    		Field[] field = UserInfo.class.getDeclaredFields();
    		
    		// field[2].getName() 通过反射得出属性Money的值
    		CategorySeries seriesMoney = new CategorySeries(field[2].getName());
    		for (UserInfo userInfo : li) {
    			seriesMoney.add(userInfo.getMoney());
    		}
    		dataset.addSeries(seriesMoney.toXYSeries());
    		
    		//  field[4].getName() 通过反射得出属性Spend的值
    		CategorySeries seriesSpend = new CategorySeries(field[4].getName());
    		for (UserInfo userInfo : li) {
    			seriesSpend.add(userInfo.getSpend());
    		}
    		dataset.addSeries(seriesSpend.toXYSeries());
    		
    		
    		return dataset;
    	}
    	
    	public XYMultipleSeriesRenderer getSeriesRenderer(List<UserInfo> li) {
    		XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer();
    		
    		
    		XYSeriesRenderer seriesRenderer = new XYSeriesRenderer();
    		seriesRenderer.setColor(Color.RED);
    		seriesRenderer.setDisplayChartValues(true);
    		renderer.addSeriesRenderer(seriesRenderer);
    		
    
    		seriesRenderer = new XYSeriesRenderer();
    		seriesRenderer.setColor(Color.BLUE);
    		seriesRenderer.setDisplayChartValues(true);
    		renderer.addSeriesRenderer(seriesRenderer);
    		
    		setChartSettings(li, renderer);
    		
    		
    		return renderer;
    	}
    
    	/**
    	 * 设置项
    	 * @param li
    	 * @param renderer
    	 */
    	private void setChartSettings(List<UserInfo> li,
    			XYMultipleSeriesRenderer renderer) {
    		renderer.setChartTitle("花费与工资折线图");
    		renderer.setXTitle("人物");
    		renderer.setYTitle("Money");
    		// 消除x轴上的数字
    		renderer.setXLabels(0);
    		// 设置X轴上面的内容
    		for (int i = 0; i < li.size(); i++) {
    			renderer.addXTextLabel(i+1,li.get(i).getName());
    		}
    		renderer.setXAxisMax(li.size()+0.5);
    		renderer.setXAxisMin(0.5);
    		renderer.setYAxisMax(MaxY(li));
    		renderer.setYAxisMin(MinY(li)/2);
    	}
    
    
    	/**
    	 * 取得最大值
    	 * 
    	 * @param list
    	 * @return
    	 */
    	public int MaxY(List<UserInfo> list) {
    		int i = 0;
    
    		List<Integer> li = new ArrayList<Integer>();
    		// 这里对list里面设置Money和spend属性是为了显示Y轴数值时不至于出现显示不出来的效果
    		for (UserInfo userInfo : list) {
    			li.add(userInfo.getMoney());
    			li.add(userInfo.getSpend());
    		}
    		i = Collections.max(li);
    		System.out.println("MaxY-----------------------" + i);
    		return i;
    	}
    
    	/**
    	 * 取得最小值
    	 * 
    	 * @param list
    	 * @return
    	 */
    	public int MinY(List<UserInfo> list) {
    		int i = 0;
    
    		List<Integer> li = new ArrayList<Integer>();
    		// 这里对list里面设置Money和spend属性是为了显示Y轴数值时不至于出现显示不出来的效果
    		for (UserInfo userInfo : list) {
    			li.add(userInfo.getMoney());
    			li.add(userInfo.getSpend());
    		}
    		i = Collections.min(li);
    		System.out.println("MinY-----------------------" + i);
    		return i;
    	}
    }
    

    下图为运行结果图


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值