我已经成功实现了 aleph_null 解决方案,在这里我将添加一些已接受的解决方案中未提及的细节:
要使上述解决方案起作用,您需要实现 android.hardware.SensorEventListener 接口。
您还需要在 onResume 和 onPause 方法中注册到 SensorEventListener,如下所示:
@Override
protected void onResume() {
super.onResume();
mSensorManager.registerListener(this,
mRotVectSensor,
SensorManager.SENSOR_STATUS_ACCURACY_LOW);
}
@Override
protected void onPause() {
// unregister listener
super.onPause();
mSensorManager.unregisterListener(this);
}
“@Bytecode”注意事项:为避免闪烁,请为采样周期使用低值,例如 SensorManager.SENSOR_STATUS_ACCURACY_LOW。
我还注意到传感器发送的数据有时比设备可以处理的多,因此,地图相机开始以一种奇怪的方式移动!
为了控制 onSensorChanged 处理的数据量,我建议以下实现:
@Override
public void onSensorChanged(SensorEvent event) {
if(event.sensor.getType() == Sensor.TYPE_ROTATION_VECTOR) {
SensorManager.getRotationMatrixFromVector(
mRotationMatrix, event.values);
float[] orientation = new float[3];
SensorManager.getOrientation(mRotationMatrix, orientation);
if (Math.abs(Math.toDegrees(orientation[0]) - angle) > 0.8) {
float bearing = (float) Math.toDegrees(orientation[0]) + mDeclination;
updateCamera(bearing);
}
angle = Math.toDegrees(orientation[0]);
}
}