【Android】achartengine的柱状图和饼状图的使用

本文介绍了android中如何使用achartengine绘制饼图和柱状图,请分别尝试饼图和柱状图,曲线图。

先看效果图:

先看看获取数据:

 Workbook workbook = Workbook.getWorkbook(file);
workbook.getNumberOfSheets();
//获得第一张工作表
Sheet sheet = workbook.getSheet(0);
int Rows = sheet.getRows(); //行数
int Cols = sheet.getColumns(); //列数

Log.i("huang", "当前工作表的名字:" + sheet.getName());
Log.i("huang", "总行数:" + Rows);
Log.i("huang", "总列数:" + Cols);

for (int i = 0; i < Cols; ++i) {
for (int j = 0; j < Rows; ++j) {
// getCell(Col,Row)获得单元格的值
System.out.print((sheet.getCell(i, j)).getContents() + " ");
if ((sheet.getCell(i, j)).getContents().equals("1") && Tag) {
Bugseriousnessone.add((sheet.getCell(i, j)).getContents());
} else if ((sheet.getCell(i, j)).getContents().equals("2") && Tag) {
Bugseriousnesstwo.add((sheet.getCell(i, j)).getContents());
} else if ((sheet.getCell(i, j)).getContents().equals("3") && Tag) {
Bugseriousnessthrid.add((sheet.getCell(i, j)).getContents());
} else if ((sheet.getCell(i, j)).getContents().equals("4") && Tag) {
Bugseriousnessfour.add((sheet.getCell(i, j)).getContents());


} else if ((sheet.getCell(i, j)).getContents().equals("代码错误")) {
mistake.add((sheet.getCell(i, j)).getContents());
} else if ((sheet.getCell(i, j)).getContents().equals("界面优化")) {
optimization.add((sheet.getCell(i, j)).getContents());
} else if ((sheet.getCell(i, j)).getContents().equals("需求缺失")) {
Lackofdemand.add((sheet.getCell(i, j)).getContents());
} else if ((sheet.getCell(i, j)).getContents().equals("设计图与原型不符")) {
inconformity.add((sheet.getCell(i, j)).getContents());


} else if ((sheet.getCell(i, j)).getContents().equals("蔡星")) {
caixing.add((sheet.getCell(i, j)).getContents());
} else if ((sheet.getCell(i, j)).getContents().equals("钱兵兵")) {
qianbingbing.add((sheet.getCell(i, j)).getContents());
} else if ((sheet.getCell(i, j)).getContents().equals("何飞良")) {
hefeiliang.add((sheet.getCell(i, j)).getContents());
} else if ((sheet.getCell(i, j)).getContents().equals("张菁")) {
zhangjing.add((sheet.getCell(i, j)).getContents());
} else if ((sheet.getCell(i, j)).getContents().equals("舒紫鹏")) {
shuzipeng.add((sheet.getCell(i, j)).getContents());
} else if ((sheet.getCell(i, j)).getContents().equals("金星")) {
jinxing.add((sheet.getCell(i, j)).getContents());
} else if ((sheet.getCell(i, j)).getContents().equals("李璇")) {
lixuan.add((sheet.getCell(i, j)).getContents());
} else if ((sheet.getCell(i, j)).getContents().equals("陈海珊")) {
haishan.add((sheet.getCell(i, j)).getContents());


} else if ((sheet.getCell(i, j)).getContents().equals("激活次数")) {
Tag = false;


} else if ((sheet.getCell(i, j)).getContents().equals("1") && !Tag) {
one.add((sheet.getCell(i, j)).getContents());
} else if ((sheet.getCell(i, j)).getContents().equals("2") && !Tag) {
two.add((sheet.getCell(i, j)).getContents());
} else if ((sheet.getCell(i, j)).getContents().equals("3") && !Tag) {
thrid.add((sheet.getCell(i, j)).getContents());
} else if ((sheet.getCell(i, j)).getContents().equals("4") && !Tag) {
four.add((sheet.getCell(i, j)).getContents());
}
}

System.out.print(" ");
}

