Android设备旋转不';与文档不匹配
我试图找出一个设备(三星Galaxy S5)的旋转,我如下所示:Android设备旋转不';与文档不匹配,android,accelerometer,android-sensors,magnetometer,Android,Accelerometer,Android Sensors,Magnetometer,我试图找出一个设备(三星Galaxy S5)的旋转,我如下所示: private float[]rawDeviceRotation; 私人浮动设备加速; 私人地磁; 私有浮点[]旋转矩阵=新浮点[9]; 浮动[]方向=新浮动[3]; // ... @凌驾 传感器更改时的公共无效(传感器事件){ if(event.sensor.getType()==sensor.TYPE\u ROTATION\u VECTOR){ rawDeviceRotation=event.values.clone(); }
private float[]rawDeviceRotation;
私人浮动设备加速;
私人地磁;
私有浮点[]旋转矩阵=新浮点[9];
浮动[]方向=新浮动[3];
// ...
@凌驾
传感器更改时的公共无效(传感器事件){
if(event.sensor.getType()==sensor.TYPE\u ROTATION\u VECTOR){
rawDeviceRotation=event.values.clone();
}
else if(event.sensor.getType()==sensor.TYPE\u加速计){
rawDeviceAcceleration=event.values.clone();
}
else if(event.sensor.getType()==sensor.TYPE\u磁场){
rawGeomagic=event.values.clone();
if(SensorManager.getRotationMatrix(rotationMatrix,null,rawDeviceAcceleration,Raw地磁)){
SensorManager.getOrientation(旋转矩阵,方向);
//方向[0]~-0.62+0.62
//方向[1]~-0.31+0.31
//方向[2]~-0.62+0.62
}
}
}
我得到了一些东西,但不是文档中说明的值
方位角(绕-z轴旋转的角度)。这是设备当前罗盘方向和磁北之间的角度。如果设备的上边缘朝向磁北,则方位角为0度;如果顶部边缘朝南,则方位角为180度。类似地,如果顶边朝东,则方位角为90度,如果顶边朝西,则方位角为270度
俯仰(绕x轴旋转的角度)。这是平行于设备屏幕的平面与平行于地面的平面之间的角度。如果您保持设备与地面平行,底部边缘离您最近,并将设备顶部边缘向地面倾斜,则俯仰角变为正值。朝相反方向倾斜-将设备顶部边缘移离地面会导致俯仰角变为负值。值的范围为-180度到180度
滚动(绕y轴旋转的度数)。这是垂直于设备屏幕的平面与垂直于地面的平面之间的角度。如果您保持设备与地面平行,且底部边缘离您最近,并将设备左边缘向地面倾斜,则侧倾角度将变为正值。朝相反方向倾斜,将设备的右边缘移向地面-导致侧倾角度变为负值。值的范围为-90度到90度
首先,我得到的值的范围似乎与弧度或度数都没有多大关系
其次,如果按照文档中的说明向左倾斜,则滚动角度(或任何值)变为负值,反之亦然
要么是我做错了什么,要么是三星做错了什么,要么是文档错了。。。有没有什么好主意该怪谁(以及该怎么做来解决这个问题)
我使用内置的三星测试屏幕测试了手机的传感器,通过在拨号板中输入*\0*\code>即可到达。它报告了正确的倾斜角度,通过了所有的自检等。因此,这似乎不太可能是硬件问题。我正在这个设备上运行安卓4.4.2
另外,我尝试在值上应用Math.toDegrees()
,但没有得到任何合理的值(没有90°
,180°
或类似的值)
private float[] rawDeviceRotation;
private float[] rawDeviceAcceleration;
private float[] rawGeomagnetic;
private float[] rotationMatrix = new float[9];
float[] orientation = new float[3];
// ...
@Override
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_ROTATION_VECTOR) {
rawDeviceRotation = event.values.clone();
}
else if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
rawDeviceAcceleration = event.values.clone();
}
else if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
rawGeomagnetic = event.values.clone();
if( SensorManager.getRotationMatrix(rotationMatrix, null, rawDeviceAcceleration, rawGeomagnetic) ){
SensorManager.getOrientation(rotationMatrix, orientation);
// orientation[0] ~ -0.62 <-> +0.62
// orientation[1] ~ -0.31 <-> +0.31
// orientation[2] ~ -0.62 <-> +0.62
}
}
}