zoukankan      html  css  js  c++  java
  • Android AChartEngine

    此文为转载,非本人原创,尊重原创

    最近一段时间完成“体重记录”的功能,需要实现日历和曲线的效果。也花费不少精力吧,这里就先把曲线的实现分享出来,俗话说的好:“好记忆不如烂笔头”!

    AChartEngine是什么?

    AChartEngine是一个android应用的图表库,他支持一些常见的一些图表,如线状图,区域图,散点图,时间图,柱状图,饼状图,气泡图等。当然这次只用到了线状图。项目地址在http://code.google.com/p/achartengine/

    下面先看下这次项目中实现的效果吧:

    实现

    总的来说,AChartEngine提供的api还是很全的,使用起来是很方便的,但是唯一的缺点就是api文档描述的不够详细,很多自己想要的效果都只能自己根据api的命名去推测,更有甚者得必须自己亲自一点点尝试才能实现出自己想要的效果,为了以后用到,这次也在代码中用到的接口表明了清晰的注释,废话不多说,直接上代码。

      1 public class WeightCurveActivity extends ActivityBase {
      2 
      3     static final String TAG = WeightCurveActivity.class.getName();
      4 
      5     private LinearLayout rootLayout;
      6     private XYMultipleSeriesRenderer mRenderer;
      7     private XYMultipleSeriesDataset mDataset = new XYMultipleSeriesDataset();
      8     
      9     private int month;
     10     private Date date;
     11     private ArrayList<WeightRecord> records;
     12     private double[] xValues;
     13     private double[] yValues;
     14 
     15     public void onCreate(Bundle outState) {
     16         super.onCreate(outState);
     17         setContentView(R.layout.weight_curve);
     18         
     19         handleIntent();
     20         initRender();
     21         initData();
     22         initUI();
     23     }
     24     
     25     private void handleIntent() {
     26         String dateString = getIntent().getStringExtra(Const.DATE);
     27         date = DateHelper.parseString(dateString);
     28     }
     29     
     30     private void initRender() {
     31         mRenderer = buildRenderer();
     32         setChartSettings(0, 31, 30, 120);
     33     }
     34     
     35     private void initData() {
     36         month = DateHelper.getMonth(date);
     37         WeightRecordDao dao = new WeightRecordDao(this);
     38         records = dao.getMonthLists(date);
     39         Helper.showLog(TAG, records.size());
     40         dao.closeDB();
     41         initValues();
     42     }
     43     
     44     private void initValues() {
     45         int count = records.size();
     46         if (count > 0) {
     47             xValues = new double[count];
     48             yValues = new double[count];
     49             for (int i = 0; i < count; i ++) {
     50                 WeightRecord record = records.get(i);
     51                 xValues[i] = DateHelper.getDay(record.record_on);
     52                 yValues[i] = (Math.round(record.weight * 10) / 10.0);
     53             }
     54             setXLabel();
     55         }
     56     }
     57     
     58     private void initUI() {
     59         addXYSeries(0);
     60 
     61         rootLayout = (LinearLayout) findViewById(R.id.root);
     62         View view = ChartFactory.getLineChartView(this, mDataset, mRenderer);
     63         rootLayout.addView(view);
     64     }
     65     
     66     private void setXLabel() {
     67         mRenderer.setXLabels(0); // 设置X轴标签不显示
     68         int length = xValues.length;
     69         for (int i = 0; i < length; i++) {
     70             mRenderer.addXTextLabel(i * 3 + 1, month + "/" + (int)xValues[i]);
     71         }
     72     }
     73     
     74     private XYMultipleSeriesRenderer buildRenderer() {
     75         XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer();
     76         renderer.setAxisTitleTextSize(16); // 设置坐标轴字体大小
     77         renderer.setChartTitleTextSize(20); // 设置标题大小
     78         renderer.setLabelsTextSize(20); // 设置标签字体大小
     79         renderer.setLegendTextSize(15); // 设置底部曲线说明字体大小
     80         renderer.setShowGridX(true); // 设置X方向表格显示
     81         renderer.setShowLegend(false); // 设置底部曲线说明显示
     82         renderer.setGridColor(Color.LTGRAY); // 设置表格颜色
     83         renderer.setPointSize(5f);
     84         renderer.setMargins(new int[] { 30, 40, 10, 30 });
     85         renderer.setPanEnabled(true, false); // 设置曲线可滑动
     86 
     87         renderer.setApplyBackgroundColor(true); // 设置图表背景
     88         renderer.setBackgroundColor(Color.TRANSPARENT);
     89 
     90         renderer.setChartTitle("体重曲线");
     91         renderer.setXTitle("日期");
     92         renderer.setYTitle("体重");
     93 
     94         renderer.setXLabelsColor(getResources().getColor(
     95                 R.color.main_font_color));
     96         renderer.setXLabelsAlign(Align.CENTER);
     97         renderer.setXLabelsPadding(5);
     98         renderer.setYLabelsColor(0,
     99                 getResources().getColor(R.color.main_font_color));
    100         renderer.setYLabelsPadding(5);
    101         renderer.setYLabelsAlign(Align.RIGHT);
    102 
    103         renderer.setAxesColor(Color.GRAY); // 设置坐标轴颜色
    104         renderer.setMarginsColor(getResources().getColor(R.color.main_bg_color)); // 设置图表周围颜色
    105         
    106         renderer.setLabelsColor(Color.GRAY); // 设置标签颜色
    107         
    108         XYSeriesRenderer r = new XYSeriesRenderer();
    109         r.setColor(getResources().getColor(R.color.stress_font_color));
    110         r.setFillPoints(true);
    111         r.setPointStyle(PointStyle.CIRCLE);
    112         renderer.addSeriesRenderer(r);
    113         r.setDisplayChartValues(true); // 设置显示图表值
    114         r.setDisplayChartValuesDistance(1);
    115         r.setChartValuesTextSize(16);
    116         r.setChartValuesSpacing(10);
    117         r.setHighlighted(true);
    118         return renderer;
    119     }
    120 
    121     private void setChartSettings(double xMin, double xMax, double yMin,
    122             double yMax) {
    123         mRenderer.setXAxisMin(xMin); // 设置X轴最小值
    124         mRenderer.setXAxisMax(xMax); // 设置X轴最大值
    125         mRenderer.setYAxisMin(yMin); // 设置Y轴最小值
    126         mRenderer.setYAxisMax(yMax); // 设置Y轴最大值
    127     }
    128 
    129     private void addXYSeries(int scale) {
    130         XYSeries series = new XYSeries("", scale);
    131         if (records.size() > 0) {
    132             int seriesLength = xValues.length;
    133             for (int k = 0; k < seriesLength; k++) {
    134                 series.add(k * 3 + 1, yValues[k]);
    135             }
    136         }
    137         mDataset.addSeries(series);
    138     }
    139 }

    现在看来代码倒是很简单,但是为了实现现在这个样子,当初费了不少精力来一步步尝试。当然AChartEngine能实现的不止这些,可以充分发挥自己的想象力与创造力,实现更加复杂的效果与功能。

  • 相关阅读:
    关于json操作,这里再为大家推荐几款比较实用的json在线工具
    JS操作JSON总结
    HTML WebSocket
    HTML应用程序缓存
    前段也能学习网址
    简述jpg。Gif。png-8.png-24的区别,分别使用场景
    HTML相关问题
    html5移动端知识点总结
    html5本地存储(localStorage)使用介绍
    node环境变量----新全局包管理配置
  • 原文地址:https://www.cnblogs.com/liyuzhao/p/4398647.html
Copyright © 2011-2022 走看看