Android Chart图开源库AChartEngine教程

来源:互联网 发布:搜索引擎 知乎 编辑:程序博客网 时间:2024/05/17 08:26
由于要用到统计功能,所以想用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()即可,关键看方法需要什么类型的渲染器和什么类型的数据源就可以了。
0 0
原创粉丝点击