我有一个appli,显示用加速度计和磁力计计算的x,y,z方向值。但是当我从纵向交换到横向时,我得不到相同的X值。我尝试用旋转矢量实现,但我的设备没有旋转矢量传感器:s
这是我计算X,Y,Z值的代码:
@Override
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub
float x, y, z;
String s1 = "stringX", s2 = "stringY", s3 = "stringZ";
// Mettre à jour la valeur de l'accéléromètre et du champ magnétique
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
acceleromterVector=event.values;
} else if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
magneticVector=event.values;
}
// Demander au sensorManager la matrice de Rotation (resultMatrix)
SensorManager.getRotationMatrix(resultMatrix, null, acceleromterVector, magneticVector);
// Demander au SensorManager le vecteur d'orientation associé (values)
SensorManager.getOrientation(resultMatrix, values);
// l'azimuth
x = (float) Math.toDegrees(values[0]);
// le pitch
y = (float) Math.toDegrees(values[1]);
// le roll
z = (float) Math.toDegrees(values[2]);
s1 = "X :" + x;
s2 = "Y :" + y;
s3 = "Z :" + z;
tvx.setText(s1);
tvy.setText(s2);
tvz.setText(s3);
updateOrientation(x);
}
谢谢你们。
答案 0 :(得分:0)
传感器值始终相对于默认方向,因此您需要考虑远离默认方向的旋转。为此,请使用以下内容:
int rotation = activity.getWindowManager().getDefaultDisplay().getRotation();
float screen_adjustment = 0;
switch(rotation) {
case Surface.ROTATION_0: screen_adjustment = 0; break;
case Surface.ROTATION_90: screen_adjustment = (float)Math.PI/2; break;
case Surface.ROTATION_180: screen_adjustment = (float)Math.PI; break;
case Surface.ROTATION_270: screen_adjustment = 3*(float)Math.PI/2; break;
}
调整azimith。有关完整的示例,请参阅the code that I posted in my answer here。