GraphView показывает неверный график в режиме реального времени, когда значение scrollToEnd равно true

Я беру датчик акселерометра и представляю график в реальном времени, используя библиотеку Graph View (4.0.1 ).

Приложение работает хорошо, за исключением того, что график неверен:

введите здесь описание изображения

Как вы можете видеть на рисунке, ось Z (пурпурный цвет) имеет значение ~ 9,8, но на графике оно показано как ~ 15, ось Y (зеленый цвет) имеет значение 0,2, но на графике мы под нулем и той же идеей с осью X.

Вот мой код:

SensorManager sensorManager;
TextView tvX, tvY, tvZ;
GraphView graph;
LineGraphSeries<DataPoint> seriesX, seriesY, seriesZ;
long startTime;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_runtime_graph);

    tvX = (TextView) findViewById(R.id.tvAcc_X);    // color : blue
    tvY = (TextView) findViewById(R.id.tvAcc_Y);    // color : green
    tvZ = (TextView) findViewById(R.id.tvAcc_Z);    // color : magenta
    graph = (GraphView) findViewById(R.id.graph);

    seriesX = new LineGraphSeries<>();
    seriesY = new LineGraphSeries<>();
    seriesZ = new LineGraphSeries<>();

    seriesX.setColor(Color.BLUE);
    seriesY.setColor(Color.GREEN);
    seriesZ.setColor(Color.MAGENTA);

    graph.addSeries(seriesX);
    graph.addSeries(seriesY);
    graph.addSeries(seriesZ);

    startTime = System.nanoTime() / 100000000;

    sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
    sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
}

@Override
public void onSensorChanged(SensorEvent event)
{
    tvX.setText(String.valueOf(event.values[0]));
    tvY.setText(String.valueOf(event.values[1]));
    tvZ.setText(String.valueOf(event.values[2]));

    updateGraph((event.timestamp / 100000000) - startTime,
            event.values[0], event.values[1], event.values[2]);
}

void updateGraph (final long timestamp, final float x, final float y, final float z)
{
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            seriesX.appendData(new DataPoint(timestamp, x), true, 40);
            seriesY.appendData(new DataPoint(timestamp, y), true, 40);
            seriesZ.appendData(new DataPoint(timestamp, z), true, 40);
        }
    });
}

Я обнаружил, что проблема возникает, когда в поле scrollToEnd установлено значение true, в противном случае график правильный. Я обнаружил еще одну проблему, которая может быть связана с тем, что ось не обновляется, когда scroolToEnd равно true.

Есть ли способ победить проблему? Благодарю вас!


person AsfK    schedule 19.10.2015    source источник


Ответы (1)


logcat показывает, почему в вашем случае не работает scrollToEnd:

GraphView: scrollToEnd works only with manual x axis bounds

чтобы установить границы оси x вручную, добавьте этот код в свой метод создания

Viewport vp = graph.getViewport();
vp.setXAxisBoundsManual(true);
vp.setMinX(0);
vp.setMaxX(1000);

но есть еще одна проблема с кодом: System.nanoTime() и event.timestamp — разные форматы времени.

System.nanoTime() // current value of system timer in nanoseconds
event.timestamp // nanoseconds since device uptime

Это не очень хорошо задокументировано: отметка времени SensorEvent.

См. также: Временная метка события датчика акселерометра

person Frank    schedule 29.10.2015
comment
Спасибо откровенно за ваш ответ. Насчет timestamp вы действительно правы; насчет bounds - это как раз проблема. Я не хочу ограничивать\определять минимальное и максимальное значения осей, потому что они меняются от датчика к датчику (может быть от 0 до 2 для одного датчика и для другого датчика от 0 до 1400). Так что, может быть, вопрос должен быть в том, как обновить Оси тоже - person AsfK; 30.10.2015
comment
Вам нужно, чтобы он был динамическим для обеих осей? Если вы установите XAxisBounds только вручную, ось Y все равно будет масштабироваться автоматически. - person Frank; 30.10.2015
comment
Да, мне нужно, чтобы обе оси были динамическими (я использую образцы датчиков в своем приложении, поэтому одна ось соответствует значениям, а вторая - отметке времени), но я попытаюсь ограничить ось X в соответствии со значением sensor.max. Большое спасибо! - person AsfK; 31.10.2015
comment
похоже, что нет возможности обновить ось, и я должен определить их, чтобы показать график времени выполнения. Благодарю вас! - person AsfK; 02.11.2015