Log.i("huang", one.size() + "");
Log.i("huang", two.size() + "");
Log.i("huang", thrid.size() + "");
Log.i("huang", four.size() + "");
// 得到第一列第一行的单元格
Cell cell1 = sheet.getCell(0, 0);
String result = cell1.getContents();
System.out.println(result);
workbook.close();

Toast.makeText(this, "数据获取成功", Toast.LENGTH_LONG).show();
Bugseriousness.setEnabled(true);
bugtype.setEnabled(true);
whocreate.setEnabled(true);
bugcount.setEnabled(true);
getData.setEnabled(false);

} catch (Exception e) {
e.printStackTrace();
}


}

AChartEngine(简称ACE)是Google的一个开源图表库(for Android)。它功能强大,支持散点图、折线图、饼图、气泡图、柱状图、短棒图、仪表图等多种图表。

代码中的注释解释了图标中的各种设置的使用方法。

需要注意的是,0.6版本不再支持Android 2.0以下(包含2.0)。也就是说如果你的目标平台使用了7以下SDK版本,比如Android1.5-2.0。则需要下载老版本的ACE 0.5。

一.achartengine库的下载,下载地址:

http://code.google.com/p/achartengine/downloads/list

下载完成后,把jar文件粘贴到libs文件夹

 

二.在android项目中如何使用

修改AndroidManifest.xml

主要是加入一个<activity>:

<activity android:name="org.achartengine.GraphicalActivity"/>

呆会我们使用ACE生成柱状图,会在一个特殊的Activit中才能显示,这个Activity就是ACE库中的GraphicalActivity 。我们需要在AndroidManifest.xml中申明它,否则Android会报找不到Activity错误。

先定义一个GraphicalView

GraphicalView graphicalView;

其中的dataset表示数据源,renderer表示渲染参数,type表示类型

设置dataset的方法--饼图

 

设置renderer的方法中的相关属性----饼图

/**
* 设置数据源
*
* @param title
* @param values
* @return
*/
private CategorySeries buildCategoryDataset(String title, double[] values) {
/** int percent = (int) ((totalMemorySize - availableSize) / (float) totalMemorySize * 100);
* 计算百分比
*/

String mistakeper = String.format("%.2f", (mistake.size() / (float) ((mistake.size() + optimization.size() + Lackofdemand.size() + inconformity.size())) * 100)) + "%";

String optimizationper = String.format("%.2f", (optimization.size() / (float) ((mistake.size() + optimization.size() + Lackofdemand.size() + inconformity.size())) * 100)) + "%";
String Lackofdemandper = String.format("%.2f", (Lackofdemand.size() / (float) ((mistake.size() + optimization.size() + Lackofdemand.size() + inconformity.size())) * 100)) + "%";
String inconformityper = String.format("%.2f", (inconformity.size() / (float) ((mistake.size() + optimization.size() + Lackofdemand.size() + inconformity.size())) * 100)) + "%";


CategorySeries series = new CategorySeries(title);
series.add("代码错误" + mistakeper, values[0]);
series.add("界面优化" + optimizationper, values[1]);
series.add("需求缺失" + Lackofdemandper, values[2]);
series.add("设计图与原型不符" + inconformityper, values[3]);

return series;

}

/**
* 设置渲染的相关参数
*
* @param colors
* @return
*/

private DefaultRenderer buildCategoryRenderer(int[] colors) {
DefaultRenderer renderer = new DefaultRenderer();

renderer.setLegendTextSize(20);// 设置左下角表注的文字大小
renderer.setZoomButtonsVisible(true);//设置显示放大缩小按钮
renderer.setZoomEnabled(false);// 设置不允许放大缩小.

renderer.setChartTitleTextSize(60);// 设置图表标题的文字大小
renderer.setChartTitle("统计结果共" + inall + "个bug");// 设置图表的标题 默认是居中顶部显示
renderer.setLabelsTextSize(20);// 饼图上标记文字的字体大小
// renderer.setLabelsColor(Color.WHITE);//饼图上标记文字的颜色

renderer.setPanEnabled(false);// 设置是否可以平移
renderer.setDisplayValues(true);//是否显示值
renderer.setClickEnabled(true);// 设置是否可以被点击 ---------未被认证成功
renderer.setMargins(new int[]{20, 30, 15, 0});
// margins - an array containing the margin size values, in this order:
// top, left, bottom, right
for (int color : colors) {
SimpleSeriesRenderer r = new SimpleSeriesRenderer();
r.setColor(color);
renderer.addSeriesRenderer(r);
}

return renderer;
}
 
 

