当 scrollToEnd 为真时,GraphView 在实时模式下显示错误的图形
GraphView shows wrong graph in real time mode when scrollToEnd is 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
为真时轴不会更新。
有什么办法可以解决这个问题吗?
谢谢!
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 timestamp
另请参阅:Accelerometer SensorEvent timestamp
我使用 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
为真时轴不会更新。
有什么办法可以解决这个问题吗? 谢谢!
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 timestamp
另请参阅:Accelerometer SensorEvent timestamp