Androidachartengine的柱状图和饼状图的使用
Posted 遥望天涯
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Androidachartengine的柱状图和饼状图的使用相关的知识,希望对你有一定的参考价值。
本文介绍了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() + "\t");
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("\n");
}
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接口
- public interface AChartAbstract {
- /**
- * 获取一个当前类型图标的Intent实例
- */
- public Intent getIntent(Context context);
- }
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) |
void |
addSeriesRenderer(SimpleSeriesRenderer renderer)增加一个renderer到multiplerenderer中 |
int |
getAxesColor() |
int |
getBackgroundColor() |
java.lang.String |
getChartTitle() |
float |
getChartTitleTextSize() |
int |
getLabelsColor() |
float |
getLabelsTextSize() |
int |
getLegendHeight() |
float |
getLegendTextSize() |
int[] |
getMargins() |
float |
getOriginalScale() |
float |
getScale() |
int |
getSelectableBuffer() |
SimpleSeriesRenderer |
getSeriesRendererAt(int index) |
int |
getSeriesRendererCount() 得到multiple renderer集合中renderer的个数. |
SimpleSeriesRenderer[] |
getSeriesRenderers() |
float |
getStartAngle() |
java.lang.String |
getTextTypefaceName() 得到字体名. |
int |
getTextTypefaceStyle() 得到字体类型. |
float |
getZoomRate() 得到放大缩小的倍率. |
boolean |
isAntialiasing() |
boolean |
isApplyBackgroundColor() 得到是否应用背景色的设置结果(true/false). |
boolean |
isClickEnabled() 得到是否启用点击事件. |
boolean |
isExternalZoomEnabled() |
boolean |
isFitLegend() 得到是否设置图例大小自适应. |
boolean |
isInScroll() |
boolean |
isPanEnabled() |
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) |
void |
setAntialiasing(boolean antialiasing) |
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) |
void |
setFitLegend(boolean fit) 设置图例字号自适应. |
void |
setInScroll(boolean inScroll) |
void |
setLabelsColor(int color) 设置坐标颜色. |
void |
setLabelsTextSize(float textSize) |
void |
setLegendHeight(int height) |
void |
setLegendTextSize(float textSize) 设置图例字号. |
void |
setMargins(int[] margins) 设置外边框(单位:pixels)上/左/下/右. |
void |
setPanEnabled(boolean enabled) |
void |
setScale(float scale) |
void |
setSelectableBuffer(int buffer) |
void |
setShowAxes(boolean showAxes) 设置是否显示X轴. |
void |
setShowCustomTextGrid(boolean showGrid) |
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)
|
以上是关于Androidachartengine的柱状图和饼状图的使用的主要内容,如果未能解决你的问题,请参考以下文章
Python 之 Matplotlib 柱状图(竖直柱状图和水平柱状图)直方图和饼状图
java导出excel数据能不能 生成柱状图和饼图? 说原因,