
ScreenOrientation
引言:一个没有刻意关注的小知识点。
时间: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. 实践
- 视频播放点击按钮进入全屏状态
- 视频播放点击返回进入半屏状态
- 视频播放手机旋转切换全屏状态
- 视频播放全屏状态固定屏幕方向