画个饼图 - 在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.bkjia.com/

用户名与密码都是www.bkjia.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. }  
  • 1
  • 2
  • 下一页

相关内容