在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/