相信大家都或多或少的为横竖屏烦恼过吧,毕竟我们在开发中用到这方面的知识还是挺多的,比如我上一篇讲VideoView的博客,在播放视频的时候,能够自如的切换横竖屏是很有必要的。所以这篇博客就来解析Android中的横竖屏。
1、screenOrientation
当手机没有关闭横竖屏切换功能时,系统一旦触发横竖屏切换,缺省状态(即系统默认状态)下,当前活动的App的界面就会进行横竖屏切换,由于横竖屏的界面尺寸等参数不同,很多软件在设计和开发中为了避免横竖屏切换时引发不必要的麻烦,通常需要让App禁止掉横竖屏的切换,这就需要通过在AndroidManifest.xml中设置Activity中的android:screenOrientation属性值来实现。
screenOrientation属性,有以下几个参数:
- unspecified:默认值 由系统来判断显示方向,判定的策略是和设备相关的,所以不同的设备会有不同的显示方向.
- landscape:横屏显示
- portrait:竖屏显示
- user:用户当前首选的方向
- behind:和该Activity下面的那个Activity的方向一致(在Activity堆栈中的)
- sensor:有物理的感应器来决定。如果用户旋转设备这屏幕会横竖屏切换。
- nosensor:忽略物理感应器,这样就不会随着用户旋转设备而更改了(unspecified设置除外)。
如果android:screenOrientation=”portrait”,则无论手机如何变动,拥有这个属性的Activity都将是竖屏显示。是landscape则为横屏。
上述修改也可以在代码中通过类似如下代码来设置:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
2、手动切换
由上面描述可知,当android:screenOrientation为默认值”unspecified”或”sensor”等时,就会有系统根据设备的旋转情况来触发横竖屏的切换,那么有没有方法我们手动在程序中触发横竖屏的变换呢,显然上面为我们提供的setRequestedOrientation就是系统提供的一个入口。
在Activity中提供了一个方法,会在设置的参数发生变化时被调用,而我们的orientation也属于设置里的参数,所以我们可以用它去监听横竖屏变化。
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
}
newConfig就是就有现在改变的所有设置参数,我们这样就可以知道是横屏还是竖屏。
String message= newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE ? "屏幕设置为:横屏" : "屏幕设置为:竖屏";
手动调用时,会无视AndroidManifest中关于screenOrientation的设置。
3、重启Activity
在切换了横竖屏后(包括用setRequestedOrientation调用)都会重新调用一轮on