由于要用到统计功能,所以想用Chart图来直观的显示,研究了一下网上的资源。发现了AChartEngine。AChartEngine的代码托管在Google上。 项目主页:http://code.google.com/p/achartengine/ 项目源码:http://achartengine.googlecode.com/svn/trunk/ 目前项目的最新版本是1.0,也是一个比较稳定的版本。 闲话少说,先看一下软件运行的截图。 教程中的源码在本文最后可以下载。 先来看一下主界面的代码: [mw_shl_code=java,true]package com.manyou.androidchart; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import com.manyou.androidchart.chart.BarChart; import com.manyou.androidchart.chart.PieChart; /** * 主界面 * @package com.manyou.androidchart * @FileName MainActivity.java * @Author APKBUS-manyou * @Date 2013-1-30 */ public class MainActivity extends Activity implements OnClickListener { /** * 柱状图 */ private Button barButton; /** * 饼图 */ private Button pieButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); barButton = (Button) findViewById(R.id.bar); pieButton = (Button) findViewById(R.id.pie); barButton.setOnClickListener(this); pieButton.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.bar: Intent lineIntent = new BarChart().getIntent(this); startActivity(lineIntent); break; case R.id.pie: Intent pieIntent = new PieChart().getIntent(this); startActivity(pieIntent); break; } } } [/mw_shl_code] 主界面的代码很简单,2个按钮,第一个按钮跳转到柱状图,第二个按钮跳转到饼图。重要的是BarChart类和PieChart类,这两个类用来生成跳转的Intent。下面我会详细讲解。 再来看一下Chart图接口代码,接口只提供一个方法,getIntent(),这个方法返回了一个可以跳转的Intent。 [mw_shl_code=java,true]package com.manyou.androidchart.chart; import android.content.Context; import android.content.Intent; /** * 一个AChart接口 * @Package com.manyou.androidchart * @FileName AChartAbstract.java * @Author APKBUS-manyou * @Date 2013-1-30 */ public interface AChartAbstract { /** * 获取一个当前类型图标的Intent实例 */ public Intent getIntent(Context context); } [/mw_shl_code] 再看BarChart类和PieChart类之前我先说一下AChartEngine画图必须的2个部分。 1. Renderer 渲染器 如果以前接触过Java Swing的巴友肯定用过DefaultTableCellRenderer,DefaultTableCellRenderer控制Swing中JTable一个单元格的渲染行为。 而AChartEngine中的Renderer和DefaultTableCellRenderer的作用很相似,是用来绘制chart图的,里面包含了chart图所有的属性配置。 2. 数据源 每个chart图都有自己特定的数据源。 首先来看一下柱状图部分的代码: [mw_shl_code=java,true]package com.manyou.androidchart.chart; 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.content.Context; import android.content.Intent; import android.graphics.Color; import android.graphics.Paint.Align; /** * 柱状图 * * @Package com.manyou.androidchart * @FileName BarChart.java * @Author APKBUS-manyou * @Date 2013-1-30 */ public class BarChart implements AChartAbstract { public Intent getIntent(Context context) { return ChartFactory.getBarChartIntent(context, getDataSet(), getRenderer(), Type.STACKED, "2012年公司利润"); } /** * 构造数据 * @return */ public XYMultipleSeriesDataset getDataSet() { // 构造数据 XYMultipleSeriesDataset barDataset = new XYMultipleSeriesDataset(); CategorySeries barSeries = new CategorySeries("2012年"); barSeries.add(43.1); barSeries.add(27.2); barSeries.add(55.3); barSeries.add(43.4); barSeries.add(68.5); barSeries.add(12.6); barSeries.add(28.7); barSeries.add(33.8); barSeries.add(99.9); barSeries.add(128.0); barSeries.add(56.1); barSeries.add(77.2); barDataset.addSeries(barSeries.toXYSeries()); return barDataset; } /** * 构造渲染器 * @return */ public XYMultipleSeriesRenderer getRenderer() { XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer(); renderer.setChartTitle("2012年公司利润"); renderer.setXTitle("月份"); renderer.setYTitle("利润(万元)"); renderer.setAxesColor(Color.WHITE); renderer.setLabelsColor(Color.WHITE); // 设置X轴的最小数字和最大数字,由于我们的数据是从1开始,所以设置为0.5就可以在1之前让出一部分 // 有兴趣的童鞋可以删除下面两行代码看一下效果 renderer.setXAxisMin(0.5); renderer.setXAxisMax(12.5); // 设置Y轴的最小数字和最大数字 renderer.setYAxisMin(10); renderer.setYAxisMax(150); // 设置渲染器显示缩放按钮 renderer.setZoomButtonsVisible(true); // 设置渲染器允许放大缩小 renderer.setZoomEnabled(true); // 消除锯齿 renderer.setAntialiasing(true); // 设置背景颜色 renderer.setApplyBackgroundColor(true); renderer.setBackgroundColor(Color.GRAY); // 设置每条柱子的颜色 SimpleSeriesRenderer sr = new SimpleSeriesRenderer(); sr.setColor(Color.YELLOW); renderer.addSeriesRenderer(sr); // 设置每个柱子上是否显示数值 renderer.getSeriesRendererAt(0).setDisplayChartValues(true); // X轴的近似坐标数 renderer.setXLabels(12); // Y轴的近似坐标数 renderer.setYLabels(5); // 刻度线与X轴坐标文字左侧对齐 renderer.setXLabelsAlign(Align.LEFT); // Y轴与Y轴坐标文字左对齐 renderer.setYLabelsAlign(Align.LEFT); // 允许左右拖动,但不允许上下拖动. renderer.setPanEnabled(true, false); // 柱子间宽度 renderer.setBarSpacing(0.1f); return renderer; } }[/mw_shl_code] 代码中常用的配置我已经给大家写出来了,而且写了比较清楚的注释。 想告诉大家的是,这只是一部分属性,AChartEngine渲染器属性绝对不止这一些,有兴趣的巴友可以去查看一下API,不过是英文的。 AChartEngine API可以在http://code.google.com/p/achartengine/中下载。 代码中getRenderer方法就是初始化渲染器,getDataSet方法就是初始化数据源。 ChartFactory.getBarChartIntent()方法就是用来创建一个柱状图的Intent以供跳转。 细心的巴友可能会问,这个Intent是不是要跳转到一个Activity中呢?这个Activity是不是AChartEngine创建的呢?要不要再AndroidManifest.xml中配置呢? 答案是肯定的。使用AChartEngine绘制chart图要在AndroidManifest.xml中注册org.achartengine.GraphicalActivity. [mw_shl_code=xhtml,true]<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.manyou.androidchart" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.manyou.androidchart.MainActivity" android:label="@string/app_name" android:screenOrientation="portrait"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="org.achartengine.GraphicalActivity" /> </application> </manifest>[/mw_shl_code] 而绘制饼图的时候与绘制柱状图基本上是类似的。使用ChartFactory.getPieChartIntent()方法就可以返回一个饼图的Intent。 [mw_shl_code=java,true]package com.manyou.androidchart.chart; import org.achartengine.ChartFactory; import org.achartengine.model.CategorySeries; import org.achartengine.renderer.DefaultRenderer; import org.achartengine.renderer.SimpleSeriesRenderer; import android.content.Context; import android.content.Intent; import android.graphics.Color; /** * 饼图 * * @Package com.manyou.androidchart * @FileName PieChart.java * @Author APKBUS-manyou * @Date 2013-1-30 */ public class PieChart implements AChartAbstract { public Intent getIntent(Context context) { return ChartFactory.getPieChartIntent(context, getDataSet(), getPieRenderer(), "手机开发者比例(饼图)"); } /** * 构造饼图数据 */ private CategorySeries getDataSet() { // 构造数据 CategorySeries pieSeries = new CategorySeries("手机开发者比例"); pieSeries.add("Android", 28); pieSeries.add("IOS", 46); pieSeries.add("其他", 26); return pieSeries; } /** * 获取一个饼图渲染器 */ private DefaultRenderer getPieRenderer() { // 构造一个渲染器 DefaultRenderer renderer = new DefaultRenderer(); // 设置渲染器显示缩放按钮 renderer.setZoomButtonsVisible(true); // 设置渲染器允许放大缩小 renderer.setZoomEnabled(true); // 设置渲染器标题文字大小 renderer.setChartTitleTextSize(20); // 给渲染器增加3种颜色 SimpleSeriesRenderer yellowRenderer = new SimpleSeriesRenderer(); yellowRenderer.setColor(Color.YELLOW); SimpleSeriesRenderer blueRenderer = new SimpleSeriesRenderer(); blueRenderer.setColor(Color.BLUE); SimpleSeriesRenderer redRenderer = new SimpleSeriesRenderer(); redRenderer.setColor(Color.RED); renderer.addSeriesRenderer(yellowRenderer); renderer.addSeriesRenderer(blueRenderer); renderer.addSeriesRenderer(redRenderer); // 设置饼图文字字体大小和饼图标签字体大小 renderer.setLabelsTextSize(15); renderer.setLegendTextSize(15); // 消除锯齿 renderer.setAntialiasing(true); // 设置背景颜色 renderer.setApplyBackgroundColor(true); renderer.setBackgroundColor(Color.BLACK); // 设置线条颜色 renderer.setAxesColor(Color.WHITE); return renderer; } } [/mw_shl_code] 如果想绘制其他的chart图,只要调用响应的ChartFactory.getXXXIntent()即可,关键看方法需要什么类型的渲染器和什么类型的数据源就可以了。 本文的实例代码: AndroidChart.zip(1.11 MB, 下载次数: 773)