在Android上用AChartEngine轻松绘制图表
Android发布不久的2008年底,开发者们已经开始寻找制表、制图、绘图的工具库。当时没有这样免费或者开源的解决方案可用。
我开始带着兴趣评估Android,在开发了若干个需要一些制图的Android应用程序后,我决定开源AChartEngine的代码。在2009年3月启动了0.2.0版本,第一个开源的是Android图表工具库。那个时候,Android SDK是版本1.1。
近4年的时间,所有类型的应用程序正在使用AChartEngine来呈现图表。appbrain.com Android市场声明他们总共发布的应用程序数量(大于600K)的0.53%,意味着他们中超过3000个应用正在使用AChartEngine。这些包括Waze和非死book的官方页面管理应用程序。
使用AChartEngine添加图表到Android应用程序,就像把achartengine-x.y.x.jar添加到应用程序类路径、使用其API编码一样简单。当前稳定的版本是1.0.0,版本1.1.0正在开发中。Jar文件只有110KB大小,在当下这是非常小的占用。然而,尽管体积很小,但是AChartEngine支持各种图表类型。
关于兼容性的注意事项:AChartEngine支持所有的1.6及更高版本的Android SDK。1.6版本只提供了平移和基于按钮的缩放,而2.1版本以及更新的版本添加了双指缩放的支持,在Android SDK 2.x及更新的版本中可用。前段时间,当AChartEngine放弃支持比2.1更老的Android SDK版本,许多使用者在发布几天后要求恢复到之前的版本。当时,根据官方的Android平台分布情况可以在这里找到,仍有大约5%世界范围内的设备正在运行早于2.x的版本。
功能
AChartEngine主要支持三种类型的图表:
- XY图表——在两轴坐标系中展示数据(线,立方线,面,条,散点图,气泡图,范围(高-低))
- “圆”图表——饼图,圆环图,刻度盘
- 组合图——可以显示XY图的组合
快速游览一些AChartEngine实例应用截图,请访问官方网站和AChartEngine Goolge Code页面。
整体类设计
下图展示了处理图表视觉呈现的类的组织结构。
- AbstractChart类描述了那些所有图表共享的行为,包括描画背景、说明、标题等等;
- XYChart类描述了XY图表类型共同的状态和行为,如坐标轴渲染、标签等等;
- RoundChart跟XYChart相似,但多了一类圆形的图表类型。
设计组件
整个设计没有只局限于视觉或视图上,还有几个有助于整体图像的组件。
- 模型——数据集/数据序列。
- 视图——如上面描述的。
- 渲染器——有助于自定义图表外观(颜色,字体,坐标轴,标签,格式等等)。
- ChartFactory——获得一个数据集合实例和一个渲染器实例,并返回嵌入在一个Intent(用于图表填充一个Activity的情况)或者一个View(当图表是Activity的一个部分,伴有其他小部件)中想得到的的图表。
- 工具——平移和缩放的交互工具。
示例代码
要使用AChartEngine的API进行编码开发,你可以下载下面的二进制文件其中一个,添加到你的classpath然后开始编码吧。
Maven用户可以通过添加如下代码到他们的pom.xml文件中来包含AChartEngine到他们的应用程序中:
<repository> <id>achartengine</id> <name>Public AChartEngine repository</name> <url>https://repository-achartengine.forge.cloudbees.com/snapshot/</url> </repository> <dependency> <groupId>org.achartengine</groupId> <artifactId>achartengine</artifactId> <version>1.1.0</version> </dependency>
下面的代码展示了一个在应用程序中使用AChartEngine的例子。程序允许创建新的数据序列以及输入X和Y值,然后会被添加到当前的序列中。每一次添加数据,图表都会更新。使用这个程序来创建一个有10个数据点的序列的例子,可以在下面的截图中看到。
全部代码在这里可以得到。其中包括用来解释最重要部分的注释。
AChartEngine制图类设计支持通过改变一行代码来用条形图表替换成线条图表。将这句:
mChartView = ChartFactory.getLineChartView(this, mDataset, mRenderer);
替换成下面的代码,我们将得到一个像下面截图中的条形图表。
mChartView = ChartFactory.getBarChartView(this, mDataset, mRenderer, Type.DEFAULT);
也可以替换为下面这句代码,得到一个散列图表:
mChartView = ChartFactory.getScatterChartView(this, mDataset, mRenderer);
为了让上面的例子工作,必须定义一个简单的布局文件而且需要包含一个android:id=”@+id/chart”的LinearLayout。示例的布局文件可以在这里下载到。
仅仅小的改变,就可以复用上面的代码来制作一个用户界面来创建饼形图表。我们只需要一个单独文本输入一个值替代我们在XY图表中输入的X和Y值。然后,我们需要实例化另一种类型的渲染器,如下面的代码所示。我们也需要定义一些用在我们创建的圆片上的颜色值。
/** Colors to be used for the pie slices. */ private static int[] COLORS = new int[] { Color.GREEN, Color.BLUE, Color.MAGENTA, Color.CYAN }; /** The main series that will include all the data. */ private CategorySeries mSeries = new CategorySeries(""); /** The main renderer for the main dataset. */ private DefaultRenderer mRenderer = new DefaultRenderer();
onSaveInstanceState和onRestoreInstanceState方法跟上面例子中的方法类似,仅仅这一次我们只保存和恢复mSeries和mRenderer变量的状态。
onCreate方法也是类似的,但这次我们可以使用一些饼状图特定的渲染器属性。
// set the start angle for the first slice in the pie chart mRenderer.setStartAngle(180); // display values on the pie slices mRenderer.setDisplayValues(true);
在mAdd按钮上的点击事件上,我们用与上面相同的方式添加数据到集合,并我们添加一个新的将处理添加的圆片显示的渲染器。然后,图表必须重绘来反映新的变化。
mSeries.add("Series " + (mSeries.getItemCount() + 1), value); SimpleSeriesRenderer renderer = new SimpleSeriesRenderer(); renderer.setColor(COLORS[(mSeries.getItemCount() - 1) % COLORS.length]); mRenderer.addSeriesRenderer(renderer); mChartView.repaint();
在onResume方法中,我们创建一个饼状图:
mChartView = ChartFactory.getPieChartView(this, mSeries, mRenderer);
在图表视图的点击事件监听器上,当seriesSelection不是空,意味着一个圆片被选中了,我们想要像下面的截图所示形象化的高亮那个被选中的圆片。为了达到这样,我们需要设置被选中的圆片的渲染器成为可高亮。在图表视图上任何视觉上的变化通过调用repaint()方法来触发。
for (int i = 0; i < mSeries.getItemCount(); i++) { mRenderer.getSeriesRendererAt(i).setHighlighted(i == seriesSelection.getPointIndex()); } mChartView.repaint();
产生的图表应该像下面这样:
代码例子包含在官方DEMO应用中,可以在这里下载到。
你可以找到所有AChartEngine支持的图表类型的例子。
资源
你可以访问官方AChartEngine网站在http://achartengine.org,Google code网站提供可下载的jar包,javadocs和demo应用,问题跟踪以及源代码SVN路径:http://code.google.com/p/achartengine.
想要更深层次的帮助性的资源,在油Tube上搜索”AChartEngine”,在stackoverflow.com发布问题,在我们的Google group和非死book page上交流或者通过发邮件给contact@achartengine.org联系我们。
附录——欢迎贡献者
AChartEngine是一个开源工程项目,它是开源社区努力的结果。任何想贡献力量的人可以从SVN上检出源代码来了解它。然后,看一下那些处于Open状态的问题,试着修复一些,完成后发布补丁。
原文链接: jaxenter 翻译: 伯乐在线 - LeonHover
译文链接: http://blog.jobbole.com/65102/