文档章节

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

拉风的道长
 拉风的道长
发布于 2016/04/05 16:45
字数 463
阅读 484
收藏 1

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

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

© 著作权归作者所有

拉风的道长
粉丝 55
博文 110
码字总数 55629
作品 0
昌平
程序员
私信 提问
Android自适应屏幕方向和大小

一:不同的layout Android手机屏幕大小不一,有480x320, 640x360, 800x480.怎样才能让App自动适应不同的屏幕呢? 其实很简单,只需要在res目录下创建不同的layout文件夹,比如layout-640x36...

安克诚
2012/07/23
721
3
Android: android自适应屏幕方向和大小

http://erbo2008.javaeye.com/blog/774876 一:不同的layout Android手机屏幕大小不一,有480x320, 640x360, 800x480.怎样才能让App自动适应不同的屏幕呢? 其实很简单,只需要在res目录下创...

长平狐
2012/06/20
228
0
Android自适应屏幕大小和layout布局(横屏|竖屏)

一:不同的layout Android手机屏幕大小不一,有480x320, 640x360, 800x480.怎样才能让App自动适应不同的屏幕呢? 其实很简单,只需要在res目录下创建不同的layout文件夹,比如layout-640x36...

mutouzhang
2014/03/20
191
0
Android一些关于分辨率和布局的设置

1、Android手机屏幕大小不一,有480x320, 640x360, 800x480.怎样才能让App自动适应不同的屏幕呢? drawable- hdpi、drawable- mdpi、drawable-ldpi的区别: (1)drawable-hdpi里面存放高分辨率...

mutouzhang
2014/03/11
83
0
Android横竖屏切换总结

Android横竖屏要解决的问题应该就两个: 一.布局问题 二.重新载入问题 1.布局问题:如果不想让软件在横竖屏之间切换,最简单的办法就是在项目的AndroidManifest.xml中找到你所指定的activit...

晨曦之光
2012/03/05
360
0

没有更多内容

加载失败,请刷新页面

加载更多

spring cloud

一、从面试题入手 1.1、什么事微服务 1.2、微服务之间如何独立通讯的 1.3、springCloud和Dubbo有哪些区别 1.通信机制:DUbbo基于RPC远程过程调用;微服务cloud基于http restFUL API 1.4、spr...

榴莲黑芝麻糊
24分钟前
2
0
Executor线程池原理与源码解读

线程池为线程生命周期的开销和资源不足问题提供了解决方 案。通过对多个任务重用线程,线程创建的开销被分摊到了多个任务上。 线程实现方式 Thread、Runnable、Callable //实现Runnable接口的...

小强的进阶之路
昨天
6
0
maven 环境隔离

解决问题 即 在 resource 文件夹下面 ,新增对应的资源配置文件夹,对应 开发,测试,生产的不同的配置内容 <resources> <resource> <directory>src/main/resources.${deplo......

之渊
昨天
8
0
详解箭头函数和普通函数的区别以及箭头函数的注意事项、不适用场景

箭头函数是ES6的API,相信很多人都知道,因为其语法上相对于普通函数更简洁,深受大家的喜爱。就是这种我们日常开发中一直在使用的API,大部分同学却对它的了解程度还是不够深... 普通函数和...

OBKoro1
昨天
7
0
轻量级 HTTP(s) 代理 TinyProxy

CentOS 下安装 TinyProxy yum install -y tinyproxy 启动、停止、重启 # 启动service tinyproxy start# 停止service tinyproxy stop# 重启service tinyproxy restart 相关配置 默认...

Anoyi
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部