最后将graphicalView放入指定的layout里

1 layout=(LinearLayout)findViewById(R.id.linearlayout);
2layout.removeAllViews();
3layout.setBackgroundColor(Color.BLACK);
4 layout.addView(graphicalView, new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT));

效果截图

下面看看柱形图的一些属性

步骤:

下面创建一个AChart接口 

  1. public interface AChartAbstract {  
  2.       
  3.     /** 
  4.      * 获取一个当前类型图标的Intent实例 
  5.      */  
  6.     public Intent getIntent(Context context);  
  7. }  


public class BarChart implements AChartAbstract {
ArrayList<String> caixing;
ArrayList<String> hefeiliang;
ArrayList<String> qianbingbing;
ArrayList<String> zhangjing;
ArrayList<String> shuzipeng;
ArrayList<String> jinxing;
ArrayList<String> lixuan;
ArrayList<String> haishan;


public BarChart(ArrayList<String> caixing, ArrayList<String> hefeiliang, ArrayList<String> qianbingbing, ArrayList<String> zhangjing, ArrayList<String> shuzipeng, ArrayList<String> jinxing, ArrayList<String> lixuan, ArrayList<String> haishan) {
this.caixing = caixing;
this.hefeiliang = hefeiliang;
this.qianbingbing = qianbingbing;
this.zhangjing = zhangjing;
this.shuzipeng = shuzipeng;
this.jinxing = jinxing;
this.lixuan = lixuan;
this.haishan = haishan;
}

@Override
public Intent getIntent(Context context) {
Intent intent = ChartFactory.getBarChartIntent(context, getDataSet(), getRenderer(), org.achartengine.chart.BarChart.Type.STACKED, "谁创建的bug---柱形图");
return intent;
}

/**
* 构造数据
*
* @return
*/
public XYMultipleSeriesDataset getDataSet() {
XYMultipleSeriesDataset barDataset = new XYMultipleSeriesDataset();
CategorySeries barSeries = new CategorySeries("柱形图");
barSeries.add(caixing.size());
barSeries.add(hefeiliang.size());
barSeries.add(qianbingbing.size());
barSeries.add(zhangjing.size());
barSeries.add(shuzipeng.size());
barSeries.add(jinxing.size());
barSeries.add(lixuan.size());
barSeries.add(haishan.size());
barDataset.addSeries(barSeries.toXYSeries());
return barDataset;

}

/**
* 构造渲染器 XYMultipleSeriesRenderer可以理解为是描绘器
*
* @return
*/

public XYMultipleSeriesRenderer getRenderer() {
XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer();
// renderer.setChartTitle("当月开票");
// // 设置标题的字体大小
// renderer.setChartTitleTextSize(16);
renderer.setXTitle("android2.2.0bug统计图");
renderer.setYTitle("单位(个)");
renderer.setAxesColor(Color.WHITE);
renderer.setLabelsColor(Color.WHITE);
// 设置X轴的最小数字和最大数字
renderer.setXAxisMin(0.5);
renderer.setXAxisMax(5.5);
// 设置Y轴的最小数字和最大数字
renderer.setYAxisMin(0);
renderer.setYAxisMax(300);
renderer.addXTextLabel(1, "蔡星");
renderer.addXTextLabel(2, "何飞良");
renderer.addXTextLabel(3, "钱兵兵");
renderer.addXTextLabel(4, "张菁");
renderer.addXTextLabel(5, "舒紫鹏");
renderer.addXTextLabel(6, "金星");
renderer.addXTextLabel(7, "李璇");
renderer.addXTextLabel(8, "陈海珊");

renderer.setZoomButtonsVisible(false);
// 设置渲染器允许放大缩小
renderer.setZoomEnabled(false);
// 消除锯齿
renderer.setAntialiasing(true);
// 设置背景颜色
renderer.setApplyBackgroundColor(true);
renderer.setBackgroundColor(Color.GRAY);
// 设置每条柱子的颜色
SimpleSeriesRenderer sr = new SimpleSeriesRenderer();
sr.setColor(Color.YELLOW);
renderer.addSeriesRenderer(sr);
// 设置每个柱子上是否显示数值
renderer.getSeriesRendererAt(0).setDisplayChartValues(true);
// X轴的近似坐标数 (这样不显示横坐标)
renderer.setXLabels(0);
// Y轴的近似坐标数
renderer.setYLabels(6);
// 刻度线与X轴坐标文字左侧对齐
renderer.setXLabelsAlign(Align.LEFT);
// Y轴与Y轴坐标文字左对齐
renderer.setYLabelsAlign(Align.LEFT);
// 允许左右拖动,但不允许上下拖动.
renderer.setPanEnabled(true, false);
// 柱子间宽度
renderer.setBarSpacing(0.3f);
// 设置X,Y轴单位的字体大小
renderer.setAxisTitleTextSize(30);
//设置左下角的字体大小
renderer.setLegendTextSize(30);
//设置刻度的字体大小
renderer.setLabelsTextSize(30);
return renderer;
}
}

