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應用之PieChart(餅圖)
(三)
AChartEngine應用之BarChart(柱形圖)
(四)
AChartEngine應用之PieChart(動態餅圖,允許產生動態數據并顯示)
(五)
AChartEngine應用之LineChart(模擬生命特征值圖)
(六)
AChartEngine應用之LineChart(模擬三角函數sin,cos)
(七) AChartEngine高級應用 CombinedXYChart (組合統計圖)
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

