Android开发进阶系列(十) 玩转AChartEngine专题(下)

本文介绍了一个电力数据实时监测项目的实现,包括三种不同显示需求的图表:实时往前推的柱状图、实时往后更新的曲线图以及全屏折线图。详细展示了初始化代码、数据更新代码以及关键配置细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第二个项目是电力数据实时监测相关的,数据就不是从本机上读取了,而是连接到服务器与后台数据库交互。下面是三个界面对应的三种不同的显示需求:

1. 实时往前推的柱状图

这里写图片描述

初始化代码:

    //画曲线
    private View InitRenderer() {
        /*  achartengine-1.1.0
         * 
         */     
        // 设置Renderer
        renderer = new XYMultipleSeriesRenderer();
        renderer.setAxisTitleTextSize(16);
        renderer.setChartTitleTextSize(20);
        renderer.setLabelsTextSize(15);
        renderer.setLegendTextSize(15);
        renderer.setPointSize(5f);
        renderer.setMargins(new int[] { 0, 0, 0,0 });
        renderer.setMarginsColor(0xff307B63); // 外部颜色,X轴坐标
        renderer.setBackgroundColor(0xff41968D); // 内部底色
        renderer.setApplyBackgroundColor(true); //内部底色

        // Color 和 Point Style
        XYSeriesRenderer r = new XYSeriesRenderer();
        r.setColor(0xffEDEDED);
        r.setPointStyle(PointStyle.POINT); // 点的形状
        r.setFillPoints(true); // 实心点
        r.setDisplayChartValues(false);// 设置不显示数值
        renderer.addSeriesRenderer(r);
        // Chart Settings
        renderer.setChartTitle(""); // 不显示Title
        renderer.setXTitle("");
        renderer.setYTitle("");
        //renderer.setXAxisMin(0);
        renderer.setXAxisMax(barDataCount);
        renderer.setYAxisMin(0);
        //renderer.setYAxisMax(10);
        renderer.setXLabelsColor(Color.WHITE);
        renderer.setAxesColor(Color.WHITE);
        renderer.setLabelsColor(Color.WHITE);
        //
        renderer.setXLabels(0); //设置x轴显示刻度标签的个数,根据setChartSettings的最大值和最小值自动计算点的间隔  
        renderer.setYLabels(5); //设置y轴显示5个点,根据setChartSettings的最大值和最小值自动计算点的间隔  
        renderer.setShowGrid(false); //是否显示网格
        renderer.setXLabelsAlign(Align.LEFT); //刻度线与刻度标注之间的相对位置关系
        renderer.setYLabelsAlign(Align.LEFT); //刻度线与刻度标注之间的相对位置关系
        renderer.setPanEnabled(false);
        renderer.setZoomEnabled(false);
        renderer.setZoomButtonsVisible(false); // 滑动和放大缩小
        renderer.setClickEnabled(false); // 不允许点击
        renderer.setShowLegend(false); // 不显示图例
        renderer.setShowAxes(false); // 是否显示坐标轴的轴线
        renderer.setShowLabels(false); // 是否显示坐标轴区域,包括轴线和坐标值
        //renderer.setMargins(new int[]{0,10,0,10});//上,左,下,右的边距
        renderer.setBarSpacing(0.2f); // BarChart的条状间距
        renderer.setBarWidth(5.0f); // barchart的宽度
        // DataSet 初始化
        FusionField.realtotaldata = new XYMultipleSeriesDataset();
        SetDataSeries();
        //View view = ChartFactory.getLineChartView(this, FusionField.realtotaldata, renderer);
        View view = ChartFactory.getBarChartView(this, FusionField.realtotaldata, renderer, Type.DEFAULT); // 柱状图需要设置

        //View view = ChartFactory.getCubeLineChartView(this, FusionField.dataset, renderer, 0.3f);//0.3f标示曲线的平滑度
        return view;
    }

更新数据的代码:

private void SetDataSeries() {
        XYSeries series = new XYSeries("实时总功率");
        for (int k = 0; k < barDataCount; k++) {
            series.add(k, FusionField.total20RealPower[k]); 
        }
        FusionField.realtotaldata.addSeries(series);
    }

    private void UpdateDataSeries() {
        XYSeries series = (XYSeries) FusionField.realtotaldata.getSeries()[0];
        if(series!=null) {
            series.clear();
            for (int k = 0; k < barDataCount; k++) {
                series.add(k, FusionField.total20RealPower[k]);
            }
        } else
            SetDataSeries();
    }