最后主函数直接

  

Intent intent = new BarChart(caixing, hefeiliang, qianbingbing, zhangjing, shuzipeng, jinxing, lixuan, haishan).getIntent(this);
startActivity(intent);

 

最后附上一些相关属性:

DefaultRenderer:

void

addSeriesRenderer(int index, SimpleSeriesRenderer renderer) 
增加一个renderer到multiple renderer中,index是指定的位置.

void

addSeriesRenderer(SimpleSeriesRenderer renderer)增加一个renderer到multiplerenderer中

int

getAxesColor() 
得到X轴的颜色.

int

getBackgroundColor() 
得到背景色

java.lang.String

getChartTitle() 
得到图表的标题

float

getChartTitleTextSize() 
得到图表标题的字号

int

getLabelsColor() 
得到Y轴的颜色.

float

getLabelsTextSize() 
得到Y轴的字号.

int

getLegendHeight() 
得到图例的高度.

float

getLegendTextSize() 
得到图例的字号.

int[]

getMargins() 
得到图表外边框的大小.

float

getOriginalScale() 
Returns the original value to be used for scaling the chart.

float

getScale() 
Returns the value to be used for scaling the chart.

int

getSelectableBuffer() 
得到点的缓冲半径值(在某点附件点击时,多大范围内都算点击这个点) Returns the selectable radius value around clickable points.

SimpleSeriesRenderer

getSeriesRendererAt(int index) 
在multiple renderer中得到指定位置的 renderer.

int

getSeriesRendererCount() 得到multiple renderer集合中renderer的个数.

SimpleSeriesRenderer[]

getSeriesRenderers() 
得到 multiple renderer 中的renderer数组.

float

getStartAngle() 
得到圆形图(例如:饼图/圆环图等)的开始角度.

java.lang.String

getTextTypefaceName()

得到字体名.

int

getTextTypefaceStyle()

得到字体类型.

float

getZoomRate()

得到放大缩小的倍率.

boolean

isAntialiasing() 
Returns the antialiasing flag value.

boolean

isApplyBackgroundColor()

得到是否应用背景色的设置结果(true/false).

boolean

isClickEnabled()

得到是否启用点击事件.

boolean

isExternalZoomEnabled() 
Returns the enabled state of the external (application implemented) zoom.

boolean

isFitLegend()

得到是否设置图例大小自适应.

boolean

