Android屏幕旋转-横屏竖屏切换

news/2024/11/15 16:31:47/

刚实现了App内手机横/竖放置时,屏幕横/竖屏的切换。记录一下中间需要的关键信息和实现过程。

开门见山的说,实现屏幕自动/手动旋转的方式有两种:

一种是在工程的代码中定义,这种方式在横竖屏切换时执行的操作是:销毁当前Activity–根据新的屏幕尺寸重建Activity。如果不进行数据存储的操作,在切换的过程中Activity中的数据会丢失。


另一种是在工程的AndroidManifest.xml中定义,这种定义的方式在某些情况下可以实现“不销毁需要横竖屏的Activity”,因为这种方式不会销毁Activity后重建Activity,因此Activity的数据不会丢失。

接下来分别介绍这两种实现方式:

方式一:代码中定义

在需要横屏的Activity中的onCreate方法内添加如下语句,并且要求该语句位于onCreate方法内setContentView(**)语句之前。

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);

上条语句中,常数SCREEN_ORIENTATION_FULL_SENSOR是决定屏幕如何旋转的参数。总结所有的参数对应的功能:

参数功能
SCREEN_ORIENTATION_BEHIND继承Activity堆栈中当前Activity下面的那个Activity的方向
SCREEN_ORIENTATION_FULL_SENSOR由重力传感器决定0/90/180/270°
SCREEN_ORIENTATION_FULL_USER
SCREEN_ORIENTATION_LANDSCAPE始终横屏
SCREEN_ORIENTATION_PORTRAIT始终竖屏
SCREEN_ORIENTATION_LOCKED锁定屏幕方向
SCREEN_ORIENTATION_NOSENSOR关闭重力传感器对横/竖屏的影响
SCREEN_ORIENTATION_REVERSE_LANDSCAPE另一个方向的横屏
SCREEN_ORIENTATION_REVERSE_PORTRAIT另一个方向的竖屏(倒拿手机)
SCREEN_ORIENTATION_SENSOR重力传感器影响屏幕的方向0/90/270°
SCREEN_ORIENTATION_SENSOR_LANDSCAPE始终横屏,由重力传感器决定是哪个方向的横屏
SCREEN_ORIENTATION_SENSOR_PORTRAIT始终竖屏,由重力传感器决定是哪个方向的竖屏
SCREEN_ORIENTATION_UNSPECIFIED不指定方向,使用默认方向
SCREEN_ORIENTATION_USER由用户和重力传感器共同决定,详见文本末端
SCREEN_ORIENTATION_USER_LANDSCAPE用户和重力传感器共同决定是哪个方向的横屏
SCREEN_ORIENTATION_USER_PORTRAIT用户和重力传感器共同决定是哪个方向的竖屏
UIOPTION_SPLIT_ACTION_BAR_WHEN_NARROW当屏幕较窄时导航栏有一部分会显示在底部

由于该方式下横/竖屏切换时,对应的Activity的数据会丢失,可以在对应的Activity中重写如下两个方法,来保证数据不丢失:

@Override
protected void onSaveInstanceState(Bundle outState) {super.onSaveInstanceState(outState);//横竖屏切换前调用,保存用户想要保存的数据,以下是样例outState.putString("name","yoosir"); outState.putInt("age",24); outState.putBoolean("handsome",true);
}@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {super.onRestoreInstanceState(savedInstanceState);// 屏幕切换完毕后调用用户存储的数据,以下为样例:if(savedInstanceState != null) { int age = savedInstanceState.getInt("age"); String name = savedInstanceState.getString("name"); boolean isHandsome = savedInstanceState.getBoolean("handsome");}
}

方式二:在AndroidManifest.xml中定义

在AndroidManifest.xml中对应的Activity属性定义中配置android:configChanges和screenOrientation。参考的文章中在android:configChanges的配置说的很清楚,我直接把结论贴出来:

android:configChanges="orientation|keyboardHidden|screenSize"
  • 配置configChanges为以上配置时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法。Activity中的数据不会被销毁。

  • 不配置configChanges或配置configChanges为非以上配置时,切屏会重新调用当前Activity的各个生命周期。Activity中的数据会被销毁。

给出示例代码如下:

<activity android:name=".com.cdsn.SearchActivity"... ...android:screenOrientation="sensor"android:configChanges="keyboardHidden|orientation|screenSize"/>

上述代码中的android:screenOrientation所有可能的参数配置如下:取自文章。

描述
unspecified默认值。系统自动选择屏幕方向
behind跟activity堆栈中的下面一个activity的方向一致
landscape横屏方向,显示的宽比高长
portrait竖屏方向,显示的高比宽长
sensor由设备的物理方向传感器决定,如果用户旋转设备,这屏幕就会横竖屏切换
nosensor忽略物理方向传感器,这样就不会随着用户旋转设备而横竖屏切换了(”unspecified”设置除外)
user用户当前首选的方向
reverseLandscapeAPI 9 以上,反向横屏
reversePortraitAPI 9 以上,反向竖屏
sensorLandscapeAPI 9 以上,横屏,但是可以根据 物理方向传感器来切换正反向横屏
sensorPortraitAPI 9 以上,竖屏,但是可以根据 物理方向传感器来切换正反向竖屏
fullSensorAPI 9 以上,上下左右四个方向,由物理方向传感器决定
lockedAPI 18 以上,锁死当前屏幕的方向

上述代码中的android:configChanges所有可能的参数配置如下:取自文章。

描述
mccIMSI移动台的国家代码(MCC)发生变化——一个SIM被探测到并且更新MCC
mncIMSI移动台的网络代码(MNC)发生变化——一个SIM被探测到并且更新MNC
locale区域发生变化——用户选择了一个文本需要显示的新语言
keyboard键盘类型发生变化——例如:用户插入了外接键盘。
keyboardHidden键盘的可访问性发生变化——例如:用户发现了硬件键盘。
screenLayout屏幕布局发生变化——这个会导致显示不同的Activity。
orientation屏幕方向发生变化——用户旋转了屏幕。注意:如果应用程序的目标API级别是13或更高(通过属性minSdkVersion和属性targetSdkVersion声明),你也需要声明配置项screenSize,因为这将在设备选择肖像和屏幕方向时发生改变。
screenSize当前可用屏幕大小发生变化。这代表一个当前可用大小的变化,和当前的比率相关,因此当用户选择不同的画面和图像,会发生变化。然而,如果你的程序目标API级别是12或更低,你的Activity总是会自己处理这个配置变化(这个变化不会引起Activity的重启,甚至在Android 3.2或更新的设备上)。在API级别13里加入的。
smallestScreenSize物理屏幕大小的变化。不管方向的变化,仅仅在实际物理屏幕打包变化的时候,如:外接显示器。这个配置项的变化引起在smallestWidth configuration里的变化。然而,如果你的程序目标API级别是12或更低,你的Activity将自己处理这个变化(这个变化不会引起Activity的重启,甚至在Android 3.2或更新的设备上)在API级别13里加入的。
layoutDirection布局方向变化。例如书写方式从左向右(LTR)转换为从右向左(RTL)

配置了以上属性之后,进行横竖屏切换的Activity的数据不会丢失,如果想根据不同的屏幕方向来展示不同UI或做不同的事,需要在该Activity中重写以下方法:

@Override
public void onConfigurationChanged(Configuration newConfig) {super.onConfigurationChanged(newConfig);// 在这里添加屏幕切换后的操作
}

番外

我按照上述方法,根据重力传感器实现了屏幕旋转,虽然可以做到屏幕随重力传感器切换,但是发现:无论手机设置中“屏幕旋转”或“方向锁定”是开是关,App内的Activity都会随着手机的横竖方向切换横竖屏。我想要实现的是当打开“屏幕旋转”时,App内的Activity跟随重力感应器;当关闭“屏幕旋转”时,App内的Activity固定为默认方向。如何做到关闭重力传感器时,App亦关闭屏幕自动旋转?