2. 实时往后更新的曲线图

这里写图片描述

初始化代码:

    //画曲线
    private View InitRenderer() {
        /*  achartengine-1.1.0
         * 
         */     
        // X轴数据
        long now = Math.round(new Date().getTime() / DAY) * DAY - ZONEGAP; // 今日0点,-ZONEGAP是减去8小时时差
        dates = new Date[COUNT5MINUTES];
        for (int i = 0; i < COUNT5MINUTES; i++) {
            dates[i] = new Date(now + i * MINUTE5);
        }
        // 设置Renderer
        renderer = new XYMultipleSeriesRenderer();
        renderer.setAxisTitleTextSize(16);
        renderer.setChartTitleTextSize(20);
        renderer.setLabelsTextSize(15);
        renderer.setLegendTextSize(15);
        renderer.setPointSize(5f);
        renderer.setMargins(new int[] { 0, 0, 0,0 });
        renderer.setMarginsColor(0xff307B63); // 外部颜色,X轴坐标
        renderer.setBackgroundColor(0xff41968D); // 内部底色
        renderer.setApplyBackgroundColor(true); //内部底色

        // Color 和 Point Style
        XYSeriesRenderer r = new XYSeriesRenderer();
        r.setColor(Color.WHITE);
        r.setPointStyle(PointStyle.POINT); // 点的形状
        r.setFillPoints(true); // 实心点
        r.setDisplayChartValues(true);// 设置显示数值
        r.setLineWidth(3);          
        renderer.addSeriesRenderer(r);

        // Chart Settings
        renderer.setChartTitle("总功率"); // 不显示Title
        renderer.setXTitle("");
        renderer.setYTitle("");
        renderer.setXAxisMin(dates[0].getTime());
        renderer.setXAxisMax(dates[COUNT5MINUTES - 1].getTime());
        renderer.setYAxisMin(0);
        //renderer.setYAxisMax(10);
        renderer.setXLabelsColor(Color.WHITE);
        renderer.setAxesColor(Color.WHITE);
        renderer.setLabelsColor(Color.GREEN);
        //
        renderer.setXLabels(12); //设置x轴显示12个点,根据setChartSettings的最大值和最小值自动计算点的间隔  
        renderer.setYLabels(5); //设置y轴显示10个点,根据setChartSettings的最大值和最小值自动计算点的间隔  
        renderer.setShowGrid(false); //是否显示网格
        renderer.setXLabelsAlign(Align.LEFT); //刻度线与刻度标注之间的相对位置关系
        renderer.setYLabelsAlign(Align.RIGHT); //刻度线与刻度标注之间的相对位置关系
        renderer.setPanEnabled(false);
        renderer.setZoomEnabled(false);
        renderer.setZoomButtonsVisible(false); // 滑动和放大缩小
        renderer.setClickEnabled(true); // 不允许点击
        renderer.setShowLegend(false); // 不显示图例
        renderer.setShowAxes(false);
        //renderer.setShowLabels(false);
        // DataSet 初始化
        FusionField.dataset = new XYMultipleSeriesDataset();
        SetDataSeries();
        View view = ChartFactory.getTimeChartView(this, FusionField.dataset, renderer, "H:mm");
        //View view = ChartFactory.getBarChartView(this, FusionField.dataset, renderer, Type.DEFAULT); // 柱状图需要设置

        //View view = ChartFactory.getCubeLineChartView(this, FusionField.dataset, renderer, 0.3f);//0.3f标示曲线的平滑度
        return view;
      }

数据更新的代码:

    private void SetDataSeries() {
        TimeSeries series = new TimeSeries("实时总功率");
        int seriesLength = dates.length;
        for (int k = 0; k < seriesLength; k++) {
            //series.add(dates[k], FusionField.realPower[k]); 
            series.add(dates[k], MathHelper.NULL_VALUE);  
        }
        FusionField.dataset.addSeries(series);
    }

    private void UpdateDataSeries() {
        TimeSeries series = (TimeSeries) FusionField.dataset.getSeries()[0];
        if(series!=null) {
            series.clear();
            int seriesLength = dates.length;
            for (int k = 0; k < seriesLength; k++) {
                series.add(dates[k], FusionField.realPower[k]);
            }
        } else
            SetDataSeries();
    }

