java - MPAndroidChart - 删除实时图表中的旧数据点

标签 java android plot mpandroidchart real-time-data

我正在使用 MPAndroidChart创建一些加速度计数据的实时图。应用程序运行的时间越长,内存使用量似乎会持续增长,因此我试图找到一种方法来删除旧数据点,一旦它们不在图表滚动窗口的视野范围内。

问题是,一旦我达到了我为保留/显示的最大点数设置的限制,就不再添加点,但图表会继续滚动。我的数据大小保持不变(因为每次更新我都会添加一个新点并删除一个旧点,所以它应该如此),但是图表中不再显示新数据。

在我的 fragment 中,我在 onCreateView 中创建这样的图表:

accChart = (LineChart) view.findViewById(R.id.accChart);
        accChart.setOnChartValueSelectedListener(this);

        LineData data = new LineData();
        data.setValueTextColor(Color.WHITE);

        accChart.setData(data);

然后我使用传感器管理器监听加速度计事件,并每 100 毫秒在 onSensorChanged 中添加一个条目:

public void onSensorChanged(SensorEvent event) {
        sensor = event.sensor;

        curAccX = event.values[0];
        curAccY = event.values[1];
        curAccZ = event.values[2];

        long curTime = System.currentTimeMillis();
        long diffTime = (curTime - lastUpdate);

        // only allow one update every POLL_FREQUENCY.
        if(diffTime > POLL_FREQUENCY) {
            lastUpdate = curTime;

            addEntry(curAccX, curAccY, curAccZ);
        }

    }

然后在 addEntry 中添加条目,我正在这样做:

private void addEntry(float curAccX, float curAccY, float curAccZ){
        LineData data = accChart.getData();

        if (data != null) {

            ILineDataSet xData = data.getDataSetByIndex(0);
            ILineDataSet yData = data.getDataSetByIndex(1);
            ILineDataSet zData = data.getDataSetByIndex(2);

            if (xData == null) {
                xData = createSetX();
                data.addDataSet(xData);
            }
            if (yData == null) {
                yData = createSetY();
                data.addDataSet(yData);
            }
            if (zData == null) {
                zData = createSetZ();
                data.addDataSet(zData);
            }

            // add a new x-value first
            data.addXValue(String.valueOf(System.currentTimeMillis()));

            data.addEntry(new Entry(curAccX, xData.getEntryCount()), 0);
            data.addEntry(new Entry(curAccY, yData.getEntryCount()), 1);
            data.addEntry(new Entry(curAccZ, zData.getEntryCount()), 2);

            //This is where I remove the first entry for each series
            if (xData.getEntryCount() > MAX_POINTS_DISPLAYED){
                xData.removeFirst();
                yData.removeFirst();
                zData.removeFirst();
            }

            // let the chart know it's data has changed
            accChart.notifyDataSetChanged();

            // limit the number of visible entries
            accChart.setVisibleXRangeMaximum(MAX_POINTS_DISPLAYED);

            // move to the latest entry
            accChart.moveViewToX(data.getXValCount());
        }
    }

我认为问题出在我对removeFirst 的使用上。如果我取消注释所有这些行,数据就会不断绘制。如果我只为系列中的一个取消注释 removeFirst,那么这个系列绘制得很好,但其他 2 个是空的,正如我上面描述的那样

最佳答案

尝试在添加条目后直接调用 data.notifyDataChanged()

关于java - MPAndroidChart - 删除实时图表中的旧数据点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35682875/

相关文章:

java - android listview setadapter崩溃

java - setBackgroundResource 不起作用

python - python 中带有 slider 的散点图

matlab - 如何将(值的)标签添加到我的 MATLAB 图的顶部?

java - 解析 json url

java - 尝试解析从 ftp 下载的 xml 文件时出现 XMLStreamException

java - 无法结束我的 Android 应用程序

android - Android 中的小插图

android - 在 android 关机时调用 onDestroy

python - Pandas 系列箱线图未正确显示