AChartEngine之动态折线图

本文介绍了一个使用Java实现的动态图表更新程序。通过Timer和Handler机制定时生成随机数据并更新图表,展示了如何创建XYSeries和XYMultipleSeriesDataset来绘制动态曲线图,并对图表样式进行了详细配置。
public class MainActivity extends AppCompatActivity {
    private Timer timer = new Timer();
    private TimerTask task;
    private Handler handler;
    private String title = "随机数";
    private XYSeries series;
    private XYMultipleSeriesDataset mDataset;
    private GraphicalView chart;
    private XYMultipleSeriesRenderer renderer;

    private int addX = -1, addY;

    int[] xv = new int[100];
    int[] yv = new int[100];
   private LinearLayout layout1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        layout1 = (LinearLayout) findViewById(R.id.chart);
        //这个类用来放置曲线上的所有点,是一个点的集合,根据这些点画出曲线
        series = new XYSeries(title);
        //创建一个数据集的实例,这个数据集将被用来创建图表
        mDataset = new XYMultipleSeriesDataset();
        //将点集添加到这个数据集中
        mDataset.addSeries(series);
        //以下都是曲线的样式和属性等等的设置,renderer相当于一个用来给图表做渲染的句柄
        int color = Color.GREEN;
        PointStyle style = PointStyle.CIRCLE;
        renderer = buildRenderer(color, style, true);
        //设置好图表的样式
        setChartSettings(renderer, "X", "Y", 0, 100, 0, 90, Color.WHITE, Color.WHITE);
        //生成图表
        chart =ChartFactory.getLineChartView(this,mDataset,renderer);
       // chart = ChartFactory.getTimeChartView(this, getDateDemoDataset(), getDemoRenderer(), "mm:ss");
        layout1.addView(chart, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT));
   ;  //这里的Handler实例将配合下面的Timer实例,完成定时更新图表的功能
        handler = new Handler() {
            @Override
            public void handleMessage(Message msg)
            {
                //刷新图表
                updateChart();
                super.handleMessage(msg);
            }
        };

        task = new TimerTask() {
            @Override
            public void run() {
                Message message = new Message();
                message.what = 1;
                handler.sendMessage(message);
            }
        };

        timer.schedule(task, 500, 500);
    }
    protected XYMultipleSeriesRenderer buildRenderer(int color, PointStyle style, boolean fill) {
        XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer();

        //设置图表中曲线本身的样式,包括颜色、点的大小以及线的粗细等
        XYSeriesRenderer r = new XYSeriesRenderer();
        r.setColor(color);
        r.setPointStyle(style);
        r.setFillPoints(fill);
        r.setLineWidth(5);
        renderer.addSeriesRenderer(r);

        return renderer;
    }
    protected void setChartSettings(XYMultipleSeriesRenderer renderer, String xTitle, String yTitle,
                                    double xMin, double xMax, double yMin, double yMax, int axesColor, int labelsColor) {
        //有关对图表的渲染可参看api文档
        renderer.setChartTitle(title);
        renderer.setXTitle(xTitle);
        renderer.setYTitle(yTitle);
        renderer.setXAxisMin(xMin);
        renderer.setXAxisMax(xMax);
        renderer.setYAxisMin(yMin);
        renderer.setYAxisMax(yMax);
        renderer.setAxesColor(Color.BLACK);//设置坐标轴颜色
        renderer.setLabelsColor(labelsColor);
        renderer.setXLabelsColor(Color.BLACK);
        renderer.setYLabelsColor(0,Color.BLACK);
        //网格线
        //renderer.setShowGrid(true);
      //  renderer.setGridColor(Color.GREEN);
        renderer.setXLabels(20);
        renderer.setYLabels(10);
       // renderer.setXTitle("间隔");
        renderer.setYTitle("dBm");
        renderer.setYLabelsAlign(Align.RIGHT);
        renderer.setPointSize((float) 2);
        renderer.setShowLegend(false);
        renderer.setPanEnabled(true,true);
        //renderer.setBackgroundColor(Color.WHITE);
        renderer.setLabelsTextSize(20.0f);
        renderer.setMarginsColor(Color.WHITE);
        //renderer.setAxisTitleTextSize(16.0f);


//        render = new XYMultipleSeriesRenderer();
//        render.setChartTitle("光照度实时曲线");
//        render.setChartTitleTextSize(20);//设置整个图表标题文字的大小
//        render.setAxisTitleTextSize(16);//设置轴标题文字的大小
//        render.setAxesColor(Color.BLACK);
//        render.setXTitle("时间");
//        render.setYTitle("光照度");
//
//        render.setLabelsTextSize(16);//设置轴刻度文字的大小
//        render.setLabelsColor(Color.BLACK);
//        render.setXLabelsColor(Color.BLACK);
//        render.setYLabelsColor(0, Color.BLACK);
//        render.setLegendTextSize(15);//设置图例文字大小
//        //render.setShowLegend(false);//显示不显示在这里设置,非常完美
//
//        XYSeriesRenderer r = new XYSeriesRenderer();//设置颜色和点类型
//        r.setColor(Color.RED);
//        r.setPointStyle(PointStyle.CIRCLE);
//        r.setFillPoints(true);
//        r.setChartValuesSpacing(3);
//
//        render.addSeriesRenderer(r);
//        render.setYLabelsAlign(Align.RIGHT);//刻度值相对于刻度的位置
//        render.setShowGrid(true);//显示网格
//        render.setYAxisMax(12);//设置y轴的范围
//        render.setYAxisMin(-2);
//        render.setYLabels(7);//分七等份
//
//
//        render.setInScroll(true);
//        render.setLabelsTextSize(14);
//        render.setLabelsColor(Color.BLACK);
//        //render.getSeriesRendererAt(0).setDisplayChartValues(true); //显示折线上点的数值
//        render.setPanEnabled(false,false);//禁止报表的拖动
//        render.setPointSize(5f);//设置点的大小(图上显示的点的大小和图例中点的大小都会被设置)
//        render.setMargins(new int[]{20,30,90,10}); //设置图形四周的留白
//        render.setMarginsColor(Color.WHITE);
//        render.setXLabels(0);// 取消X坐标的数字zjk,只有自己定义横坐标是才设为此值


    }
    private void updateChart() {
        //设置好下一个需要增加的节点
        addX = 0;
        addY = (int)(Math.random() * 90);
       // addY=new Random().nextInt(5) + 1;
        //移除数据集中旧的点集
        mDataset.removeSeries(series);
        //判断当前点集中到底有多少点,因为屏幕总共只能容纳100个,所以当点数超过100时,长度永远是100
        int length = series.getItemCount();
        if (length > 100) {
            length = 100;
        }
        //将旧的点集中x和y的数值取出来放入backup中,并且将x的值加1,造成曲线向右平移的效果
        for (int i = 0; i < length; i++) {
            xv[i] = (int) series.getX(i) + 1;
            yv[i] = (int) series.getY(i);
        }
        //点集先清空,为了做成新的点集而准备
        series.clear();

        //将新产生的点首先加入到点集中,然后在循环体中将坐标变换后的一系列点都重新加入到点集中
        //这里可以试验一下把顺序颠倒过来是什么效果,即先运行循环体,再添加新产生的点
        series.add(addX, addY);
        for (int k = 0; k < length; k++) {
            series.add(xv[k], yv[k]);
        }
        //在数据集中添加新的点集
        mDataset.addSeries(series);

        //视图更新,没有这一步,曲线不会呈现动态
        //如果在非UI主线程中,需要调用postInvalidate(),具体参考api
        chart.invalidate();
    }

    @Override
    public void onDestroy() {
        //当结束程序时关掉Timer
        timer.cancel();
        super.onDestroy();
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值