achartengine是一个android平台下较好的图形报表开发库。该项目的地址:http://code.google.com/p/achartengine/ 。现在最新版本1.0。每个版本都有对应的jar包、demo和java doc。demo里面的例子已经非常详尽了,你可以先把demo下载下来导入到eclipse里。这儿我做一个示例,并加上注释。
demo里有一个AbstractDemoChart.java的类,这个类可以作为一个父类,你画任何图时可以继承自这个类。画图主要有两个方面,一个是dataset即数据集,比如x/y轴的数值等;一个是renderer即渲染器,比如字体颜色、大小等等一些样式。这个父类里就是一些建立dataset和renderer的基本方法,当然你可以根据自己需要修改。最后通过ChartFactory类的相应方法生成对应的图表,比如getLineChartIntent(..)生成线性表,这个返回的是一个Intent,可以直接启动它,不过要注意在manifest文件中要加上<activity android:name="org.achartengine.GraphicalActivity" /> 。还可以通过ChartFactory的getLineChartView(..)返回一个线性表的view对象,这样你可以把这个view对象放在一个布局中展示。下面是示例的主要代码:
public class AverageTemperatureChart extends AbstractDemoChart { public String getName() { return "Average temperature"; } public String getDesc() { return "The average temperature in 4 Greek islands (line chart)"; } /** * Executes the chart demo. * * @param context * the context * @return the built intent */ public Intent execute(Context context) { // 每个item的title String[] titles = new String[] { "Crete", "Corfu", "Thassos", "Skiathos" }; // x轴的值 List<double[]> x = new ArrayList<double[]>(); for (int i = 0; i < titles.length; i++) { x.add(new double[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }); } // y轴的值 List<double[]> values = new ArrayList<double[]>(); values.add(new double[] { 12.3, 12.5, 13.8, 16.8, 20.4, 24.4, 26.4, 26.1, 23.6, 20.3, 17.2, 13.9 }); values.add(new double[] { 10, 10, 12, 15, 20, 24, 26, 26, 23, 18, 14, 11 }); values.add(new double[] { 5, 5.3, 8, 12, 17, 22, 24.2, 24, 19, 15, 9, 6 }); values.add(new double[] { 9, 10, 11, 15, 19, 23, 26, 25, 22, 18, 13, 10 }); int[] colors = new int[] { Color.BLUE, Color.GREEN, Color.CYAN, Color.YELLOW }; // 点的样式 PointStyle[] styles = new PointStyle[] { PointStyle.CIRCLE, PointStyle.DIAMOND, PointStyle.TRIANGLE, PointStyle.SQUARE }; XYMultipleSeriesRenderer renderer = buildRenderer(colors, styles); int length = renderer.getSeriesRendererCount(); // 点是空心还是实心 for (int i = 0; i < length; i++) { ((XYSeriesRenderer) renderer.getSeriesRendererAt(i)) .setFillPoints(true); } // 图表部分的背景颜色 renderer.setBackgroundColor(Color.parseColor("#f3f3f3")); renderer.setApplyBackgroundColor(true); // 图表与屏幕四边的间距颜色 renderer.setMarginsColor(Color.argb(0, 0xF3, 0xF3, 0xF3)); renderer.setChartTitleTextSize(30); renderer.setAxisTitleTextSize(25); // renderer.setLegendHeight(50); // 图例文字的大小 renderer.setLegendTextSize(20); renderer.setMargins(new int[] { 50, 50, 50, 30 }); // x、y轴上刻度颜色 renderer.setXLabelsColor(Color.BLACK); renderer.setYLabelsColor(0, Color.BLACK); // 最后两个参数代表轴的颜色和轴标签的颜色 setChartSettings(renderer, "Average temperature", "Month", "Temperature", 0.5, 12.5, -10, 40, Color.BLACK, Color.BLACK); // 轴上数字的数量 renderer.setXLabels(12); renderer.setYLabels(10); // 是否显示网格 renderer.setShowGrid(true); // x或y轴上数字的方向,相反的。 renderer.setXLabelsAlign(Align.RIGHT); renderer.setYLabelsAlign(Align.RIGHT); // 有问题的方法 // renderer.setZoomButtonsVisible(true); // renderer.setPanLimits(new double[] { -10, 20, -10, 40 }); // renderer.setZoomLimits(new double[] { -10, 20, -10, 40 }); Intent intent = ChartFactory.getLineChartIntent(context, buildDataset(titles, x, values), renderer, "Average temperature"); return intent; } }代码中的
renderer.setZoomButtonsVisible(true);这个方法是有问题的,加上就会报错,这个方法是显示缩放按钮的。一些方法可以自己修改修改看看效果,其他图表可以参看官方的demo。
附上效果图: