在做一個Android app的時候,需要畫一個餅圖,直接用代碼自己畫一個當然也不會太復雜,但畢竟還是應該盡量避免重新發明輪子(有些憤青連這句話也要吐槽,好吧,加上一句,專業制造輪子的除外),在網上找了一圈下來,發現可用的庫寥寥可數,
aiCharts確實不錯,可惜是商業化產品,免費試用的有水印,不太適合用在我的app裡面,最後決定用
DroidCharts,一個
JFreeCharts的Android移植版本
目前DroidCharts已經實現了下面幾種圖:
- pie chart
- line chart
- xy line chart
- bar chart
- category bar chart
可惜文檔資料不太齊全(快2年沒更新了,很可能要太監),不過既然是移植自JFreeCharts,倒也不用擔心使用上的問題,所以我還是選用它
官方網站目前只有源代碼,LinuxIDC.com提供的是已經打好包的庫,
免費下載地址在 http://linux.linuxidc.com/
用戶名與密碼都是www.linuxidc.com
具體下載目錄在 /pub/Android源碼集錦/2011年/11月/畫個餅圖 - 在Android App中使用JFreeCharts(DroidCharts) /
可以下載後作為第三方庫加入app,步驟如下:
- 在工程所在目錄中創建libs子目錄
- 復制DroidCharts.jar到新建的libs目錄下面
- 刷新Package Explorer,libs/DroidCharts.jar
- 打開工程的Java Build Path,選中Libraries選項卡,點擊Add JARs...按鈕,選擇libs/DroidCharts.jar
這時候可能會看到一行錯誤提示:
Error generating final archive: Found duplicate file for APK: res/layout/main.xml
這是因為DroidCharts.jar包裡面已經有layout名字叫main.xml,而當前應用的layout裡面也有main.xml,沒辦法,這種情況下只能把自己的main.xml改個名字了
正常情況下,因為打包了DroidCharts庫,這時候查看apk文件會發現長度增加了幾百K
接下來增加一個PieChartView,繼承自android.view.View
PieChartView.java
- packet your.packet.name;
-
- import net.droidsolutions.droidcharts.awt.Font;
- import net.droidsolutions.droidcharts.awt.Rectangle2D;
- import net.droidsolutions.droidcharts.core.ChartFactory;
- import net.droidsolutions.droidcharts.core.JFreeChart;
- import net.droidsolutions.droidcharts.core.data.DefaultPieDataset;
- import net.droidsolutions.droidcharts.core.data.PieDataset;
- import net.droidsolutions.droidcharts.core.plot.PiePlot;
- import android.content.Context;
- import android.graphics.Canvas;
- import android.graphics.Color;
- import android.graphics.Paint;
- import android.graphics.Rect;
- import android.os.Handler;
- import android.util.AttributeSet;
- import android.view.View;
-
- public class PieChartView extends View {
- /** The view bounds. */
- private final Rect mRect = new Rect();
- /** The user interface thread handler. */
- private final Handler mHandler;
-
- public PieChartView(Context context) {
- this(context, null);
- }
-
- public PieChartView(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
-
- public PieChartView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- mHandler = new Handler();
- }
-
- @Override
- protected void onDraw(Canvas canvas) {
- super.onDraw(canvas);
-
- canvas.getClipBounds(mRect);
-
- final PieDataset dataset = createDataset();
- final JFreeChart chart = createChart(dataset);
- chart.draw(canvas, new Rectangle2D.Double(0, 0, mRect.width(), mRect
- .height()));
- }
-
- /**
- * Schedule a user interface repaint.
- */
- public void repaint() {
- mHandler.post(new Runnable() {
- public void run() {
- invalidate();
- }
- });
- }
-
- private PieDataset createDataset() {
- DefaultPieDataset ds = new DefaultPieDataset();
- ds.setValue("已用空間", 56);
- ds.setValue("占用空間", 18);
- ds.setValue("剩余空間", 32);
- return ds;
- }
-
- private JFreeChart createChart(final PieDataset dataset) {
- // create the chart...
- final JFreeChart chart = ChartFactory.createPieChart(null, dataset, false, false, false);
-
- Paint black = new Paint(Paint.ANTI_ALIAS_FLAG);
- black.setColor(Color.BLACK);
- chart.setBackgroundPaint(black);
- chart.setBorderVisible(false);
-
- Paint color0 = new Paint(Paint.ANTI_ALIAS_FLAG);
- color0.setColor(Color.YELLOW);
- Paint color1 = new Paint(Paint.ANTI_ALIAS_FLAG);
- color1.setColor(Color.BLUE);
- Paint color2 = new Paint(Paint.ANTI_ALIAS_FLAG);
- color2.setColor(Color.GREEN);
-
- final PiePlot plot = (PiePlot)chart.getPlot();
- plot.setBackgroundPaint(black);
- plot.setSectionPaint("已用空間", color0);
- plot.setSectionPaint("占用空間", color1);
- plot.setSectionPaint("剩余空間", color2);
-
- // 設置默認字體
- plot.setLabelFont(new Font());
- // 不顯示文本
- plot.setLabelGenerator(null);
- // 設置開始角度為12點鐘方向
- plot.setStartAngle(-90);
-
- return chart;
- }
- }