Android中图形的绘制------AchartEngine框架

上一篇介绍了通过自定义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;
    }
}
下面是三种的效果图:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值