`
zhenping
  • 浏览: 83287 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

AChartEngine应用之PieChart(动态饼图,允许产生动态数据并显示)

 
阅读更多

AChartEngine应用之PieChart(动态饼图)

接着上一次写的内容,构建动态饼图,并产生与用户交互,官方的API并没有提供可以借鉴的动态更新饼图的方法,考虑到数据都是活动的,不可能总是用静态数据,所以我下面的demo就是模拟动态数据用饼图显示,过程看起来笨拙一点,但是肯定可以使用的,具体是通过定时器+Handler实现定时任务,通过Handler更新主线程UI,在更新之前要把之前的数据清除掉,否则那些数据都会被加载,最后重新绘制饼图,

构建动态饼图的步骤主要分为以下四步,还需要在项目中引入AChartEngine依赖jar包,在Manifest中添加:<activityandroid:name="org.achartengine.GraphicalActivity" />

1.设置DefaultRenderer

DefaultRenderer mRenderer = new DefaultRenderer();// PieChart的主要描绘器

mRenderer = new DefaultRenderer();// 创建一个描绘器的实例,将被用来创建图表

mRenderer.setZoomButtonsVisible(true);// 显示放大缩小功能按钮

mRenderer.setStartAngle(180);// 设置为水平开始

mRenderer.setDisplayValues(true);// 显示数据

// mRenderer.setFitLegend(false);// 设置是否显示图例

// mRenderer.setLegendTextSize(10);// 设置图例字体大小

// mRenderer.setLegendHeight(10);// 设置图例高度

mRenderer.setShowLegend(false);// 默认是显示的需要关闭,因为动态更新数据的时候,图例更新慢

mRenderer.setChartTitle("饼图示例");// 设置饼图标题

mRenderer.setChartTitleTextSize(14);// 设置饼图标题大小

2.构建数据源CategorySeries

for (int i = 0; i < data.length; i++)

VALUE += data[i];

for (int i = 0; i < data.length; i++) {

mSeries.add("示例 " + (i + 1), data[i] / VALUE);// 设置种类名称和对应的数值,前面是(key,value)键值对

SimpleSeriesRenderer renderer = new SimpleSeriesRenderer();

if (i < COLORS.length) {

renderer.setColor(COLORS[i]);// 设置描绘器的颜色

} else {

renderer.setColor(getRandomColor());// 设置描绘器的颜色

}

renderer.setChartValuesFormat(NumberFormat.getPercentInstance());// 设置百分比

mRenderer.setChartTitleTextSize(14);// 设置饼图标题大小

mRenderer.addSeriesRenderer(renderer);// 将最新的描绘器添加到DefaultRenderer中

}

3.通过ChartFactory获取饼图

mChartView = ChartFactory.getPieChartView(getApplicationContext(),

mSeries, mRenderer);// 构建mChartView

mRenderer.setClickEnabled(true);// 允许点击事件

mChartView.setOnClickListener(new View.OnClickListener() {// 具体内容

}

4.构建定时器任务

handler = new Handler() {// 这里的Handler实例将配合下面的Timer实例,完成定时更新图表的功能

@Override

public void handleMessage(Message msg) {

if (msg.what == 1) {

updateChart();// 刷新图表具体方法 Handler将此并入主线程

}

super.handleMessage(msg);

}

};

task = new TimerTask() {

@Override

public void run() {//通过消息更新

Log.i("task", " task ok ");

Message message = new Message();

message.what = 1;//消息定义标志

handler.sendMessage(message);

}

};

timer.schedule(task, 500, 1000 * 10);//执行任务

效果图:



code:

package com.qiuzhping.achart;

import java.text.NumberFormat;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;

import org.achartengine.ChartFactory;
import org.achartengine.GraphicalView;
import org.achartengine.model.CategorySeries;
import org.achartengine.renderer.DefaultRenderer;
import org.achartengine.renderer.SimpleSeriesRenderer;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.LinearLayout;

/**
 * @项目名称:AChart
 * @类名称:PieChartBuilder
 * @作者:Qiuzhping
 * @时间:2014-1-15下午11:20:48
 * @作用 :构建饼图,并产生与用户交互,官方的API并没有提供可以借鉴的动态更新饼图的方法,
 *     考虑到数据都是活动的,不可能总是用静态数据,所以我下面的demo就是模拟动态数据用饼图显示,过程看起来笨拙一点,但是肯定可以使用的,
 *     具体是通过定时器+Handler实现定时任务,通过Handler更新主线程UI,在更新之前要把之前的数据清除掉,否则那些数据都会被加载,最后
 *     重新绘制饼图
 */
public class PieChartBuilder extends Activity {

	private Timer timer = new Timer();// 设计定时器
	private TimerTask task;// 定时任务
	private Handler handler;// 线程通讯
	private String title = "动态饼图示例";// 饼图标题
	private CategorySeries mSeries;// 饼图数据
	private DefaultRenderer mRenderer;// 饼图描绘器
	private GraphicalView mChartView;// 显示PieChart
	private Context context;
	private double data[] = new double[9];
	private LinearLayout mLinear;// 布局方式
	private int[] COLORS = new int[] { Color.RED, Color.GREEN, Color.BLUE,
			Color.MAGENTA, Color.CYAN, Color.YELLOW, Color.DKGRAY };// 颜色
	private double VALUE = 0;// 总数
	private SimpleSeriesRenderer renderer;// 饼图每块描绘器

	public void back(View v) {
		Log.i("qiuzhping", "back onClick");
		Intent intent = new Intent();
		intent.setClass(PieChartBuilder.this, MainActivity.class);
		startActivity(intent);
		PieChartBuilder.this.finish();
	}

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		context = getApplicationContext();// 获取上下文对象
		setContentView(R.layout.xy_chart);// 设置样式

		mLinear = (LinearLayout) findViewById(R.id.chart);// 获取mLinear布局,下面会把图表画在这个布局里面
		mLinear.setBackgroundColor(Color.BLACK);// 设置背景色

		mRenderer = new DefaultRenderer();// 创建一个描绘器的实例,将被用来创建图表
		mRenderer.setZoomButtonsVisible(true);// 显示放大缩小功能按钮
		mRenderer.setStartAngle(180);// 设置为水平开始
		mRenderer.setDisplayValues(true);// 显示数据
		// mRenderer.setFitLegend(false);// 设置是否显示图例
		// mRenderer.setLegendTextSize(10);// 设置图例字体大小
		// mRenderer.setLegendHeight(10);// 设置图例高度
		mRenderer.setShowLegend(false);// 默认是显示的下载需要关闭,因为动态更新数据的时候,图例更新慢
		mRenderer.setChartTitle(title);// 设置饼图标题
		mRenderer.setChartTitleTextSize(14);// 设置饼图标题大小

		mSeries = new CategorySeries("");

		for (int i = 0; i < 9; i++) {
			Random random = new Random();
			int R = random.nextInt(255);
			Log.i("qiuzhping", "Random R=" + R);
			data[i] = R;
			VALUE += data[i];// 总的数据大小
		}
		for (int i = 0; i < data.length; i++) {
			mSeries.add("示例 " + (i + 1), data[i] / VALUE);// 设置种类名称和对应的数值,前面是(key,value)键值对
			renderer = new SimpleSeriesRenderer();
			if (i < COLORS.length) {
				renderer.setColor(COLORS[i]);// 设置描绘器的颜色
			} else {
				renderer.setColor(getRandomColor());// 设置描绘器的颜色
			}
			renderer.setChartValuesFormat(NumberFormat.getPercentInstance());// 设置百分比
			mRenderer.addSeriesRenderer(renderer);// 将最新的描绘器添加到DefaultRenderer中
		}

		mChartView = ChartFactory.getPieChartView(context, mSeries, mRenderer);// 构建mChartView

		mLinear.addView(mChartView, new LayoutParams(LayoutParams.FILL_PARENT,
				LayoutParams.FILL_PARENT));

		handler = new Handler() {// 这里的Handler实例将配合下面的Timer实例,完成定时更新图表的功能
			@Override
			public void handleMessage(Message msg) {
				if (msg.what == 1) {
					updateChart();// 刷新图表具体方法 Handler将此并入主线程
				}
				super.handleMessage(msg);
			}
		};
		task = new TimerTask() {
			@Override
			public void run() {// 通过消息更新
				Log.i("task", " task ok ");
				Message message = new Message();
				message.what = 1;// 消息定义标志
				handler.sendMessage(message);
			}
		};

		timer.schedule(task, 500, 1000 * 10);// 执行任务
	}

	@Override
	public void onDestroy() {// 当结束程序时关掉Timer
		if (timer != null) {
			timer.cancel();
			Log.i("qiuzhping", "onDestroy timer cancel ");
		}
		super.onDestroy();
	}

	private void updateChart() {
		Log.i("qiuzhping", "updateChart ok");
		mSeries.clear();
		VALUE = 0;// 初始化
		// mRenderer.removeAllRenderers();
		for (int i = 0; i < 9; i++) {// 产生动态数据,实际项目中可以通过Web Service
										// 获取数据,不过这个内容应该放在线程上搞,太耗时了
			Random random = new Random();
			int R = random.nextInt(255);
			Log.i("qiuzhping", "Random R=" + R);
			data[i] = R;
			VALUE += data[i];// 总的数据大小
		}
		for (int i = 0; i < data.length; i++) {
			mSeries.add("示例 " + (i + 1), data[i] / VALUE);// 设置种类名称和对应的数值,前面是(key,value)键值对
			renderer = new SimpleSeriesRenderer();
			if (i < COLORS.length) {
				renderer.setColor(COLORS[i]);// 设置描绘器的颜色
			} else {
				renderer.setColor(getRandomColor());// 设置描绘器的颜色
			}
			renderer.setChartValuesFormat(NumberFormat.getPercentInstance());// 设置百分比

			mRenderer.addSeriesRenderer(renderer);// 将最新的描绘器添加到DefaultRenderer中
		}
		mChartView.repaint();
	}

	private int getRandomColor() {// 分别产生RBG数值
		Random random = new Random();
		int R = random.nextInt(255);
		int G = random.nextInt(255);
		int B = random.nextInt(255);
		return Color.rgb(R, G, B);
	}
}

如果有哪位朋友想到更合适的方法,可以一起研究研究。。。。

完整项目:http://download.csdn.net/detail/qiu_11/18370487

未完待续。。。。

AChartEngine应用系列文章

(一)AChartEngine简介

(二)AChartEngine应用之PieChart(饼图)

(三)AChartEngine应用之BarChart(柱形图)

(四)AChartEngine应用之PieChart(动态饼图,允许产生动态数据并显示)

(五)AChartEngine应用之LineChart(模拟生命特征值图)

(六)AChartEngine应用之LineChart(模拟三角函数sin,cos)

(七)AChartEngine高级应用CombinedXYChart(组合统计图)









分享到:
评论

相关推荐

    AChartEngine应用之PieChart(饼图)

    构建饼图的步骤主要分为以下三步,还需要在项目中引入AChartEngine依赖jar包,在Manifest中添加:&lt;activity android:name="org.achartengine.GraphicalActivity" /&gt;

    Achartengine0.6-Demo

    通过这个Demo项目,开发者可以学习到如何在Android应用中导入和使用AChartEngine库,理解数据模型的构建,以及如何动态地更新和交互图表。此外,还可以学习如何自定义图表样式,如改变颜色、添加网格线、设置轴标签...

    Achartengine Demo

    Achartengine允许我们使用XYSeries或CategorySeries对象来存储数据,这些对象可以容纳一系列数值,并与图表的X轴和Y轴对应。 3. **绘图引擎**:使用Render类进行图表的渲染,例如LineRenderer、PieRenderer和...

    AChartEngine源码

    同时,`XYValueFormatter`和`XAxisValueFormatter`等接口允许自定义数据显示格式。 - **渲染器设置**:`XYMultipleSeriesRenderer`是图表的主要渲染器,包含了一系列可配置的属性,如轴标签、网格线、图例等。通过`...

    achartengine-1.1.0-demo(android绘图开源库demo)

    1. **图表类型**:AChartEngine提供多种图表类型,如LineChart(折线图)、BarChart(柱状图)、PieChart(饼图)等,每种图表都有其独特的应用场景。 2. **数据系列**:数据系列是图表的基础,由一系列数据点组成...

    android 饼图API

    - **创建饼图**:在布局文件中添加`PieChart`视图,然后在代码中初始化并设置数据。 - **创建数据集**:创建` PieDataSet`对象,传入一系列的值和对应的标签。 - **设置颜色**:可以使用`setColors()`方法来指定...

    android条形图 饼图 曲线图 例子详细 可以直接用 包含achartengine的jar包

    首先,AChartEngine是一个开源的Android图表库,它提供了丰富的图表类型,包括柱状图(BarChart)、饼图(PieChart)和曲线图(LineChart)等,适用于数据分析和展示。在提供的压缩包中,包含`.classpath`、`....

    Achartengine趋势图demo

    5. **动态更新**:Achartengine支持动态更新图表,这意味着你可以随时添加、修改或删除数据,图表会实时反映出这些变化。 6. **注释与标签**:在图表上添加注释和标签可以增强信息的传达。Achartengine允许你在图表...

    Android高级应用源码-里面有曲线图 折线图 双曲线图 柱形图 饼图,在achartengine 的基础上 更改了一些颜色

    本资源提供了一个基于AChartEngine库的高级应用源码,允许开发者自定义颜色以适应不同的设计需求。 AChartEngine是一个开源的Android图表库,它提供了多种类型的图表,包括线性图(LineChart)、散点图(Scatter...

    AchartEngine.jar包

    **AchartEngine.jar包**是专门为Android平台设计的一个开源图表库,它允许开发者轻松地在Android应用中集成各种图表类型,如报表、饼图、曲线图等。这个库的出现,极大地简化了Android应用程序中数据可视化的过程,...

    achartengine1.2.0类库源文件

    AChartEngine是一个强大的开源图表库,专为Android应用程序设计,用于创建各种类型的图表,如折线图、柱状图、饼图等。这个类库在版本1.2.0中提供了丰富的功能,允许开发者轻松地在他们的应用中集成数据可视化元素。...

    AChartEngine 示例程序 文档 JAR包

    6. **集成到应用**:通过调用AChartEngine提供的API,开发者可以轻松地在Android应用中嵌入图表,如在Activity、Fragment中显示,或者在自定义View中使用。 配合配套的博客讲解...

    achartengine 1.1.0 jar和demo

    AChartEngine是一个强大的开源图表库,专为Android平台设计,用于快速轻松地在应用程序中创建各种图表和图形。1.1.0版本是这个库的一个重要里程碑,它提供了丰富的功能和改进,使得开发者能够更加灵活地展示数据。 ...

    achartengine demo

    AChartEngine是一个开源的Java库,专为Android平台设计,用于创建各种图表,如线图、柱状图、饼图、散点图等。这个"achartengine demo"是官方提供的示例代码,包含了多种图表的展示和交互功能,旨在帮助开发者更好地...

    achartengine.jar包h

    - **饼图(PieChart)**:用于显示各项占比关系,每个扇区代表一个数据项。 - **折线图(LineChart)**:适合展示趋势变化,通过线条连接各个数据点。 - **柱状图(BarChart)**:展示各组数据的数值大小,以垂直或...

    android achartengine 最新demo

    除了这些基本的图表类型,`ACHartEngine`还支持动态更新图表,例如实时数据显示、动画效果等。此外,它还可以导出图表为图像文件,方便在其他地方使用。 为了更好地理解`ACHartEngine`的工作原理,`achartengine-...

    android 图表引擎AChartEngine

    **Android图表引擎AChartEngine详解** AChartEngine是一款强大的开源库,专为Android平台设计,用于创建各种类型的图表,如柱状图、...通过熟练掌握AChartEngine,你可以快速地将数据可视化融入到你的Android应用中。

    andorid-饼图&柱状图.rar

    本资源包“android-饼图&柱状图.rar”提供了Android平台上实现饼图和柱状图的功能,这对于创建数据驱动的应用或者数据分析界面非常有用。下面我们将详细探讨这两种图表在Android开发中的应用和实现方式。 首先,...

    Achartengine1.0.0jar包源码

    在1.0.0版本中,它提供了多种图表类型,包括折线图、柱状图、饼图、散点图等,使得开发者可以将丰富的数据可视化集成到他们的应用程序中。这个"Achartengine1.0.0.jar"包包含了该库的源代码,对于学习如何在Android...

    achartengine表格-带中文源码

    AChartEngine是一个强大的开源图表库,适用于Android平台,它允许开发者轻松地在应用程序中创建各种图表,如折线图、柱状图、饼图等。这个"achartengine表格-带中文源码"的资源提供了AChartEngine的源代码,并且源码...

Global site tag (gtag.js) - Google Analytics