android 系统关闭系统自动旋转屏幕情况下利用设备感应器(方向传感器)实现横竖屏切换
2.SensorManager sm=(SensorManager)getSystemService(SENSOR_SERVICE);
3.在Activity的生命周期方法中注册与移除SensorEventListener;
在onResume()方法中注册sm.registerListerner(this,sm.getDefaultSensor(Sensor.TYPE_ORIENTATION),SensorManager.SENSOR_DELAY_FASTEST);
其中Ssensor.TYPE_ORIENTATION该常量在3.0后已被Deprecated掉了,当时我还以为在4.0里不建议用了,用其他常量代替结果未能达到效果,然后我就查看sdk中自带的demo中使用的竟然还是这个常量,这样就简单了,剩下的就是在SensorEventListener接口的实现方法中实现自己的操作就可以了;
4.在onSensorChanged(SensorEvent event) 中实现自己的操作;
alues[0]: Acceleration minus Gx on the x-axis
values[1]: Acceleration minus Gy on the y-axis
values[2]: Acceleration minus Gz on the z-axis
根据api文档中的说法在这块我只要values[2]就可实现当屏幕横竖屏时切换屏幕;
大概意思是绕Z轴正向旋转与逆向旋转两种方式,
1.正向旋转时只需要判断values[2]>40.0f&&values[2]<70.0f;
2.逆向旋转时只需要判断values[2]-70.0f;
3.屏幕竖直时也就是正向时判断 :values[2]<10.0f&&values[2]>-10.0f;
当然你也可以根据你的实际情况(转屏时灵敏度)调整这个范围;
在实现中要对event事件加synchronized(this)同步块;
接下来的工作就是在三种状态下设置让屏幕旋转的方向(横屏,竖屏),其中要注意的是横屏有两种状态,正向横屏与逆向横屏时屏幕的内容要显示正确;
在这三种 状态下做的操作如下:
synchronized (this) {
int orientation = getRequestedOrientation();
if (event.sensor.getType() == Sensor.TYPE_ORIENTATION) {
if (40.0f < event.values[2] && event.values[2] < 70.0f) {// 向左
if (orientation == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
} else {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
} else if (-10.0f < event.values[2] && event.values[2] < 10.0f) { // 正北
if (orientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
} else {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
} else if (-70.0f < event.values[2] && event.values[2] < -40.0f) { // 向右
if (orientation == ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE) {
} else {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
}
}
} else {
}
}
通过上述判断就可实现系统关闭系统屏幕旋转也能够自动横屏,不过在用上述方式实现前先要对manifest进行配置,详细配置见http://www.voidcn.com/article/p-ymlgygfw-rr.html
转载请注明出处!