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; } }
下图为运行结果图