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

为什么80%的码农都做不了架构师?>>>   hot3.png

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

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两句话最好都写上,因为有些手机总是出问题,比如三星。

转载于:https://my.oschina.net/lifj/blog/652956

你可能感兴趣的:(android设置屏幕方向与自动感应切换)