【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() + "\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) |
【Android】achartengine的柱状图和饼状图的使用的更多相关文章
- WPF、Silverlight项目中使用柱状图、饼状图、折线图
在开发的过程中,可能会遇到柱状图.饼状图.折线图来更好的显示数据,最近整理了一下,遂放出来望需要的朋友可以参考.本文仅仅是简单显示,如需复杂显示效果请参考官网代码示例.----本文代码使用WPF,Si ...
- 使用FusionCharts出柱状图和饼状图
在最近的项目中,需要使用出图,能够查看柱状图,饼状图等效果,刚开始我们用JS写的效果,发现效果不理想,找了一个JS插件发现效果还是不理想,客户也不满意,客户希望要很炫的效果,最后我们使用了Fusion ...
- FusionChart实现柱状图、饼状图的动态数据显示 附Demo
最近做的项目中需要用饼状图显示——'问卷调查'的统计结果(之前用过FusionChart做过柱状图的数据展示,那还是两年前的事了),在网上查了下FusionChart实现饼状图显示方面的资料,却发现资 ...
- 前端数据统计用做Bootstrap的一些柱状图、饼状图和折线图案例
Bootstrap,来自 Twitter,是目前最受欢迎的前端框架.Bootstrap 是基于 HTML.CSS.JAVASCRIPT 的,它简洁灵活,使得 Web 开发更加快捷. Bootstrap ...
- Android图表库MPAndroidChart(八)——饼状图的扩展:折线饼状图
Android图表库MPAndroidChart(八)--饼状图的扩展:折线饼状图 我们接着上文,饼状图的扩展,增加折现的说明,来看下我们要实现的效果 因为之前对MPAndroidChart的熟悉,所 ...
- Android图表库MPAndroidChart(七)—饼状图可以再简单一点
Android图表库MPAndroidChart(七)-饼状图可以再简单一点 接上文,今天实现的是用的很多的,作用在统计上的饼状图,我们看下今天的效果 这个效果,我们实现,和之前一样的套路,我先来说下 ...
- FusionChart实现柱状图、饼状图的动态数据显示
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- echarts 柱状图和饼状图动态获取后台数据
运用echarts来实现图表 1.首先下载echarts包 http://echarts.baidu.com/echarts2/doc/example.html,在这里我下载的是 2.将echart ...
- DevExpress使用之ChartControl控件绘制图表(多坐标折线图、柱状图、饼状图)
最近因为公司项目需要用到WinForm的DecExpress控件,在这里把一些使用方法总结一下. DevExpress中有一个专门用来绘制图表的插件ChartControl,可以绘制折线图.饼状图.柱 ...
随机推荐
- ionic ios 友盟多渠道/自动签名/加固之腾讯云。乐固
之前写了一篇文章主要是介绍使用gradle进行多渠道分发处理的文章--链接:http://www.cnblogs.com/happen-/p/6029387.html 最近在做app上线的处理,发现某 ...
- Node.js入门笔记(5):案例两则
案例分析:前端自动化 1. 实现一个自动创建前端项目文件的js 通过node.js自动创建前端项目目录,包括js目录,js目录css目录,index.html和对应的内容. 初步的代码如下: var ...
- u盘安装Fedora23
-2.计划用ultraiso安装 fedora 23 ,然后从windows平台转到Linux平台上. -1.概念理解 硬盘模式:achi(sata) ide (ata) 分区格式:主引导记录(mbr ...
- ubuntu下安装mysql及卸载mysql方法
1. 删除mysql a. sudo apt-get autoremove --purge mysql-server-5.0 b. sudo apt-get remove mysql-server c ...
- session生命周期(一)
Session存储在服务器端,一般为了防止在服务器的内存中(为了高速存取),Session在用户访问第一次访问服务器时创建,需要注意只有访问JSP.Servlet等程序时才会创建Session,只访问 ...
- Excel 锁定特定单元格 不允许更改
1.首先,excel默认所有单元格都是被"锁定"的--当"锁定单元格"按钮被激活时. 因此,第一步,选择所有单元格,设置单元格格式,取消"保护&quo ...
- bzoj1045 糖果传递
escription 老师准备了一堆糖果, 恰好n个小朋友可以分到数目一样多的糖果. 老师要n个小朋友去拿糖果, 然后围着圆桌坐好, 第1个小朋友的左边是第n个小朋友, 其他第i个小朋友左边是第i-1 ...
- PHP realpath() 函数
定义和用法 realpath() 函数返回绝对路径. 该函数删除所有符号连接(比如 '/./', '/../' 以及多余的 '/'),返回绝对路径名. 若失败,则返回 false.比如说文件不存在的话 ...
- vue2.0学习(一)
1.解决双花括号在初始化时的闪烁,两种方式,一种是<div v-text="name"></div>,将用v-text指令来显示,类似于angular的ng ...
- 自写网站入门阶段之三:兼容大战与jq初探
自上一次作小结至今已整整一个月,在忙乎了半个月的工作之后闲下来的一个下午我终于可以再次作这个阶段的小结了.首先庆幸的是在同学的推荐下我顺利的找到了工作并于月初3号正式上班,这一点非常感谢他,让我免去了 ...