全屏折线图

这里写图片描述

在这张图上,显示了放大缩小按钮,也支持手势放大缩小操作。

初始化代码:

private View InitRenderer() {
        /*  achartengine-1.1.0
         * 
         */

        // X轴数据
        long now = Math.round(new Date().getTime() / DAY) * DAY - ZONEGAP; // 今日0点,-ZONEGAP是减去8小时时差
        dates = new Date[COUNT5MINUTES];
        for (int i = 0; i < COUNT5MINUTES; i++) {
            dates[i] = new Date(now + i * MINUTE5);
        }
        // 设置Renderer
        renderer = new XYMultipleSeriesRenderer();
        renderer.setAxisTitleTextSize(16);
        renderer.setChartTitleTextSize(20);
        renderer.setLabelsTextSize(15);
        //renderer.setLegendTextSize(15);
        renderer.setPointSize(5f);
        renderer.setMargins(new int[] { 20, 50, 15, 20 });

        // Color 和 Point Style
        XYSeriesRenderer r = new XYSeriesRenderer();
        r.setColor(Color.GREEN);
        r.setPointStyle(PointStyle.POINT); // 点的形状
        r.setFillPoints(true); // 实心点
        r.setDisplayChartValues(true);// 设置显示数值
        renderer.addSeriesRenderer(r);
        // Chart Settings
        renderer.setChartTitle(""); // 不显示Title
        renderer.setXTitle("时间");
        renderer.setYTitle("kW");
        renderer.setXAxisMin(dates[0].getTime());
        renderer.setXAxisMax(dates[COUNT5MINUTES - 1].getTime());
        renderer.setYAxisMin(0);
        //renderer.setYAxisMax(10);
        renderer.setAxesColor(Color.WHITE);
        renderer.setLabelsColor(Color.WHITE);
        renderer.setZoomButtonsVisible(true);
        //
        renderer.setXLabels(24); //设置x轴显示12个点,根据setChartSettings的最大值和最小值自动计算点的间隔  
        renderer.setYLabels(10); //设置y轴显示10个点,根据setChartSettings的最大值和最小值自动计算点的间隔  
        renderer.setShowGrid(true); //是否显示网格
        renderer.setXLabelsAlign(Align.CENTER); //刻度线与刻度标注之间的相对位置关系
        renderer.setYLabelsAlign(Align.RIGHT); //刻度线与刻度标注之间的相对位置关系
        //renderer.setPanLimits(new double[] { 0, 0, 0, MathHelper.NULL_VALUE }); //设置拖动时X轴Y轴允许的最大值最小值.  
        //renderer.setZoomLimits(new double[] {  0, 0, 0, MathHelper.NULL_VALUE });//设置放大缩小时X轴Y轴允许的最大最小值.
        renderer.setShowLegend(false); // 不显示图例
        // DataSet 初始化
        FusionField.dataset = new XYMultipleSeriesDataset();
        SetDataSeries();
        View view = ChartFactory.getTimeChartView(this, FusionField.dataset, renderer, "H:mm");
        //View view = ChartFactory.getCubeLineChartView(this, FusionField.dataset, renderer, 0.3f);//0.3f标示曲线的平滑度
        return view;
    }

数据更新代码:

    private void SetDataSeries() {
        TimeSeries series = new TimeSeries(title);
        int seriesLength = dates.length;
        for (int k = 0; k < seriesLength; k++) {
            series.add(dates[k], FusionField.realPower[k]);
        }
        FusionField.dataset.addSeries(series);
    }

    private void UpdateDataSeries() {
        TimeSeries series = (TimeSeries) FusionField.dataset.getSeries()[0];
        if(series!=null) {
            series.clear();
            int seriesLength = dates.length;
            for (int k = 0; k < seriesLength; k++) {
                series.add(dates[k], FusionField.realPower[k]);
            }
        } else
            SetDataSeries();
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值