传感器TYPE_MAGNETIC_FIELD
and TYPE_ACCELEROMETER
可以很好地检测到这一点(如TYPE_ORIENTATION
现已弃用)。
你会需要:
几个矩阵:
private float[] mValuesMagnet = new float[3];
private float[] mValuesAccel = new float[3];
private float[] mValuesOrientation = new float[3];
private float[] mRotationMatrix = new float[9];
一个监听器来捕获传感器发送的值(这将是一个参数SensorManager.registerListener()
您必须致电来设置您的传感器):
private final SensorEventListener mEventListener = new SensorEventListener() {
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
public void onSensorChanged(SensorEvent event) {
// Handle the events for which we registered
switch (event.sensor.getType()) {
case Sensor.TYPE_ACCELEROMETER:
System.arraycopy(event.values, 0, mValuesAccel, 0, 3);
break;
case Sensor.TYPE_MAGNETIC_FIELD:
System.arraycopy(event.values, 0, mValuesMagnet, 0, 3);
break;
}
};
您需要计算方位角、俯仰角和横滚角:
SensorManager.getRotationMatrix(mRotationMatrix, null, mValuesAccel, mValuesMagnet);
SensorManager.getOrientation(mRotationMatrix, mValuesOrientation);
mValuesOrientation
然后填充:
-
mValuesOrientation[0]
:方位角,绕Z轴旋转。
-
mValuesOrientation[1]
:俯仰,绕X轴的旋转。
-
mValuesOrientation[2]
:滚动,绕Y轴旋转。
检查getOrientation() 的文档 http://developer.android.com/reference/android/hardware/SensorManager.html#getOrientation%28float%5B%5D,%20float%5B%5D%29了解轴是如何定义的。您可能需要使用SensorManager.remapCoordinateSystem()
重新定义这些轴。