android 使用AChartEngine 餅圖的實現

1、AChartEngine 簡介

AChartEngine是爲Android應用而設計的繪圖工具庫。可用於繪製多種圖表,我使用的是achartengine-1.1.0.jar。ChartEngine支持的圖表類型:折線圖、區域圖、散點圖、時間圖、柱狀圖、餅狀圖、氣泡式圖表、環形圖、高低交替圖等。

以上每種圖表都可以包含多個序列, 可以將X軸以水平或垂直的形式顯示,也支持很多自定義的特性。另外,圖表可以作爲View構建,也可以作爲Intent構建這樣可以被用於啓動一個活動(Activity)。

其實AChartEngine和JFreeChart差不多。JFreeChart是JAVA平臺上的一個開放的圖表繪製類庫。它完全使用JAVA語言編寫,是爲applications, applets, servlets 以及JSP等使用所設計。JFreeChart可生成餅圖(pie charts)、柱狀圖(bar charts)、散點圖(scatter plots)、時序圖(time series)、甘特圖(Gantt charts)等等多種圖表,並且可以產生PNG和JPEG格式的輸出,還可以與PDF和EXCEL關聯。

AChartEngine和JFreeChart都是採用Java編寫的開放圖表製作類庫,前者是應用在android上,後者也能主要應用在JAVA SE 或者 JAVA EE上。AChartEngine是谷歌開發的開源項目。

2、AChartEngine 實現PieChart

這裏進行了餅圖的封裝,只需要進行準備好數據就可以實現相應的功能

package com.example.chartdemo;

import java.text.NumberFormat;
import java.util.Map;
import java.util.Random;

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

import android.content.Context;
import android.graphics.Color;
import android.util.Log;
import android.view.View;
import android.widget.Toast;


public class PieChart
{
private static final int[] COLORS = new int[] { Color.RED, Color.GREEN, Color.BLUE, Color.MAGENTA, Color.CYAN,
Color.YELLOW, Color.DKGRAY };
// 設置圖例字體大小
private int legendTextSize = 30;

// 設置圖例高度
private int legendHeight = 50;

// 設置圖例的顏色
private int labelColor = Color.BLACK;

// 設置餅圖標題大小
private int titleSize = 50;

private Context context;

// 用來顯示PieChart
private GraphicalView pieChartView = null;

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

private CategorySeries mSeries = new CategorySeries("");

/**
* 數據集 key:名稱 value:數目
*/
private Map<String, Double> dataMaps;

/**
* 設置餅圖的標題
*/
private String pieTitle;

public PieChart (Map<String, Double> dataMaps , Context context , String pieTitle)
{
this.dataMaps = dataMaps;
this.context = context;
this.pieTitle = pieTitle;

generatePieChartView();
}


private double getAllSum()
{
double sum = 0;
for (Map.Entry<String, Double> entry : dataMaps.entrySet())
{
sum += entry.getValue().doubleValue();
}
return sum;
}

private void generatePieChartView()
{

mRenderer.setZoomButtonsVisible(false);// 顯示放大縮小功能按鈕
mRenderer.setStartAngle(180);// 設置爲水平開始
mRenderer.setDisplayValues(true);// 顯示數據
mRenderer.setFitLegend(true);// 設置是否顯示圖例
mRenderer.setLegendTextSize(legendTextSize);//
mRenderer.setLegendHeight(legendHeight);
mRenderer.setLabelsColor(labelColor);
mRenderer.setChartTitle(pieTitle);// 設置餅圖標題
mRenderer.setChartTitleTextSize(titleSize);
mRenderer.setPanEnabled(false);// 圖表是否可以移動
mRenderer.setZoomEnabled(false);// 圖表是否可以縮放

double sum = getAllSum();

int color_i = 0;
for (Map.Entry<String, Double> entry : dataMaps.entrySet())
{
mSeries.add(entry.getKey(), entry.getValue().doubleValue() / sum);
SimpleSeriesRenderer renderer = new SimpleSeriesRenderer();
if (color_i < COLORS.length)
{
renderer.setColor(COLORS[color_i++]);// 設置描繪器的顏色

}
else
{
renderer.setColor(getRandomColor());// 設置描繪器的顏色
}
renderer.setChartValuesFormat(NumberFormat.getPercentInstance());// 設置百分比

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

Log.v("color", color_i+"ddd");
}

if (pieChartView == null)
{
// 爲空需要從ChartFactory獲取PieChartView
pieChartView = ChartFactory.getPieChartView(context, mSeries, mRenderer);// 構建mChartView

// mLinear.addView(mChartView);
}
else
{
pieChartView.repaint();
}
}


public GraphicalView getPieView()
{
return pieChartView;

}

public void onClick(boolean isEnalbed)
{
mRenderer.setClickEnabled(isEnalbed);// 允許點擊事件
pieChartView.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
SeriesSelection seriesSelection = pieChartView.getCurrentSeriesAndPoint();// 獲取當前的類別和指針
if (seriesSelection == null)
{
Toast.makeText(context, "您未選擇數據", Toast.LENGTH_SHORT).show();
}
else
{
for (int i = 0; i < mSeries.getItemCount(); i++)
{
mRenderer.getSeriesRendererAt(i).setHighlighted(
i == seriesSelection.getPointIndex());
}
// mRenderer.getSeriesRendererAt(seriesSelection.getPointIndex()).setHighlighted(true);
pieChartView.repaint();
String selectedtitle= mSeries.getCategory(seriesSelection.getPointIndex());
Toast.makeText(
context,
"您選擇的是" + selectedtitle + " ," + " 百分比爲 "
+ NumberFormat.getPercentInstance().format(seriesSelection.getValue()),
Toast.LENGTH_SHORT).show();
}
}
});
}

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

public int getLegendTextSize()
{
return legendTextSize;
}

public void setLegendTextSize(int legendTextSize)
{
this.legendTextSize = legendTextSize;
}

public int getLegendHeight()
{
return legendHeight;
}

public void setLegendHeight(int legendHeight)
{
this.legendHeight = legendHeight;
}

public int getLabelColor()
{
return labelColor;
}

public void setLabelColor(int labelColor)
{
this.labelColor = labelColor;
}

public int getTitleSize()
{
return titleSize;
}

public void setTitleSize(int titleSize)
{
this.titleSize = titleSize;
}

public Map<String, Double> getDataMaps()
{
return dataMaps;
}

public void setDataMaps(Map<String, Double> dataMaps)
{
this.dataMaps = dataMaps;
}

public String getPieTitle()
{
return pieTitle;
}

public void setPieTitle(String pieTitle)
{
this.pieTitle = pieTitle;
}


}



}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章