我已经成功实现了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() {
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]);
}
}