3

MPAndroidChartを使用して、加速度計データのリアルタイム プロットを作成しています。アプリを実行したままにしておくと、メモリ使用量が継続的に増加するように思われるため、チャートのスクロール ウィンドウから見えなくなった古いデータ ポイントを削除する方法を見つけようとしました。

問題は、保持/表示するポイントの最大数に設定した制限に達すると、ポイントは追加されなくなりますが、チャートはスクロールし続けることです。データのサイズは一定のままです (更新ごとに新しいポイントを追加し、古いポイントを削除しているため) が、チャートに新しいデータが表示されなくなりました。

私のフラグメントでは、次のようなチャートを作成してい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。これらの行をすべてコメント解除すると、データがプロットされ続けます。シリーズの 1 つだけのコメントを外すremoveFirstと、その 1 つが正常にプロットされますが、上記で説明したように他の 2 つが空です

4

1 に答える 1

0

data.notifyDataChanged()エントリを追加した後、直接呼び出してみてください。

于 2016-02-28T19:54:28.873 に答える