利用 Android achartengine 實現統計圖

fmms 14年前發布 | 47K 次閱讀 Android Android開發 移動開發

最近在安卓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 achartengine 實現統計圖

如 果你想X軸顯示時間并且要畫的長方形圖的話,那么麻煩來了。X軸如果想要顯示時間的話,要使用TimeChart,而TimeChart繼承與 LineChart,也就是說,TimeChart只能顯示線性的統計圖。my god!這什么東西呀,做的也太不行了吧,我頓時就惱火了。那我X軸既要顯示時間,又要顯示長方形圖怎么辦?以下是我的解決方案。

如果想要顯示長方形圖,我們只能采用BarChart了,所以只能在它上面動手腳。

以下是我做的例子,供碰到同樣的問題的鞋子們參考:

期望功能:以長方形圖顯示31天內的數據信息。

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




   




     map = new TreeMap




    




     ();

    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("最近31天");
        renderer.setXTitle("時間-天");
        renderer.setYTitle("發電量(Kw/h)");
        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("最近31天");      
                Calendar c = Calendar.getInstance();
        int month = c.get(Calendar.DAY_OF_MONTH)+1;
        int day =c.get(Calendar.DAY_OF_MONTH);
        map.put((month<10?("0"+month):month) + "-"
                + (day<10?("0"+day):day), 0.0);
        for (int i = 0; i <= 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<10?("0"+month):month) + "-"
                    + (day<10?("0"+day):day), 0.0);
        }

             //這里的list是我取出一個對象列表,自己可以找別的數據代替               
                if (list != null && list.size() > 0) {
            for (int i = 0; i < 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;
//這里比較重要,這里手動給X軸填刻度。有多少條內容,你就要天多少個刻度,這樣X軸就顯示的是時間,也能顯示出長方形圖
        for (String key : map.keySet()) {
            renderer.addTextLabel(count, key);
            count++;
        }
        return intent;
    }
}




    




   


利用 Android achartengine 實現統計圖

如果大家有什么不明白的話,或者對屬性設置不明白的話,可以問我。不過這東西api就那么幾個類,看api文檔就夠了。

 本文由用戶 fmms 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!