获取手机的默认屏幕方向——某些平板的方向错误问题
2016-09-09 10:50
489 查看
最近遇到一个奇怪的问题,在做重力感应的时候,一般来说手机正着拿着,x、y轴的方向是如下图的:
上述的x、y、z轴的传感器感应的值可以用如下代码获取:
测试了一下,在手机和大部分平板上获取的值是可以相互对应上的。但是在客户自己专门定制的一个平板上发现了x和y的值却刚好是相反的,也就是说横着拿手机的时候,左右倾斜,变化的不是y的值而是x的值。猜想是不是此平板的默认屏幕方向与大部分android设备的方向不一致。
但是用了:getRequestedOrientation() 或者 getResources().getConfiguration().orientation 返回的值确是:ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED 和 ActivityInfo.SCREEN_ORIENTATION_USER,显然并不是我所需要的。查找了一下接口,发现还有一个老的接口可以获取方向 getWindow().getWindowManager().getDefaultDisplay().getRotation(),即获取屏幕的旋转角度,并根据角度和此时的宽和高来计算是否横或者竖屏,据此加了如下代码获取手机方向:
用多台手机测试了默认方向都是portrait,又用一台平板测试也是这样,只有那台定制的平板方向默认是landscape,问题应该就在这里。这台设备的屏幕方向即默认的xy轴方向与其他设备是不同的,造成了在重力感应的时候的处理也需要不一样,针对此,将x变y,y变x即可了。
上述的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即可了。
相关文章推荐
- 模仿豌豆荚以及某些刷机软件获取手机屏幕图片
- 精确获取屏幕尺寸 判断是否是平板 文字根据状态更改颜色 android:textColor 背景色根据状态更改颜色 android:backgroup 启动APK的默认Activit
- android获取手机屏幕的宽高,水平,竖直方向的分辨率,测试手机属于哪种分辨率
- iOS手机屏幕朝向和简单的获取屏幕方向的方法
- 解决jQuery动态获取手机屏幕高和宽的问题
- Android 获取屏幕尺寸与密度 遇到一个问题,我的地图浮标图片在WVGA手机上正好,在QVGA上就显的太大,所以我要根据屏幕的不同调整浮标的大小使其在QVGA大小合适。有的同事提出了依据
- Android获取手机分辨率 和屏幕的方向
- android 获取手机屏幕分辨率和setRequestedOrientation设置屏幕方向
- 解决jQuery动态获取手机屏幕高和宽的问题
- 安卓4.0后新控件TextureView解决SurfaceView在修改默认屏幕方向后视频方向无法翻转的问题
- Android手机适配问题【autolayout】,【.9制作】【获取手机屏幕的宽高】【px,dp转换】
- New UI-获取手机屏幕尺寸与分辨率,屏幕适配,横竖屏问题
- New UI-获取手机屏幕尺寸与分辨率,屏幕适配,横竖屏问题 .
- android 获取手机屏幕分辨率和setRequestedOrientation设置屏幕方向
- android获取手机屏幕尺寸和旋转方向
- android 获取手机屏幕分辨率和setRequestedOrientation设置屏幕方向
- Android手机获取屏幕分辨率高度因虚拟导航栏带来的问题
- J2ME手机全屏幕问题
- JDBC 与 Access 数据库连接报未发现数据源名称并且未指定默认驱动程序错误问题
- 在9530手机上面,如何控制程序只能纵向显示?如何判断当前的屏幕横纵方向呢?