Android achartengine统计图

本文探讨在Android 2.2上使用aChartEngine库创建实时监控程序时遇到的问题,尤其是如何在时间轴上显示统计图。虽然aChartEngine API简单且功能有限,但因其支持缩放而被选用。作者分享了在X轴显示时间并绘制矩形图时遇到的挑战,因为TimeChart仅支持线性图。解决方案是通过修改BarChart来实现所需功能,提供了一个31天内数据的长方形图示例,并鼓励有类似问题的开发者参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在安卓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所有的类

如果你想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<String, Double> map = new TreeMap<String, Double>();

	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;
	}

   
   
}


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

评论 49
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值