Android通过achartengine画折线图
2014-10-06 16:21
357 查看
因为前段时间Android项目中用到了折线图的功能,在查资料的过程中发现achartengine这个包有非常强大的画图功能,正好最近有时间,就整理一下方便以后查看。
首先要使用画图功能,就必须在lib中引入achartengine包。为了使用方便,直接使用示例中的两个文件,源码如下:
IDemoChart.java
AbstractDemoChart.java
然后就是自定义的内容了,包括折线图的数据、样式等内容,具体详见代码注释
LinearChart.java
因为要调用到"org.achartengine.GraphicalActivity“类,所以不要忘记在manifest中添加 <activity android:name="org.achartengine.GraphicalActivity" />说明,否则会报错。
首先要使用画图功能,就必须在lib中引入achartengine包。为了使用方便,直接使用示例中的两个文件,源码如下:
IDemoChart.java
import android.content.Context; import android.content.Intent; /** * Defines the demo charts. */ public interface IDemoChart { /** A constant for the name field in a list activity. */ String NAME = "name"; /** A constant for the description field in a list activity. */ String DESC = "desc"; /** * Returns the chart name. * * @return the chart name */ String getName(); /** * Returns the chart description. * * @return the chart description */ String getDesc(); /** * Executes the chart demo. * * @param context the context * @return the built intent */ Intent execute(Context context); }
AbstractDemoChart.java
import java.util.Date; import java.util.List; import org.achartengine.chart.PointStyle; import org.achartengine.model.CategorySeries; import org.achartengine.model.MultipleCategorySeries; import org.achartengine.model.TimeSeries; import org.achartengine.model.XYMultipleSeriesDataset; import org.achartengine.model.XYSeries; import org.achartengine.renderer.DefaultRenderer; import org.achartengine.renderer.SimpleSeriesRenderer; import org.achartengine.renderer.XYMultipleSeriesRenderer; import org.achartengine.renderer.XYSeriesRenderer; import android.app.Activity; /** * An abstract class for the demo charts to extend. It contains some methods for * building datasets and renderers. */ public abstract class AbstractDemoChart extends Activity implements IDemoChart { /** * Builds an XY multiple dataset using the provided values. * * @param titles the series titles * @param xValues the values for the X axis * @param yValues the values for the Y axis * @return the XY multiple dataset */ protected XYMultipleSeriesDataset buildDataset(String[] titles, List<double[]> xValues, List<double[]> yValues) { XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset(); addXYSeries(dataset, titles, xValues, yValues, 0); return dataset; } public void addXYSeries(XYMultipleSeriesDataset dataset, String[] titles, List<double[]> xValues, List<double[]> yValues, int scale) { int length = titles.length; for (int i = 0; i < length; i++) { XYSeries series = new XYSeries(titles[i], scale); double[] xV = xValues.get(i); double[] yV = yValues.get(i); int seriesLength = xV.length; for (int k = 0; k < seriesLength; k++) { series.add(xV[k], yV[k]); } dataset.addSeries(series); } } /** * Builds an XY multiple series renderer. * * @param colors the series rendering colors * @param styles the series point styles * @return the XY multiple series renderers */ protected XYMultipleSeriesRenderer buildRenderer(int[] colors, PointStyle[] styles) { XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer(); setRenderer(renderer, colors, styles); return renderer; } protected void setRenderer(XYMultipleSeriesRenderer renderer, int[] colors, PointStyle[] styles) { renderer.setAxisTitleTextSize(16); renderer.setChartTitleTextSize(20); renderer.setLabelsTextSize(15); renderer.setLegendTextSize(15); renderer.setPointSize(5f); renderer.setMargins(new int[] { 20, 30, 15, 20 }); int length = colors.length; for (int i = 0; i < length; i++) { XYSeriesRenderer r = new XYSeriesRenderer(); r.setColor(colors[i]); r.setPointStyle(styles[i]); renderer.addSeriesRenderer(r); } } /** * Sets a few of the series renderer settings. * * @param renderer the renderer to set the properties to * @param title the chart title * @param xTitle the title for the X axis * @param yTitle the title for the Y axis * @param xMin the minimum value on the X axis * @param xMax the maximum value on the X axis * @param yMin the minimum value on the Y axis * @param yMax the maximum value on the Y axis * @param axesColor the axes color * @param labelsColor the labels color */ protected void setChartSettings(XYMultipleSeriesRenderer renderer, String title, String xTitle, String yTitle, double xMin, double xMax, double yMin, double yMax, int axesColor, int labelsColor) { renderer.setChartTitle(title); renderer.setXTitle(xTitle); renderer.setYTitle(yTitle); renderer.setXAxisMin(xMin); renderer.setXAxisMax(xMax); renderer.setYAxisMin(yMin); renderer.setYAxisMax(yMax); renderer.setAxesColor(axesColor); renderer.setLabelsColor(labelsColor); } /** * Builds an XY multiple time dataset using the provided values. * * @param titles the series titles * @param xValues the values for the X axis * @param yValues the values for the Y axis * @return the XY multiple time dataset */ protected XYMultipleSeriesDataset buildDateDataset(String[] titles, List<Date[]> xValues, List<double[]> yValues) { XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset(); int length = titles.length; for (int i = 0; i < length; i++) { TimeSeries series = new TimeSeries(titles[i]); Date[] xV = xValues.get(i); double[] yV = yValues.get(i); int seriesLength = xV.length; for (int k = 0; k < seriesLength; k++) { series.add(xV[k], yV[k]); } dataset.addSeries(series); } return dataset; } /** * Builds a category series using the provided values. * * @param titles the series titles * @param values the values * @return the category series */ protected CategorySeries buildCategoryDataset(String title, double[] values) { CategorySeries series = new CategorySeries(title); int k = 0; for (double value : values) { series.add("Project " + ++k, value); } return series; } /** * Builds a multiple category series using the provided values. * * @param titles the series titles * @param values the values * @return the category series */ protected MultipleCategorySeries buildMultipleCategoryDataset(String title, List<String[]> titles, List<double[]> values) { MultipleCategorySeries series = new MultipleCategorySeries(title); int k = 0; for (double[] value : values) { series.add(2007 + k + "", titles.get(k), value); k++; } return series; } /** * Builds a category renderer to use the provided colors. * * @param colors the colors * @return the category renderer */ protected DefaultRenderer buildCategoryRenderer(int[] colors) { DefaultRenderer renderer = new DefaultRenderer(); renderer.setLabelsTextSize(15); renderer.setLegendTextSize(15); renderer.setMargins(new int[] { 20, 30, 15, 0 }); for (int color : colors) { SimpleSeriesRenderer r = new SimpleSeriesRenderer(); r.setColor(color); renderer.addSeriesRenderer(r); } return renderer; } /** * Builds a bar multiple series dataset using the provided values. * * @param titles the series titles * @param values the values * @return the XY multiple bar dataset */ protected XYMultipleSeriesDataset buildBarDataset(String[] titles, List<double[]> values) { XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset(); int length = titles.length; for (int i = 0; i < length; i++) { CategorySeries series = new CategorySeries(titles[i]); double[] v = values.get(i); int seriesLength = v.length; for (int k = 0; k < seriesLength; k++) { series.add(v[k]); } dataset.addSeries(series.toXYSeries()); } return dataset; } /** * Builds a bar multiple series renderer to use the provided colors. * * @param colors the series renderers colors * @return the bar multiple series renderer */ protected XYMultipleSeriesRenderer buildBarRenderer(int[] colors) { XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer(); renderer.setAxisTitleTextSize(16); renderer.setChartTitleTextSize(20); renderer.setLabelsTextSize(15); renderer.setLegendTextSize(15); int length = colors.length; for (int i = 0; i < length; i++) { SimpleSeriesRenderer r = new SimpleSeriesRenderer(); r.setColor(colors[i]); renderer.addSeriesRenderer(r); } return renderer; } }
然后就是自定义的内容了,包括折线图的数据、样式等内容,具体详见代码注释
LinearChart.java
import java.util.ArrayList; import java.util.List; import org.achartengine.ChartFactory; import org.achartengine.chart.PointStyle; import org.achartengine.renderer.XYMultipleSeriesRenderer; import org.achartengine.renderer.XYSeriesRenderer; import android.content.Context; import android.content.Intent; import android.graphics.Color; import android.graphics.Paint.Align; public class LineChart extends AbstractDemoChart { public String getName() { return "曲线A"; } public String getDesc() { return "曲线A"; } /** * Executes the chart demo. * * @param context the context * @return the built intent */ public Intent execute(Context context, ArrayList<Float> standar, ArrayList<Float> collect) { ArrayList<Float> standardValues = standar; ArrayList<Float> collectValues = collect; int l = standardValues.size(); double[] standards = new double[l]; double[] collects = new double[l]; int maxS,minS,maxC,minC; for (int i = 0; i < l; i++) { standards[i] = standardValues.get(i); collects[i] = collectValues.get(i); } maxS = (int)DataUtil.getMax(standards); minS = (int)DataUtil.getMin(standards); maxC = (int)DataUtil.getMax(collects); minC = (int)DataUtil.getMin(collects); // 每个item的title String[] titles = new String[] { "采集值——标准值"}; // x轴的值 List<double[]> x = new ArrayList<double[]>(); x.add(collects); // y轴的值 List<double[]> values = new ArrayList<double[]>(); values.add(standards); int[] colors = new int[] { Color.BLUE}; // 点的样式 PointStyle[] styles = new PointStyle[] { PointStyle.DIAMOND}; XYMultipleSeriesRenderer renderer = buildRenderer(colors, styles); int length = renderer.getSeriesRendererCount(); // 点是空心还是实心 for (int i = 0; i < length; i++) { ((XYSeriesRenderer) renderer.getSeriesRendererAt(i)).setFillPoints(true); } // 图表部分的背景颜色 renderer.setBackgroundColor(Color.parseColor("#f3f3f3")); renderer.setApplyBackgroundColor(true); // 图表与屏幕四边的间距颜色 renderer.setMarginsColor(Color.argb(0, 0xF3, 0xF3, 0xF3)); renderer.setChartTitleTextSize(30); renderer.setAxisTitleTextSize(25); // renderer.setLegendHeight(50); // 图例文字的大小 renderer.setLegendTextSize(20); renderer.setMargins(new int[] { 50, 50, 50, 30 }); // x、y轴上刻度颜色 renderer.setXLabelsColor(Color.BLACK); renderer.setYLabelsColor(0, Color.BLACK); // 最后两个参数代表轴的颜色和轴标签的颜色 setChartSettings(renderer, "校准曲线", "采集值", "标准值", minC, maxC, minS, maxS, Color.BLACK, Color.BLACK); // 轴上数字的数量 renderer.setXLabels(12); renderer.setYLabels(10); // 是否显示网格 renderer.setShowGrid(true); // x或y轴上数字的方向,相反的。 renderer.setXLabelsAlign(Align.RIGHT); renderer.setYLabelsAlign(Align.RIGHT); // 有问题的方法 renderer.setZoomButtonsVisible(true); renderer.setZoomEnabled(true); renderer.setAntialiasing(true); // renderer.setPanLimits(new double[] { -10, 20, -10, 40 }); // renderer.setZoomLimits(new double[] { -10, 20, -10, 40 }); Intent intent = ChartFactory.getLineChartIntent(context, buildDataset(titles, x, values), renderer, "曲线"); return intent; } @Override public Intent execute(Context context) { // TODO Auto-generated method stub return null; } }
因为要调用到"org.achartengine.GraphicalActivity“类,所以不要忘记在manifest中添加 <activity android:name="org.achartengine.GraphicalActivity" />说明,否则会报错。
相关文章推荐
- android通过achartengine-1.0.0.jar做图形报表
- Android 借助aChartEngine实现饼图,折线图,柱状图
- android achartengine折线图
- Android achartengine统计图
- AChartEngine(Android的一个开源图表库)
- android achartengine学习笔记
- achartengine画出动态折线图
- 最好用的图表库图形库 for Android - the Best Chart Engine for Android
- Android 统计图表引擎 AChartEngine(三) - 示例源码折线图、饼图和柱状图
- 某android平板项目开发笔记----aChartEngine图表显示(2)
- 某android平板项目开发笔记----aChartEngine图表显示(1)
- Android 的第三方报表组件,AChartEngine 案列demo
- 某android平板项目开发笔记----aChartEngine图表显示(1)
- achartengine画出动态折线图的效果
- 通过创建一个位图的XY Chart来学习Android绘图类Rect,Paint,Bitmap,Canvas(附源码)
- [转]通过创建一个位图的XY Chart来学习Android绘图类Rect,Paint,Bitmap,Canvas(附源码)
- 通过创建一个位图的XY Chart来学习Android绘图类Rect,Paint,Bitmap,Canvas(附源码)
- 某android平板项目开发笔记----aChartEngine图表显示(2)
- 某android平板项目开发笔记----aChartEngine图表显示
- 某android平板项目开发笔记----aChartEngine图表显示(2)