android.view.onSensorChanged() 的 n 参考页,设备的轴被描述为
"X 轴是屏幕的横轴(竖屏时的小边,横屏时的长边),指向右侧。Y 轴是屏幕的竖轴,指向屏幕的顶部(即原点位于左下角)。当设备仰卧在桌子上时,Z 轴指向天空。
并且,在android.hardware.SensorManager.getOrientation()中提到,该方法将返回设备的方位角、俯仰角和滚动角,逆时针方向为正。但是,当我从代码中调用函数并打印值时,方位角和俯仰角在顺时针方向上为正,在逆时针方向上为负。通过 android.hardware.SensorManager.getRotationMatrix() 获得的旋转矩阵符合要求,如果我声称是正确的,即方位角和俯仰角在顺时针方向上为 +ve,在逆时针方向上滚动为 +ve方向。如果我错了,请纠正我。我正在使用 HTC Wildfire S,它在 Android 2.3.3 上运行。
我正在添加用于获取方向值的代码段。
sensormanager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
Sensor gsensor = sensormanager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
Sensor msensor = sensormanager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
sensormanager.registerListener(this, gsensor, SensorManager.SENSOR_DELAY_GAME);
sensormanager.registerListener(this, msensor, SensorManager.SENSOR_DELAY_GAME);
-------------------------------------------------------------------------------
final float rad2deg = (float)(180.0f/Math.PI);
int type = event.sensor.getType();
float[] data;
if (type == Sensor.TYPE_ACCELEROMETER) {
data = gravityValues;
} else if (type == Sensor.TYPE_MAGNETIC_FIELD) {
data = geomagneticValues;
} else {
return;
}
for (int i=0 ; i<3 ; i++)
data[i] = event.values[i];
SensorManager.getRotationMatrix(rValues, null, gravityValues, geomagneticValues);
SensorManager.getOrientation(rValues, mOrientation);
result.setText("Compass yaw: " + (int)(mOrientation[0]*rad2deg) + " pitch: " + (int)(mOrientation[1]*rad2deg) +" roll: " + (int)(mOrientation[2]*rad2deg) );
如果我错过提及任何必需的信息,请告诉我。提前致谢。