android:screenOrientation="sensor"

改上述代码为以下代码

android:screenOrientation="user"

意即:当参数为sensor时,无论是否关闭“屏幕旋转”设置,App内的特定Activity都会根据重力传感器改变横竖屏。
当参数为user时,当“屏幕旋转”开启,则特定Activity根据根据重力传感器改变横竖屏;当“屏幕旋转”关闭,则特定Activity会固定位默认方向(一般为正面竖屏)。

参考文章

https://www.jianshu.com/p/dbc7e81aead2


http://www.ppmy.cn/news/696658.html

相关文章

横屏竖屏转换

在App Store上的大部分视频播放App中&#xff0c;都实现了竖屏小屏播放以显示更多相关信息&#xff0c;横屏切换到全屏播放&#xff0c;这样的交互显得优雅而大方。最近项目里有个这样的需求&#xff0c;为全屏视频播放加上竖屏模式。下面&#xff0c;让我们一起来实现这个需求…

横屏竖屏切换

当用N85、N95的时候&#xff0c;可以横屏竖屏切换。当切换的时候&#xff0c;就要把程序中的控件位置、大小重新计算&#xff0c;重新画了。 其实也没有什么困难的。 1.这根据原始屏幕(240*320)的屏幕计算坐标。当横屏竖屏切换的时候&#xff0c;可以用下面的公式进行自动的拉…

Win7屏幕显示方向怎么调整为竖屏显示操作教学分享

Win7屏幕显示方向怎么调整为竖屏显示操作教学分享。有的用户在进行电脑投屏内容展示的时候&#xff0c;需要进行竖屏的内容展示。那么怎么将系统的所有内容调整成为竖屏来进行展示呢&#xff1f;接下来一起来看看以下操作方法分享吧。 操作步骤 1、首先点击屏幕左下角的“开始”…

设置屏幕默认横屏

设置屏幕默认横屏应该在AndroidManifest.xml中的android:screenOrientation属性中设置 android:screenOrientation"landscape" 而不是通过代码设置(以前喜欢在BaseActivity中通过代码设置) if (getRequestedOrientation() ! ActivityInfo.SCREEN_ORIENTATION_LANDSCA…

为什么电脑屏幕会横过来_电脑屏幕横过来了怎么办

电脑屏幕是人与电脑交互的窗口&#xff0c;所有可视化的操作都是通过电脑屏幕来呈现。可是有些小伙伴却遇到了一些问题&#xff0c;电脑屏幕不知道什么时候横过来了&#xff0c;人与电脑的交互窗口就莫名复杂了。该如何调整过来呢&#xff1f;往下瞧 在使用电脑的时候&#xff…

如何解决电脑横屏问题

今天一不小心碰到键盘&#xff0c;使得电脑屏幕旋转了&#xff0c;想用自己的电脑查查怎么解决&#xff0c;操作起来真费劲&#xff0c;赶紧向少然求救。 解决方案&#xff1a; 在桌面上&#xff0c;点击鼠标右键&#xff0c;选择图形选项→旋转→内置显示器→旋转至0度&#x…

计算机硬盘排列怎么变回横的,电脑屏幕横向了怎么调回来

大家好&#xff0c;我是时间财富网智能客服时间君&#xff0c;上述问题将由我为大家进行解答。 电脑屏幕横向了调回来的方法如下&#xff1a; 1、首先右键点击桌面空白处&#xff0c;在弹出的菜单中选择屏幕分辨率。 2、点击方向旁边的向下箭头&#xff0c;将原来的纵向改为横向…

SpringBoot3中的属性绑定注解和YMAL配置文件、日志

1. 常用注解 SpringBoot摒弃XML配置方式&#xff0c;改为全注解驱动 1. 组件注册 Configuration、SpringBootConfiguration Bean、Scope Controller、Service、Repository、Component Import ComponentScan 步骤&#xff1a; 1、Configuration 编写一个配置类 2、在配置类中…