在Android上用AChartEngine輕松繪制圖表

jopen 10年前發布 | 45K 次閱讀 Android Android開發 移動開發

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圖的組合

在Android上用AChartEngine輕松繪制圖表

在Android上用AChartEngine輕松繪制圖表

在Android上用AChartEngine輕松繪制圖表

快速游覽一些AChartEngine實例應用截圖,請訪問官方網站AChartEngine Goolge Code頁面

整體類設計

下圖展示了處理圖表視覺呈現的類的組織結構。

在Android上用AChartEngine輕松繪制圖表

  • AbstractChart類描述了那些所有圖表共享的行為,包括描畫背景、說明、標題等等;
  • XYChart類描述了XY圖表類型共同的狀態和行為,如坐標軸渲染、標簽等等;
  • RoundChart跟XYChart相似,但多了一類圓形的圖表類型。

設計組件

整個設計沒有只局限于視覺或視圖上,還有幾個有助于整體圖像的組件。

  • 模型——數據集/數據序列。
  • 視圖——如上面描述的。
  • 渲染器——有助于自定義圖表外觀(顏色,字體,坐標軸,標簽,格式等等)。
  • ChartFactory——獲得一個數據集合實例和一個渲染器實例,并返回嵌入在一個Intent(用于圖表填充一個Activity的情況)或者一個View(當圖表是Activity的一個部分,伴有其他小部件)中想得到的的圖表。
  • 工具——平移和縮放的交互工具。

示例代碼

要使用AChartEngine的API進行編碼開發,你可以下載下面的二進制文件其中一個,添加到你的classpath然后開始編碼吧。

  • 穩定版,當前版本1.0.0可以在這里下載到。
  • 中間版本,發布的候選版本可以在這里下載到。
  • 每日開發版可以在這里下載到。

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個數據點的序列的例子,可以在下面的截圖中看到。

全部代碼在這里可以得到。其中包括用來解釋最重要部分的注釋。

在Android上用AChartEngine輕松繪制圖表

AChartEngine制圖類設計支持通過改變一行代碼來用條形圖表替換成線條圖表。將這句:

mChartView = ChartFactory.getLineChartView(this, mDataset, mRenderer);

替換成下面的代碼,我們將得到一個像下面截圖中的條形圖表。

mChartView = ChartFactory.getBarChartView(this, mDataset, mRenderer, Type.DEFAULT);

在Android上用AChartEngine輕松繪制圖表

也可以替換為下面這句代碼,得到一個散列圖表:

mChartView = ChartFactory.getScatterChartView(this, mDataset, mRenderer);

在Android上用AChartEngine輕松繪制圖表

為了讓上面的例子工作,必須定義一個簡單的布局文件而且需要包含一個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();

產生的圖表應該像下面這樣:

在Android上用AChartEngine輕松繪制圖表

代碼例子包含在官方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/

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!