• 【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/
  • 相关阅读:
    在360工作的这几天
    ISBN号码
    poj 3667 Hotel
    命令模式之2 Invoker Vs. Client
    vehicle time series data analysis
    JSON之三:获取JSON文本并解释(以google的天气API为例)
    创建型模式--工厂方法模式
    OpenStack Heat总结之:Icehouse中通过Heat+Ceilometer实现Autoscaling
    MyEclipse10 中增加svn插件
    activitie用户手册
  • 原文地址:https://www.cnblogs.com/huangjialin/p/5613435.html
Copyright © 2020-2023  润新知