歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

畫個餅圖 - 在Android App中使用JFreeCharts(DroidCharts)

在做一個Android app的時候,需要畫一個餅圖,直接用代碼自己畫一個當然也不會太復雜,但畢竟還是應該盡量避免重新發明輪子(有些憤青連這句話也要吐槽,好吧,加上一句,專業制造輪子的除外),在網上找了一圈下來,發現可用的庫寥寥可數,aiCharts確實不錯,可惜是商業化產品,免費試用的有水印,不太適合用在我的app裡面,最後決定用DroidCharts,一個JFreeCharts的Android移植版本 

目前DroidCharts已經實現了下面幾種圖:

  1. pie chart
  2. line chart
  3. xy line chart
  4. bar chart
  5. category bar chart

可惜文檔資料不太齊全(快2年沒更新了,很可能要太監),不過既然是移植自JFreeCharts,倒也不用擔心使用上的問題,所以我還是選用它 

官方網站目前只有源代碼,LinuxIDC.com提供的是已經打好包的庫,

免費下載地址在 http://linux.linuxidc.com/

用戶名與密碼都是www.linuxidc.com

具體下載目錄在 /pub/Android源碼集錦/2011年/11月/畫個餅圖 - 在Android App中使用JFreeCharts(DroidCharts) /

可以下載後作為第三方庫加入app,步驟如下:

  1. 在工程所在目錄中創建libs子目錄
  2. 復制DroidCharts.jar到新建的libs目錄下面
  3. 刷新Package Explorer,libs/DroidCharts.jar
  4. 打開工程的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

  1. packet your.packet.name;  
  2.   
  3. import net.droidsolutions.droidcharts.awt.Font;  
  4. import net.droidsolutions.droidcharts.awt.Rectangle2D;  
  5. import net.droidsolutions.droidcharts.core.ChartFactory;  
  6. import net.droidsolutions.droidcharts.core.JFreeChart;  
  7. import net.droidsolutions.droidcharts.core.data.DefaultPieDataset;  
  8. import net.droidsolutions.droidcharts.core.data.PieDataset;  
  9. import net.droidsolutions.droidcharts.core.plot.PiePlot;  
  10. import android.content.Context;  
  11. import android.graphics.Canvas;  
  12. import android.graphics.Color;  
  13. import android.graphics.Paint;  
  14. import android.graphics.Rect;  
  15. import android.os.Handler;  
  16. import android.util.AttributeSet;  
  17. import android.view.View;  
  18.   
  19. public class PieChartView extends View {  
  20.     /** The view bounds. */  
  21.     private final Rect mRect = new Rect();  
  22.     /** The user interface thread handler. */  
  23.     private final Handler mHandler;  
  24.   
  25.     public PieChartView(Context context) {  
  26.         this(context, null);  
  27.     }  
  28.       
  29.     public PieChartView(Context context, AttributeSet attrs) {  
  30.         this(context, attrs, 0);  
  31.     }  
  32.       
  33.     public PieChartView(Context context, AttributeSet attrs, int defStyle) {  
  34.         super(context, attrs, defStyle);  
  35.         mHandler = new Handler();  
  36.     }  
  37.   
  38.     @Override  
  39.     protected void onDraw(Canvas canvas) {  
  40.         super.onDraw(canvas);  
  41.           
  42.         canvas.getClipBounds(mRect);  
  43.   
  44.         final PieDataset dataset = createDataset();  
  45.         final JFreeChart chart = createChart(dataset);  
  46.         chart.draw(canvas, new Rectangle2D.Double(00, mRect.width(), mRect  
  47.                 .height()));  
  48.     }  
  49.   
  50.     /** 
  51.      * Schedule a user interface repaint. 
  52.      */  
  53.     public void repaint() {  
  54.         mHandler.post(new Runnable() {  
  55.             public void run() {  
  56.                 invalidate();  
  57.             }  
  58.         });  
  59.     }  
  60.   
  61.     private PieDataset createDataset() {  
  62.         DefaultPieDataset ds = new DefaultPieDataset();  
  63.         ds.setValue("已用空間"56);  
  64.         ds.setValue("占用空間"18);  
  65.         ds.setValue("剩余空間"32);  
  66.         return ds;  
  67.     }  
  68.   
  69.     private JFreeChart createChart(final PieDataset dataset) {  
  70.         // create the chart...   
  71.         final JFreeChart chart = ChartFactory.createPieChart(null, dataset, falsefalsefalse);  
  72.   
  73.         Paint black = new Paint(Paint.ANTI_ALIAS_FLAG);  
  74.         black.setColor(Color.BLACK);  
  75.         chart.setBackgroundPaint(black);  
  76.         chart.setBorderVisible(false);  
  77.   
  78.         Paint color0 = new Paint(Paint.ANTI_ALIAS_FLAG);  
  79.         color0.setColor(Color.YELLOW);  
  80.         Paint color1 = new Paint(Paint.ANTI_ALIAS_FLAG);  
  81.         color1.setColor(Color.BLUE);  
  82.         Paint color2 = new Paint(Paint.ANTI_ALIAS_FLAG);  
  83.         color2.setColor(Color.GREEN);         
  84.           
  85.         final PiePlot plot = (PiePlot)chart.getPlot();  
  86.         plot.setBackgroundPaint(black);  
  87.         plot.setSectionPaint("已用空間", color0);  
  88.         plot.setSectionPaint("占用空間", color1);  
  89.         plot.setSectionPaint("剩余空間", color2);  
  90.           
  91.         // 設置默認字體   
  92.         plot.setLabelFont(new Font());        
  93.         // 不顯示文本   
  94.         plot.setLabelGenerator(null);  
  95.         // 設置開始角度為12點鐘方向   
  96.         plot.setStartAngle(-90);  
  97.           
  98.         return chart;  
  99.     }  
  100. }  
Copyright © Linux教程網 All Rights Reserved