引言:一个没有刻意关注的小知识点。
时间:2018年03月29日
作者:JustDo23
01. 默认
-
新建
Activity
<activity android:name=".module.orientation.ScreenOrientationActivity" />
打开
系统屏幕旋转
功能-
屏幕旋转
生命周期
// 启动 JustDo23: ---> onCreate() JustDo23: ---> onStart() JustDo23: ---> onResume() // 旋转 JustDo23: ---> onPause() JustDo23: ---> onSaveInstanceState() JustDo23: ---> onStop() JustDo23: ---> onDestroy() JustDo23: ---> onCreate() JustDo23: ---> onStart() JustDo23: ---> onRestoreInstanceState() JustDo23: ---> onResume()
-
小结论:
- 屏幕旋转
依赖
于系统
的屏幕旋转功能 - 屏幕
旋转时
候界面
进行了销毁及重建
- 屏幕
旋转过程
中并没有
回调onConfigurationChanged()
方法 - 屏幕
旋转过程
中并回调
了onSaveInstanceState()
方法和onRestoreInstanceState()
方法 - 此种情况下需要在后两个方法中进行
数据存放
和数据读取
- 屏幕旋转
02. 优化
-
新增
配置
<activity android:name=".module.orientation.ScreenOrientationActivity" android:configChanges="screenSize|orientation" />
打开
系统屏幕旋转
功能-
屏幕旋转
生命周期
// 启动 JustDo23: ---> onCreate() JustDo23: ---> onStart() JustDo23: ---> onResume() // 旋转 JustDo23: ---> onConfigurationChanged() // 旋转 JustDo23: ---> onConfigurationChanged()
-
小结论:
- 屏幕旋转
依赖
于系统
的屏幕旋转功能 - 屏幕
旋转时
候界面并没有
进行了被销毁
- 屏幕
旋转过程
回调onConfigurationChanged()
方法 - 界面没有被销毁故而不用考虑数据的存放及读取
- 屏幕旋转
03. 配置
属性
android:configChanges
罗列出了不使界面销毁重建
的一些情况
,并且系统
会回调onConfigurationChanged()
方法-
该属性常用的有效值
值 说明 locale 语言区域发生了变化 — 用户为文本选择了新的显示语言。 keyboard 键盘类型发生了变化 — 用户插入了一个外置键盘。 keyboardHidden 键盘无障碍功能发生了变化 — 用户显示了硬件键盘。 orientation 屏幕方向发生了变化 — 用户旋转了设备。 screenSize 当前可用尺寸相对于当前纵横比的变化。 -
强调注意
在面向 API 级别 13 或更高级别时
orientation
与screenSize
需要同时配置。
04. 方向
-
固定
纵向
<activity android:name=".module.orientation.ScreenOrientationActivity" android:screenOrientation="portrait" />
-
固定
横向
<activity android:name=".module.orientation.ScreenOrientationActivity" android:screenOrientation="landscape" />
-
方向传感器
<activity android:name=".module.orientation.ScreenOrientationActivity" android:screenOrientation="sensor" />
-
等价代码
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);// 纵行 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);// 横向 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);// 方向传感器
05. 属性
属性
android:screenOrientation
指定界面在设备上的显示方向。如果在多窗口模式下运行,系统会忽略该属性。-
该属性常用的有效值
值 说明 unspecified 默认值。由系统选择方向。 behind 与 Activity 栈中紧接着它的 Activity 的方向相同。 landscape 横向方向。 portrait 纵向方向。 reverseLandscape 与正常横向方向相反的横向方向。 reversePortrait 与正常纵向方向相反的纵向方向。 sensor 方向由设备方向传感器决定。 fullSensor 方向由 4 种方向中任一方向的设备方向传感器决定。 nosensor 决定方向时不考虑物理方向传感器。 user 用户当前的首选方向。 -
强调注意
- 最常用的应该是
landscape
与portrait
以及sensor
了。 - 设置
sensor
后便不再依赖系统屏幕旋转
功能了。 - 旋转
90度会
回调onConfigurationChanged()
方法旋转180度不会
回调onConfigurationChanged()
方法
- 最常用的应该是
06. 角度
-
方式一
@Override public void onConfigurationChanged(Configuration newConfig) { switch (newConfig.orientation) { case Configuration.ORIENTATION_PORTRAIT:// 纵向 break; case Configuration.ORIENTATION_LANDSCAPE:// 横向 break; } }
-
方式二
@Override public void onConfigurationChanged(Configuration newConfig) { switch (this.getWindowManager().getDefaultDisplay().getRotation()) { case Surface.ROTATION_0: break; case Surface.ROTATION_90:// 顺时针 break; case Surface.ROTATION_180: break; case Surface.ROTATION_270: break; } }
-
方式三
借助类
OrientationEventListener
来监听任意角度
07. 监听
-
继承监听类
public class ScreenOrientationEventListener extends OrientationEventListener { public ScreenOrientationEventListener(Context context) { super(context); } @Override public void onOrientationChanged(int orientation) { LogUtils.e("---> onOrientationChanged() : " + orientation);// 顺时针方向 } }
-
控制监听
private ScreenOrientationEventListener screenOrientationEventListener;// 屏幕角度监听类 @Override protected void onCreate(Bundle savedInstanceState) { screenOrientationEventListener = new ScreenOrientationEventListener(this);// 实例化 } @Override protected void onResume() { screenOrientationEventListener.enable();// 开启监听 } @Override protected void onPause() { screenOrientationEventListener.disable();// 停止监听 }
08. 实践
- 视频播放点击按钮进入全屏状态
- 视频播放点击返回进入半屏状态
- 视频播放手机旋转切换全屏状态
- 视频播放全屏状态固定屏幕方向