最近在做界面控制屏幕方向时,发现,调用了
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
之后,屏幕的感应不起作用了。
最后,终于找到了解决办法:
OrientationEventListener
这个可以用来监听手机屏幕旋转的角度。
通过两个EventListener,对他们进行控制,就可以实现了。
核心代码如下(Activity中):
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 其他的代码.....
//Step1:这个 mLandOrientationListener 来监听手机是否转到横屏状态
mLandOrientationListener = new OrientationEventListener(this,
SensorManager.SENSOR_DELAY_NORMAL) {
@Override
public void onOrientationChanged(int orientation) {
if ((orientation < 100 && orientation > 80)//这里的|| 和&& 不能弄错!!
|| (orientation < 280 && orientation > 260)) {
//Step5:启用系统sensor控制屏幕方向。
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
}
}
};
mLandOrientationListener.disable();
//这个 mPortOrientationListener 来监听手机是否转到竖屏状态
mPortOrientationListener = new OrientationEventListener(this,
SensorManager.SENSOR_DELAY_NORMAL) {
@Override
public void onOrientationChanged(int orientation) {
if ((orientation < 10 || orientation > 350) //这里的|| 和&& 不能弄错!!
|| (orientation < 190 && orientation > 170)) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
}
}
};
mPortOrientationListener.disable();
}
public void goFullScreen() {
//Step2:先禁止Listener的监听。防止在竖屏时点击,走到mPortOrientationListener中,然后会根据sensor,还是保持竖屏。这样我们的横屏请求就不会有效了。
mPortOrientationListener.disable();
mLandOrientationListener.disable();
//Step3:设置屏幕为横屏
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
public void goSmall() {
mPortOrientationListener.disable();
mLandOrientationListener.disable();
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
int orientation = newConfig.orientation;
if (orientation == Configuration.ORIENTATION_PORTRAIT) {
mPortOrientationListener.enable();
mLandOrientationListener.disable();
} else if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
//Step4:当要求的方向是横屏时,将竖屏Listener关闭,将横屏Listener启用。
//这样,当手机转到横屏方向的时候,启用sensor控制方向,进入Step5.
mLandOrientationListener.enable();
mPortOrientationListener.disable();
}
//TODO 其他的代码
}
有时候转屏的时候还需要隐藏状态栏和导航栏,代码可以这么写:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (mView != null) {
int orientation = getResources().getConfiguration().orientation;
if (orientation == Configuration.ORIENTATION_PORTRAIT) {
//显示状态栏
this.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
view.setSystemUiVisibility(0);
} else if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
//隐藏状态栏
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN);
}
}
}
setFlags 和setSystemUiVisibility两句话最好都写上,因为有些手机总是出问题,比如三星。