android设置屏幕方向与自动感应切换

最近在做界面控制屏幕方向时,发现,调用了

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 其他的代码
	}


你可能感兴趣的:(android,屏幕方向,自动感应)