admin 管理员组文章数量: 893559
Android 屏幕旋转的处理
1. 不做任何处理的情况下
如果没有针对性地做任何处理的话,默认情况下,当用户手机的重力感应器打开后,旋转屏幕方向,会导致app的当前activity发生onDestroy-> onCreate,会重新构造当前activity和界面布局,很多横屏/竖屏的布局如果没有很好的设计的话,转换为竖屏/横屏后,会显示地很难看。
如果想很好地支持屏幕旋转,则建议在res中建立layout-land和layout-port两个文件夹,把横屏和竖屏的布局文件放入对应的layout文件夹中。
2. 如何设置固定的屏幕方向
在AndroidManifest.xml对应的 activity 属性中,添加:
android:screenOrientation="landscape" //横屏
android:screenOrientation="portrait" //竖屏
那么,默认的情况下,应用启动后,会固定为指定的屏幕方向,即使屏幕旋转,Activity也不会出现销毁或者转向等任何反应。
3. 强制开启屏幕旋转效果
如果用户的手机没有开启重力感应器或者在AndroidManifest.xml中设置了android:screenOrientation,默认情况下,该Activity不会响应屏幕旋转事件。如果在这种情况下,依然希望Activity能响应屏幕旋转,则添加如下代码:
// activity的 onCreate 函数中
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
4. 屏幕旋转时,不希望activity被销毁
如果希望捕获屏幕旋转事件,并且不希望activity 被销毁,方法如下:
(1)在AndroidManifest.xml对应的activity属性中,添加:
android:configChanges="orientation|screenSize"
(2)在对应的activity中,重载函数onConfigurationChanged
@Override
public voidonConfigurationChanged(Configuration newConfig) {super.onConfigurationChanged(newConfig);
}
在该函数中可以通过两种方法检测当前的屏幕状态:
第一种:
判断newConfig是否等于Configuration.ORIENTATION_LANDSCAPE,Configuration.ORIENTATION_PORTRAIT
当然,这种方法只能判断屏幕是否为横屏,或者竖屏,不能获取具体的旋转角度。
第二种:
调用this.getWindowManager().getDefaultDisplay().getRotation();
该函数的返回值,有如下四种:
Surface.ROTATION_0,Surface.ROTATION_90,Surface.ROTATION_180,Surface.ROTATION_270
其中,Surface.ROTATION_0 表示的是手机竖屏方向向上,后面几个以此为基准依次以顺时针90度递增。
(3) 这种方法的Bug
最近发现这种方法有一个Bug,它只能一次旋转90度,如果你突然一下子旋转180度,onConfigurationChanged函数不会被调用。
5. 实时判断屏幕旋转的每一个角度
上面说的各种屏幕旋转角度的判断至多只能判断 0,90,180,270 四个角度,如果希望实时获取每一个角度的变化,则可以通过OrientationEventListener 来实现。
使用方法:
(1)创建一个类继承OrientationEventListener
public class MyOrientationDetector extends OrientationEventListener{public MyOrientationDetector( Context context ) {super(context );}@Overridepublic void onOrientationChanged(int orientation) {Log.i("MyOrientationDetector ","onOrientationChanged:"+orientation);}
}
(2)开启和关闭监听
可以在 activity 中创建MyOrientationDetector 类的对象,注意,监听的开启的关闭,是由该类的父类的 enable() 和 disable() 方法实现的。
因此,可以在activity的 onResume() 中调用MyOrientationDetector 对象的 enable方法,在 onPause() 中调用MyOrientationDetector 对象的 disable方法来完车功能。
(3)监测指定的屏幕旋转角度
MyOrientationDetector类的onOrientationChanged 参数orientation是一个从0~359的变量,如果只希望处理四个方向,加一个判断即可:
if(orientation == OrientationEventListener.ORIENTATION_UNKNOWN) {return; //手机平放时,检测不到有效的角度
}
//只检测是否有四个角度的改变
if( orientation > 350 || orientation< 10 ) { //0度orientation = 0;
}
else if( orientation > 80 &&orientation < 100 ) { //90度orientation= 90;
}
else if( orientation > 170 &&orientation < 190 ) { //180度orientation= 180;
}
else if( orientation > 260 &&orientation < 280 ) { //270度orientation= 270;
}
else {return;
}
Log.i("MyOrientationDetector ","onOrientationChanged:"+orientation);
最后
如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。
如果你没有方向,这里给大家分享一套由阿里高级架构师编写的《Android八大模块进阶笔记》,帮大家将杂乱、零散、碎片化的知识进行体系化的整理,让大家系统而高效地掌握Android开发的各个知识点。
相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照知识体系编排的。
全套视频资料:
一、面试合集
二、源码解析合集
三、开源框架合集
欢迎大家一键三连支持,若需要文中资料,直接扫描文末CSDN官方认证微信卡片免费领取↓↓↓
本文标签: Android 屏幕旋转的处理
版权声明:本文标题:Android 屏幕旋转的处理 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1687604527h120173.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论