歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 畫個餅圖 - 在Android App中使用JFreeCharts(DroidCharts)

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

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