Я беру датчик акселерометра и представляю график в реальном времени, используя библиотеку 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.
Есть ли способ победить проблему? Благодарю вас!