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能实现的不止这些,可以充分发挥自己的想象力与创造力,实现更加复杂的效果与功能。