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:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package com.qiuzhping.achart;  
  2.   
  3. import java.text.NumberFormat;  
  4. import java.util.Random;  
  5. import java.util.Timer;  
  6. import java.util.TimerTask;  
  7.   
  8. import org.achartengine.ChartFactory;  
  9. import org.achartengine.GraphicalView;  
  10. import org.achartengine.model.CategorySeries;  
  11. import org.achartengine.renderer.DefaultRenderer;  
  12. import org.achartengine.renderer.SimpleSeriesRenderer;  
  13.   
  14. import android.app.Activity;  
  15. import android.content.Context;  
  16. import android.content.Intent;  
  17. import android.graphics.Color;  
  18. import android.os.Bundle;  
  19. import android.os.Handler;  
  20. import android.os.Message;  
  21. import android.util.Log;  
  22. import android.view.View;  
  23. import android.view.ViewGroup.LayoutParams;  
  24. import android.widget.LinearLayout;  
  25.   
  26. /** 
  27.  * @项目名称:AChart 
  28.  * @类名称:PieChartBuilder 
  29.  * @作者:Qiuzhping 
  30.  * @时间:2014-1-15下午11:20:48 
  31.  * @作用 :构建饼图,并产生与用户交互,官方的API并没有提供可以借鉴的动态更新饼图的方法, 
  32.  *     考虑到数据都是活动的,不可能总是用静态数据,所以我下面的demo就是模拟动态数据用饼图显示,过程看起来笨拙一点,但是肯定可以使用的, 
  33.  *     具体是通过定时器+Handler实现定时任务,通过Handler更新主线程UI,在更新之前要把之前的数据清除掉,否则那些数据都会被加载,最后 
  34.  *     重新绘制饼图 
  35.  */  
  36. public class PieChartBuilder extends Activity {  
  37.   
  38.     private Timer timer = new Timer();// 设计定时器  
  39.     private TimerTask task;// 定时任务  
  40.     private Handler handler;// 线程通讯  
  41.     private String title = "动态饼图示例";// 饼图标题  
  42.     private CategorySeries mSeries;// 饼图数据  
  43.     private DefaultRenderer mRenderer;// 饼图描绘器  
  44.     private GraphicalView mChartView;// 显示PieChart  
  45.     private Context context;  
  46.     private double data[] = new double[9];  
  47.     private LinearLayout mLinear;// 布局方式  
  48.     private int[] COLORS = new int[] { Color.RED, Color.GREEN, Color.BLUE,  
  49.             Color.MAGENTA, Color.CYAN, Color.YELLOW, Color.DKGRAY };// 颜色  
  50.     private double VALUE = 0;// 总数  
  51.     private SimpleSeriesRenderer renderer;// 饼图每块描绘器  
  52.   
  53.     public void back(View v) {  
  54.         Log.i("qiuzhping""back onClick");  
  55.         Intent intent = new Intent();  
  56.         intent.setClass(PieChartBuilder.this, MainActivity.class);  
  57.         startActivity(intent);  
  58.         PieChartBuilder.this.finish();  
  59.     }  
  60.   
  61.     @Override  
  62.     protected void onCreate(Bundle savedInstanceState) {  
  63.         super.onCreate(savedInstanceState);  
  64.         context = getApplicationContext();// 获取上下文对象  
  65.         setContentView(R.layout.xy_chart);// 设置样式  
  66.   
  67.         mLinear = (LinearLayout) findViewById(R.id.chart);// 获取mLinear布局,下面会把图表画在这个布局里面  
  68.         mLinear.setBackgroundColor(Color.BLACK);// 设置背景色  
  69.   
  70.         mRenderer = new DefaultRenderer();// 创建一个描绘器的实例,将被用来创建图表  
  71.         mRenderer.setZoomButtonsVisible(true);// 显示放大缩小功能按钮  
  72.         mRenderer.setStartAngle(180);// 设置为水平开始  
  73.         mRenderer.setDisplayValues(true);// 显示数据  
  74.         // mRenderer.setFitLegend(false);// 设置是否显示图例  
  75.         // mRenderer.setLegendTextSize(10);// 设置图例字体大小  
  76.         // mRenderer.setLegendHeight(10);// 设置图例高度  
  77.         mRenderer.setShowLegend(false);// 默认是显示的下载需要关闭,因为动态更新数据的时候,图例更新慢  
  78.         mRenderer.setChartTitle(title);// 设置饼图标题  
  79.         mRenderer.setChartTitleTextSize(14);// 设置饼图标题大小  
  80.   
  81.         mSeries = new CategorySeries("");  
  82.   
  83.         for (int i = 0; i < 9; i++) {  
  84.             Random random = new Random();  
  85.             int R = random.nextInt(255);  
  86.             Log.i("qiuzhping""Random R=" + R);  
  87.             data[i] = R;  
  88.             VALUE += data[i];// 总的数据大小  
  89.         }  
  90.         for (int i = 0; i < data.length; i++) {  
  91.             mSeries.add("示例 " + (i + 1), data[i] / VALUE);// 设置种类名称和对应的数值,前面是(key,value)键值对  
  92.             renderer = new SimpleSeriesRenderer();  
  93.             if (i < COLORS.length) {  
  94.                 renderer.setColor(COLORS[i]);// 设置描绘器的颜色  
  95.             } else {  
  96.                 renderer.setColor(getRandomColor());// 设置描绘器的颜色  
  97.             }  
  98.             renderer.setChartValuesFormat(NumberFormat.getPercentInstance());// 设置百分比  
  99.             mRenderer.addSeriesRenderer(renderer);// 将最新的描绘器添加到DefaultRenderer中  
  100.         }  
  101.   
  102.         mChartView = ChartFactory.getPieChartView(context, mSeries, mRenderer);// 构建mChartView  
  103.   
  104.         mLinear.addView(mChartView, new LayoutParams(LayoutParams.FILL_PARENT,  
  105.                 LayoutParams.FILL_PARENT));  
  106.   
  107.         handler = new Handler() {// 这里的Handler实例将配合下面的Timer实例,完成定时更新图表的功能  
  108.             @Override  
  109.             public void handleMessage(Message msg) {  
  110.                 if (msg.what == 1) {  
  111.                     updateChart();// 刷新图表具体方法 Handler将此并入主线程  
  112.                 }  
  113.                 super.handleMessage(msg);  
  114.             }  
  115.         };  
  116.         task = new TimerTask() {  
  117.             @Override  
  118.             public void run() {// 通过消息更新  
  119.                 Log.i("task"" task ok ");  
  120.                 Message message = new Message();  
  121.                 message.what = 1;// 消息定义标志  
  122.                 handler.sendMessage(message);  
  123.             }  
  124.         };  
  125.   
  126.         timer.schedule(task, 5001000 * 10);// 执行任务  
  127.     }  
  128.   
  129.     @Override  
  130.     public void onDestroy() {// 当结束程序时关掉Timer  
  131.         if (timer != null) {  
  132.             timer.cancel();  
  133.             Log.i("qiuzhping""onDestroy timer cancel ");  
  134.         }  
  135.         super.onDestroy();  
  136.     }  
  137.   
  138.     private void updateChart() {  
  139.         Log.i("qiuzhping""updateChart ok");  
  140.         mSeries.clear();  
  141.         VALUE = 0;// 初始化  
  142.         // mRenderer.removeAllRenderers();  
  143.         for (int i = 0; i < 9; i++) {// 产生动态数据,实际项目中可以通过Web Service  
  144.                                         // 获取数据,不过这个内容应该放在线程上搞,太耗时了  
  145.             Random random = new Random();  
  146.             int R = random.nextInt(255);  
  147.             Log.i("qiuzhping""Random R=" + R);  
  148.             data[i] = R;  
  149.             VALUE += data[i];// 总的数据大小  
  150.         }  
  151.         for (int i = 0; i < data.length; i++) {  
  152.             mSeries.add("示例 " + (i + 1), data[i] / VALUE);// 设置种类名称和对应的数值,前面是(key,value)键值对  
  153.             renderer = new SimpleSeriesRenderer();  
  154.             if (i < COLORS.length) {  
  155.                 renderer.setColor(COLORS[i]);// 设置描绘器的颜色  
  156.             } else {  
  157.                 renderer.setColor(getRandomColor());// 设置描绘器的颜色  
  158.             }  
  159.             renderer.setChartValuesFormat(NumberFormat.getPercentInstance());// 设置百分比  
  160.   
  161.             mRenderer.addSeriesRenderer(renderer);// 将最新的描绘器添加到DefaultRenderer中  
  162.         }  
  163.         mChartView.repaint();  
  164.     }  
  165.   
  166.     private int getRandomColor() {// 分别产生RBG数值  
  167.         Random random = new Random();  
  168.         int R = random.nextInt(255);  
  169.         int G = random.nextInt(255);  
  170.         int B = random.nextInt(255);  
  171.         return Color.rgb(R, G, B);  
  172.     }  
  173. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值