上一篇介绍了通过自定义View进行图形的绘制,这篇介绍另外一种绘图方式,通过ACE技术,即AchartEngine框架。这是一个非常强大的绘图框架,利用此框架支持折线图、面积图、散点图、时间图、柱状图、条图、饼图、气泡图、圆环图、范围(高至低)条形图、拨号图/表、立方线图及各种图的结合等。此工具的使用非常简单,只需下载一个AchartEngine的jar包,添加到工程中的libs中就可以放心的使用了。这里,主要尝试了三种最长用的图形,折线图,柱形图和饼状图。里面几乎每一句代码都有介绍,这里就不再赘述,下面是代码:
1、主函数:
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void btnClick(View view){ switch (view.getId()){ case R.id.btn1://柱状图 Intent barIntent = new BarChart().getIntent(this); startActivity(barIntent); break; case R.id.btn2://折线图 Intent lineIntent = new LineChart().getIntent(this); startActivity(lineIntent); break; case R.id.btn3://饼状图 Intent PieIntent = new CategoryChart().getIntent(this); startActivity(PieIntent); break; } } }2、主函数的布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.example.wls.achartengine.MainActivity"> <Button android:id="@+id/btn1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="柱状图" android:layout_margin="10dp" android:onClick="btnClick"/> <Button android:id="@+id/btn2" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="折线图" android:layout_margin="10dp" android:onClick="btnClick"/> <Button android:id="@+id/btn3" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="饼状图" android:layout_margin="10dp" android:onClick="btnClick"/> </LinearLayout>3、自定义的一个接口:、
public interface AchartAbstract { /** * 获取一个当前类型图标的Intent实例 * @param context * @return */ Intent getIntent(Context context); }4、折线图的绘制的代码:
public class LineChart implements AchartAbstract{ private Intent mIntent; private Random random; @Override public Intent getIntent(Context context) { mIntent = ChartFactory.getLineChartIntent(context,getDataSet(),getReaderer()); return mIntent; } /** * 构造数据 * @return */ public XYMultipleSeriesDataset getDataSet(){ XYMultipleSeriesDataset lineDataSet = new XYMultipleSeriesDataset(); random = new Random(); for(int i = 0; i < 2; i++){ XYSeries series = new XYSeries("text" + (i + 1)); //填充数据 for(int k = 0; k < 10; k++){ //设置X,Y值 series.add(k,20 + random.nextInt()%100); } //将需要绘制的点放进lineDataSet中 lineDataSet.addSeries(series); } return lineDataSet; } /** * 构造渲染器 * @return */ public XYMultipleSeriesRenderer getReaderer(){ XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer(); //设置X轴最小数字和最大数字 renderer.setXAxisMin(0); renderer.setXAxisMax(10); //设置Y轴最小数字和最大数字 renderer.setYAxisMin(0); renderer.setYAxisMax(200); //设置X轴,Y轴单位字体大小 renderer.setAxisTitleTextSize(30); //刻度值与X轴坐标文字左对齐 renderer.setXLabelsAlign(Paint.Align.CENTER); //Y轴与Y轴坐标文字左对齐 renderer.setYLabelsAlign(Paint.Align.LEFT); //设置背景颜色 renderer.setApplyBackgroundColor(true); renderer.setBackgroundColor(Color.BLACK); //是否显示缩小放大按钮 renderer.setZoomButtonsVisible(true); //设置渲染器允许缩小放大 renderer.setZoomEnabled(true); //设置边距 renderer.setMargins(new int[]{20,10,10,10}); /** * renderer.setShowGrid(true);是否显示网格 * renderer.setShowGridX(true);显示x线 * renderer.setShowGridY(true);显示y线 */ renderer.setShowGrid(true); //网格颜色 renderer.setGridColor(Color.GREEN); //对绘制的点进行设置 XYSeriesRenderer xyRender = new XYSeriesRenderer(); //设置点的颜色 xyRender.setColor(Color.BLUE); //设置点的样式 xyRender.setPointStyle(PointStyle.SQUARE); //设置每个点都显示坐标 xyRender.setDisplayChartValues(true); //设置点的字体大小 xyRender.setChartValuesTextSize(20); //将要会绘制的点添加到坐标绘制中 renderer.addSeriesRenderer(xyRender); XYSeriesRenderer xySeriesRenderer = new XYSeriesRenderer(); xySeriesRenderer.setColor(Color.RED); xySeriesRenderer.setPointStyle(PointStyle.CIRCLE); renderer.addSeriesRenderer(xySeriesRenderer); return renderer; } }5、柱型图的绘制:
public class BarChart implements AchartAbstract{ private Intent mIntent; @Override public Intent getIntent(Context context) { mIntent = ChartFactory.getBarChartIntent(context,getDataSet(),getReaderer(), org.achartengine.chart.BarChart.Type.STACKED,"当月开票票金额树状图"); return mIntent; } /** * 构造数据 * @return */ public XYMultipleSeriesDataset getDataSet(){ XYMultipleSeriesDataset barDataSet = new XYMultipleSeriesDataset(); CategorySeries barSeries = new CategorySeries("2017年2月"); barSeries.add(865.5969); barSeries.add(2492.6479); barSeries.add(891.0137); barSeries.add(0.0); barSeries.add(691.0568); barDataSet.addSeries(barSeries.toXYSeries()); return barDataSet; } /** * 构造渲染器 * @return */ public XYMultipleSeriesRenderer getReaderer(){ XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer(); renderer.setChartTitle("当月开票"); //设置标题的字体大小 renderer.setChartTitleTextSize(16); renderer.setXTitle("事业部"); renderer.setYTitle("单位(万元)"); renderer.setAxesColor(Color.WHITE); //X轴Y轴及图表标题颜色 renderer.setLabelsColor(Color.WHITE); //设置X轴最小数字和最大数字 renderer.setXAxisMin(0.5); renderer.setXAxisMax(5.5); //设置Y轴最小数字和最大数字 renderer.setYAxisMin(0); renderer.setYAxisMax(3000); renderer.addXTextLabel(1,"电网"); renderer.addXTextLabel(2,"通信"); renderer.addXTextLabel(3,"宽带"); renderer.addXTextLabel(4,"专网"); renderer.addXTextLabel(5,"轨交"); //是否显示缩小放大按钮 renderer.setZoomButtonsVisible(true); //设置渲染器允许缩小放大 renderer.setZoomEnabled(true); //消除锯齿 renderer.setAntialiasing(true); //设置背景颜色 renderer.setApplyBackgroundColor(true); renderer.setBackgroundColor(Color.RED); //设置每个柱子的颜色 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(Paint.Align.CENTER); //Y轴与Y轴坐标文字左对齐 renderer.setYLabelsAlign(Paint.Align.LEFT); //允许左右拖动,但不允许上下拖动 renderer.setPanEnabled(true,false); //柱子间宽度 renderer.setBarWidth(80); //设置X轴,Y轴单位字体大小 renderer.setAxisTitleTextSize(30); //是否显示网格 renderer.setShowGrid(true); renderer.setGridColor(Color.BLACK); //调整合适的位置 renderer.setFitLegend(true); //设置图标外的颜色 renderer.setMarginsColor(Color.GRAY); //设置外边距 renderer.setMargins(new int[]{160,40,10,10}); return renderer; } }6、饼状图的绘制:
public class CategoryChart implements AchartAbstract{ private Intent mIntent; private static final double [] values = {412.0,542.0,486.0,900.1}; private static final int [] colors = {Color.BLUE,Color.GREEN,Color.MAGENTA,Color.RED}; @Override public Intent getIntent(Context context) { mIntent = ChartFactory.getPieChartIntent(context,buildCategoryDataSet(values),getReaderer(),"饼状图"); return mIntent; } /** * 构造数据 * @return */ public CategorySeries buildCategoryDataSet(double [] values){ CategorySeries barSeries = new CategorySeries("测试饼状图"); barSeries.add("差",values[0]); barSeries.add("不达标",values[1]); barSeries.add("达标",values[2]); barSeries.add("优秀",values[3]); return barSeries; } /** * 构造渲染器 * @return */ public DefaultRenderer getReaderer(){ DefaultRenderer renderer = new DefaultRenderer(); //设置左下角标注的文字大小 renderer.setLegendTextSize(20); //设置显示放大缩小标注 renderer.setZoomButtonsVisible(true); //设置图标标题的文字大小 renderer.setChartTitleTextSize(30); //设置图标标题(默认居中顶部显示) renderer.setChartTitle("统计结果"); //饼图上标记文字大小 renderer.setLabelsTextSize(20); //饼图上标记文字的颜色 renderer.setLabelsColor(Color.BLACK); //设置是否可以平移 renderer.setPanEnabled(true); //设置是否显示数值 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 simpleSeriesRenderer = new SimpleSeriesRenderer(); simpleSeriesRenderer.setColor(color); renderer.addSeriesRenderer(simpleSeriesRenderer); } return renderer; } }下面是三种的效果图: