[Android]Android achartengine统计图

 

原文链接:http://blog.csdn.net/closewbq/article/details/6589547

最近在安卓2.2上写个实时的监控程序,要用到统计图。从网上搜了下

Java4Less (http://java4less.com/charts/chart.php?info=android)    
- Chart4J (http://code.google.com/p/charts4j/)    
- BlueChart (http://code.google.com/p/bluechart/)- aChartEngine (http://code.google.com/p/achartengine/)    
- aiCharts (http://www.artfulbits.com/Android/aiCharts.aspx)

主要有以上几种。

java4Less统计的图的形状还算好看,但是如果屏幕分辨率很小的时候,不能进行缩放。

aChartEngine这个东西api太过于简单,支持的东西也太少,但是可以进行缩放。

aiCharts 这个东东做的比较好,基本达到了.net中Chart控件的水平,可是要收费。用试用版的话,还要给你带个试用的标记。(这个垃圾- -!)

最终决定用aChartEngine进行统计。

 

我想说的是不是如何去使用aChartEngine画图,而是想说说我碰到的问题。

以上是aChartEngine-6.0所有的类

[Android]Android achartengine统计图_第1张图片

如果你想X轴显示时间并且要画的长方形图的话,那么麻烦来了。X轴如果想要显示时间的话,要使用TimeChart,而TimeChart继承与LineChart,也就是说,TimeChart只能显示线性的统计图。my god!这什么东西呀,做的也太不行了吧,我顿时就恼火了。那我X轴既要显示时间,又要显示长方形图怎么办?以下是我的解决方案。

如果想要显示长方形图,我们只能采用BarChart了,所以只能在它上面动手脚。

以下是我做的例子,供碰到同样的问题的鞋子们参考:

期望功能:以长方形图显示31天内的数据信息。

view plain copy to clipboard print ?
  1. import java.util.Calendar;  
  2. import java.util.List;  
  3. import java.util.Map;  
  4. import java.util.TreeMap;  
  5. import org.achartengine.ChartFactory;  
  6. import org.achartengine.chart.BarChart.Type;  
  7. import org.achartengine.model.CategorySeries;  
  8. import org.achartengine.model.XYMultipleSeriesDataset;  
  9. import org.achartengine.renderer.XYMultipleSeriesRenderer;  
  10. import org.achartengine.renderer.XYSeriesRenderer;  
  11.   
  12. import android.content.Context;  
  13. import android.content.Intent;  
  14. import android.graphics.Color;  
  15.   
  16. public class Recent31DayActivity {  
  17.   
  18.     private static Map<String, Double> map = new TreeMap<String, Double>();  
  19.   
  20.     private static XYMultipleSeriesRenderer getBarDemoRenderer() {  
  21.         XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer();  
  22.         renderer.setAxisTitleTextSize(12);  
  23.         renderer.setChartTitleTextSize(12);  
  24.         renderer.setLabelsTextSize(12);  
  25.         renderer.setLegendTextSize(12);  
  26.         renderer.setMargins(new int[] { 2030150 });  
  27.         XYSeriesRenderer r = new XYSeriesRenderer();  
  28.         r.setColor(Color.RED);  
  29.         renderer.addSeriesRenderer(r);  
  30.         return renderer;  
  31.     }  
  32.   
  33.     private static void setChartSettings(XYMultipleSeriesRenderer renderer) {  
  34.         renderer.setChartTitle("最近31天");  
  35.         renderer.setXTitle("时间-天");  
  36.         renderer.setYTitle("发电量(Kw/h)");  
  37.         renderer.setYAxisMin(0);  
  38.         renderer.setXAxisMin(0.5);  
  39.         renderer.setXAxisMax(12.5);  
  40.         renderer.setShowLegend(false);  
  41.         renderer.setShowLabels(true);  
  42.         renderer.setShowGrid(true);  
  43.         renderer.setXLabels(1);  
  44.         renderer.setDisplayChartValues(true);  
  45.         renderer.setBarSpacing(0.5);  
  46.         renderer.setBackgroundColor(Color.WHITE);  
  47.     }  
  48.   
  49.     private static XYMultipleSeriesDataset getBarDataset(Context cxt) {  
  50.         XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();  
  51.         CategorySeries series = new CategorySeries("最近31天");        Calendar c = Calendar.getInstance();  
  52.         int month = c.get(Calendar.DAY_OF_MONTH)+1;  
  53.         int day =c.get(Calendar.DAY_OF_MONTH);  
  54.         map.put((month<10?("0"+month):month) + "-"  
  55.                 + (day<10?("0"+day):day), 0.0);  
  56.         for (int i = 0; i <= 30; i++) {  
  57.             c.add(Calendar.DAY_OF_YEAR, -1);  
  58.             day=c.get(Calendar.DAY_OF_MONTH);  
  59.             month=c.get(Calendar.MONTH) + 1;  
  60.             map.put((month<10?("0"+month):month) + "-"  
  61.                     + (day<10?("0"+day):day), 0.0);  
  62.         }  
<textarea style="DISPLAY: none" class="java" readonly="readonly" name="code">import java.util.Calendar; import java.util.List; import java.util.Map; import java.util.TreeMap; import org.achartengine.ChartFactory; import org.achartengine.chart.BarChart.Type; import org.achartengine.model.CategorySeries; import org.achartengine.model.XYMultipleSeriesDataset; import org.achartengine.renderer.XYMultipleSeriesRenderer; import org.achartengine.renderer.XYSeriesRenderer; import android.content.Context; import android.content.Intent; import android.graphics.Color; public class Recent31DayActivity { private static Map&lt;String, Double&gt; map = new TreeMap&lt;String, Double&gt;(); private static XYMultipleSeriesRenderer getBarDemoRenderer() { XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer(); renderer.setAxisTitleTextSize(12); renderer.setChartTitleTextSize(12); renderer.setLabelsTextSize(12); renderer.setLegendTextSize(12); renderer.setMargins(new int[] { 20, 30, 15, 0 }); XYSeriesRenderer r = new XYSeriesRenderer(); r.setColor(Color.RED); renderer.addSeriesRenderer(r); return renderer; } private static void setChartSettings(XYMultipleSeriesRenderer renderer) { renderer.setChartTitle(&quot;最近31天&quot;); renderer.setXTitle(&quot;时间-天&quot;); renderer.setYTitle(&quot;发电量(Kw/h)&quot;); renderer.setYAxisMin(0); renderer.setXAxisMin(0.5); renderer.setXAxisMax(12.5); renderer.setShowLegend(false); renderer.setShowLabels(true); renderer.setShowGrid(true); renderer.setXLabels(1); renderer.setDisplayChartValues(true); renderer.setBarSpacing(0.5); renderer.setBackgroundColor(Color.WHITE); } private static XYMultipleSeriesDataset getBarDataset(Context cxt) { XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset(); CategorySeries series = new CategorySeries(&quot;最近31天&quot;); Calendar c = Calendar.getInstance(); int month = c.get(Calendar.DAY_OF_MONTH)+1; int day =c.get(Calendar.DAY_OF_MONTH); map.put((month&lt;10?(&quot;0&quot;+month):month) + &quot;-&quot; + (day&lt;10?(&quot;0&quot;+day):day), 0.0); for (int i = 0; i &lt;= 30; i++) { c.add(Calendar.DAY_OF_YEAR, -1); day=c.get(Calendar.DAY_OF_MONTH); month=c.get(Calendar.MONTH) + 1; map.put((month&lt;10?(&quot;0&quot;+month):month) + &quot;-&quot; + (day&lt;10?(&quot;0&quot;+day):day), 0.0); } </textarea>
view plain copy to clipboard print ?
  1. //这里的list是我取出一个对象列表,自己可以找别的数据代替  
<textarea style="DISPLAY: none" class="java" readonly="readonly" name="code"> //这里的list是我取出一个对象列表,自己可以找别的数据代替</textarea>
view plain copy to clipboard print ?
  1.                 if (list != null && list.size() > 0) {  
  2.         for (int i = 0; i < list.size(); i++) {  
  3.             if (map.containsKey(key)) {  
  4.                 map.put(key, min.getElectricalEnergy());  
  5.             }  
  6.         }  
  7.     }  
  8.     for (String key : map.keySet()) {  
  9.         series.add(key, Utils.getDoublePointTwo(map.get(key)));  
  10.     }  
  11.     dataset.addSeries(series.toXYSeries());  
  12.     return dataset;  
  13. }  
  14.   
  15. public Intent Recent31DayActivity(Context context) {  
  16.     XYMultipleSeriesRenderer renderer = getBarDemoRenderer();  
  17.     setChartSettings(renderer);  
  18.     Intent intent = ChartFactory.getBarChartIntent(context,  
  19.             getBarDataset(context), renderer, Type.DEFAULT);  
  20.     int count = 1;  
<textarea style="DISPLAY: none" class="java" readonly="readonly" name="code"> if (list != null &amp;&amp; list.size() &gt; 0) { for (int i = 0; i &lt; list.size(); i++) { if (map.containsKey(key)) { map.put(key, min.getElectricalEnergy()); } } } for (String key : map.keySet()) { series.add(key, Utils.getDoublePointTwo(map.get(key))); } dataset.addSeries(series.toXYSeries()); return dataset; } public Intent Recent31DayActivity(Context context) { XYMultipleSeriesRenderer renderer = getBarDemoRenderer(); setChartSettings(renderer); Intent intent = ChartFactory.getBarChartIntent(context, getBarDataset(context), renderer, Type.DEFAULT); int count = 1;</textarea>
view plain copy to clipboard print ?
  1. //这里比较重要,这里手动给X轴填刻度。有多少条内容,你就要天多少个刻度,这样X轴就显示的是时间,也能显示出长方形图  
<textarea style="DISPLAY: none" class="java" readonly="readonly" name="code">//这里比较重要,这里手动给X轴填刻度。有多少条内容,你就要天多少个刻度,这样X轴就显示的是时间,也能显示出长方形图</textarea>
view plain copy to clipboard print ?
  1.               for (String key : map.keySet()) {  
  2.     renderer.addTextLabel(count, key);  
  3.     count++;  
  4. }  
  5. return intent;  
<textarea style="DISPLAY: none" class="java" readonly="readonly" name="code"> for (String key : map.keySet()) { renderer.addTextLabel(count, key); count++; } return intent; } </textarea>
view plain copy to clipboard print ?
  1. <blockquote>}</blockquote>  
<textarea style="DISPLAY: none" class="java" readonly="readonly" name="code">&lt;blockquote&gt;}&lt;/blockquote&gt;</textarea>


[Android]Android achartengine统计图_第2张图片

如果大家有什么不明白的话,或者对属性设置不明白的话,可以问我。不过这东西api就那么几个类,看api文档就够了。

你可能感兴趣的:(android,list,api,calendar,less,dataset)