isInScroll() 
Returns if the chart is inside a scroll view and doesn't need to shrink.

boolean

isPanEnabled() 
得到是否允许拖动 Returns the enabled state of the pan.

boolean

isShowAxes()

得到是否显示X轴.

boolean

isShowCustomTextGrid()

得到是否显示X轴和Y轴网格.

boolean

isShowGridX()

得到是否显示X轴网格.

boolean

isShowGridY()

得到是否显示Y轴网格.

boolean

isShowLabels()

得到是否显示刻度.

boolean

isShowLegend()

得到是否显示图例.

boolean

isZoomButtonsVisible()

得到是否显示放到缩小按钮.

boolean

isZoomEnabled()

是否支持放大缩小.

void

removeSeriesRenderer(SimpleSeriesRenderer renderer) 
在multiple renderer中移除一个renderer.

void

setAntialiasing(boolean antialiasing) 
Sets the antialiasing value.

void

setApplyBackgroundColor(boolean apply)

设置是否应用背景色.

void

setAxesColor(int color)

设置X轴的颜色.

void

setBackgroundColor(int color)

设置背景色.

void

setChartTitle(java.lang.String title)

设置图表的标题.

void

setChartTitleTextSize(float textSize)

设置图表标题字号.

void

setClickEnabled(boolean enabled)

设置是否允许单击事件.

void

setExternalZoomEnabled(boolean enabled) 
Sets the enabled state of the external (application implemented) zoom.

void

setFitLegend(boolean fit)

设置图例字号自适应.

void

setInScroll(boolean inScroll) 
To be set if the chart is inside a scroll view and doesn't need to shrink when not enough space.

void

setLabelsColor(int color)

设置坐标颜色.

void

setLabelsTextSize(float textSize) 
设置坐标字号.

void

setLegendHeight(int height) 
设置图例高度(单位: pixels).

void

setLegendTextSize(float textSize)

设置图例字号.

void

setMargins(int[] margins)

设置外边框(单位:pixels)上/左/下/右.

void

setPanEnabled(boolean enabled) 
设置是否允许拖动 Sets the enabled state of the pan.

void

setScale(float scale) 
Sets the value to be used for scaling the chart.

void

setSelectableBuffer(int buffer) 
设置点的缓冲半径值(在某点附件点击时,多大范围内都算点击这个点) Sets the selectable radius value around clickable points.

void

setShowAxes(boolean showAxes)

设置是否显示X轴.

void

setShowCustomTextGrid(boolean showGrid) 
设置X轴和Y轴网格是否显示.

void

setShowGrid(boolean showGrid)

设置是否显示网格.

void

setShowGridX(boolean showGrid)

设置是否显示X轴网格.

void

setShowGridY(boolean showGrid)

设置是否显示Y轴网格.

void

setShowLabels(boolean showLabels)

设置是否显示坐标.

void

setShowLegend(boolean showLegend)

设置是否显示图例.

void

setStartAngle(float startAngle) 
设置圆形图(例如:饼图/圆环图等)的开始角度.

void

setTextTypeface(java.lang.String typefaceName, int style)

设置字体名和类型.

void

setZoomButtonsVisible(boolean visible)

设置是否显示放大缩小按钮.

void

setZoomEnabled(boolean enabled)

设置是否允许放大和缩小.

void

setZoomRate(float rate) 
设置放大缩小的倍率.

 

XYMultipleSeriesDataset:

void

addSeries(int index, XYSeries series) 
在指定位置增加一个序列.

void

addSeries(XYSeries series) 
增加一个序列.

XYSeries[]

getSeries() 
得到序列的数组

XYSeries

getSeriesAt(int index) 
得到指定位置的序列.

int

getSeriesCount() 
得到序列的个数.

void

removeSeries(int index) 
移除指定位置的序列.

void

removeSeries(XYSeries series) 
移除一个序列

Android交流面试群:684619033 ----- 注意:转载请注明出处:https://www.cnblogs.com/huangjialin/
原文地址:https://www.cnblogs.com/huangjialin/p/5613435.html