您的位置:首页 > 产品设计 > UI/UE

获取手机的默认屏幕方向——某些平板的方向错误问题

2016-09-09 10:50 489 查看
最近遇到一个奇怪的问题,在做重力感应的时候,一般来说手机正着拿着,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);
}
}


测试了一下,在手机和大部分平板上获取的值是可以相互对应上的。但是在客户自己专门定制的一个平板上发现了x和y的值却刚好是相反的,也就是说横着拿手机的时候,左右倾斜,变化的不是y的值而是x的值。猜想是不是此平板的默认屏幕方向与大部分android设备的方向不一致。
但是用了: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即可了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