最近遇到一个奇怪的问题,在做重力感应的时候,一般来说手机正着拿着,x、y轴的方向是如下图的:
上述的x、y、z轴的传感器感应的值可以用如下代码获取:
@Override
public void onSensorChanged(SensorEvent event)
{
// TODO Auto-generated method stub
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER)
{
float x = event.values[SensorManager.DATA_X];
float y = event.values[SensorManager.DATA_Y];
float z = event.values[SensorManager.DATA_Z];
Log.i("Sensor", "x:" + x + " y:" + y + " z:" +z);
}
}
但是用了:getRequestedOrientation() 或者 getResources().getConfiguration().orientation 返回的值确是:ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED 和 ActivityInfo.SCREEN_ORIENTATION_USER,显然并不是我所需要的。查找了一下接口,发现还有一个老的接口可以获取方向 getWindow().getWindowManager().getDefaultDisplay().getRotation(),即获取屏幕的旋转角度,并根据角度和此时的宽和高来计算是否横或者竖屏,据此加了如下代码获取手机方向:
/**
* 获取手机的默认屏幕方向
*/
private void getDefaultOrientation()
{
Display display;
display = getWindow().getWindowManager().getDefaultDisplay();
int rotation = display.getRotation();
int width = 0;
int height = 0;
switch (rotation)
{
case Surface.ROTATION_0:
case Surface.ROTATION_180:
Log.i(TAG, "Rotation is: 0 or 180");
width = display.getWidth();
height = display.getHeight();
break;
case Surface.ROTATION_90:
case Surface.ROTATION_270:
Log.i(TAG, "Rotation is: 90 or 270");
width = display.getHeight();
height = display.getWidth();
break;
default:
break;
}
if (width > height)
{
Log.i(TAG, "Natural Orientation is landscape:" + width + "x" + height);
}
else
{
Log.i(TAG, "Natural Orientation is portrait:" + width + "x" + height);
}
}
用多台手机测试了默认方向都是portrait,又用一台平板测试也是这样,只有那台定制的平板方向默认是landscape,问题应该就在这里。这台设备的屏幕方向即默认的xy轴方向与其他设备是不同的,造成了在重力感应的时候的处理也需要不一样,针对此,将x变y,y变x即可了。