屏幕旋转切换机制详解

移动开发 Android
默认情况下,当用户手机的重力感应器打开后,旋转屏幕方向,会导致当前activity发生onDestroy-> onCreate,这样会重新构造当前activity和界面布局,如果在Camera界面,则表现为卡顿或者黑屏一段时间。

[[435135]]

前言

屏幕旋转的机制;

默认情况下,当用户手机的重力感应器打开后,旋转屏幕方向,会导致当前activity发生onDestroy-> onCreate,这样会重新构造当前activity和界面布局,如果在Camera界面,则表现为卡顿或者黑屏一段时间;

今天就介绍下平面旋转方面的知识点;

一、screenOrientation属性说明

android:screenOrientation属性说明:

  • unspecified,默认值,由系统决定,不同手机可能不一致
  • landscape,强制横屏显示,只有一个方向
  • portrait,强制竖屏显,只有一个方向
  • behind,与前一个activity方向相同
  • sensor,根据物理传感器方向转动,用户90度、180度、270度旋转手机方向,activity都更着变化,会重启activity(无论系统是否设置为自动转屏,activity页面都会跟随传感器而转屏)
  • sensorLandscape,横屏旋转,就是可以上下旋转,有两个方向,不会重启activity
  • sensorPortrait,竖屏旋转,就是可以上下旋转,有两个方向,不会重启activity
  • nosensor,旋转设备时候,界面不会跟着旋转。初始化界面方向由系统控制(无论系统是否设置为自动转屏,activity页面都不会转屏)
  • user,用户当前设置的方向
  • reverseLandscape,与正常的横向方向相反显示(反向横屏)
  • reversePortrait,与正常的纵向方向相反显示(反向竖屏)(我设置没用)

二、屏幕旋转详解

1、配置文件设置

AndroidManifest.xml设置;

  1. android:name=".test1" 
  2.  
  3. android:screenOrientation="landscape" /> 
  4.  
  5. android:name=".test2" 
  6.  
  7. android:screenOrientation="portrait" /> 

横屏或者竖屏是被直接定死,旋转方向不会变化,只有一个方向(意思是旋转180°也不会改变),当然就不会在手机旋转的时候重启activity;

2、代码设置

调用setRequestedOrientation()函数,其效果就是和在

AndroidManifest中设置一样的,当前方向和设置的方向不一致的时候,会重启activity,一致的话不会重启;

  1. setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//横屏设置 
  2.  
  3. setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//竖屏设置 
  4.  
  5. setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);//默认设置 

注意点:

不想activity被重启,可以在AndroidManifest中加上android:configChanges(orientation|screenSize这两个一定要加上)

  1. <activity 
  2.             android:name=".MainActivity" 
  3.             android:screenOrientation="sensor" 
  4.             android:configChanges="keyboardHidden|orientation|screenSize"

3、监听屏幕旋转变化

重写onConfigurationChanged方法

  1. @Override 
  2.  
  3. public void onConfigurationChanged(Configuration newConfig) { 
  4.  
  5. super.onConfigurationChanged(newConfig); 
  6.  
  7. Log.d(TAG, "onConfigurationChanged"); 
  8.  

这个方法将会在屏幕旋转变化时调用,可以在这里做出我们在屏幕变化时想要的操作,并且不会重启activity。但它只能一次旋转90度,如果一下子旋转180度,onConfigurationChanged函数不会被调用;

4、自定义旋转监听设置

想更加完美,更加完全的掌控监听屏幕旋转变化,就的自定义旋转监听

(1)创建一个类继承OrientationEventListener

(2)开启和关闭监听

可以在 activity 中创建MyOrientationDetector 类的对象,注意,监听的开启的关闭,是由该类的父类的 enable() 和 disable() 方法实现的;

因此,可以在activity的 onResume() 中调用MyOrientationDetector 对象的 enable方法,在 onPause() 中调用MyOrientationDetector 对象的 disable方法来完车功能;

(3)监测指定的屏幕旋转角度

MyOrientationDetector类的onOrientationChanged 参数orientation是一个从0~359的变量,如果只希望处理四个方向,加一个判断即可:

  1. OrientationEventListener mOrientationListener; 
  2.     @Override 
  3.     public void onCreate(Bundle savedInstanceState) { 
  4.         super.onCreate(savedInstanceState); 
  5.         setContentView(R.layout.main); 
  6.         mOrientationListener = new OrientationEventListener(this, 
  7.             SensorManager.SENSOR_DELAY_NORMAL) { 
  8.             @Override 
  9.             public void onOrientationChanged(int orientation) { 
  10.             if (orientation == OrientationEventListener.ORIENTATION_UNKNOWN) { 
  11.     return;  //手机平放时,检测不到有效的角度 
  12. //只检测是否有四个角度的改变 
  13. if (orientation > 350 || orientation < 10) { //0度 
  14.     orientation = 0; 
  15. else if (orientation > 80 && orientation < 100) { //90度 
  16.     orientation = 90; 
  17. else if (orientation > 170 && orientation < 190) { //180度 
  18.     orientation = 180; 
  19. else if (orientation > 260 && orientation < 280) { //270度 
  20.     orientation = 270; 
  21. else { 
  22.     return
  23. Log.v(DEBUG_TAG,"Orientation changed to " + orientation); 
  24.             } 
  25.         }; 
  26.        if (mOrientationListener.canDetectOrientation()) { 
  27.            Log.v(DEBUG_TAG, "Can detect orientation"); 
  28.            mOrientationListener.enable(); 
  29.        } else { 
  30.            Log.v(DEBUG_TAG, "Cannot detect orientation"); 
  31.            mOrientationListener.disable(); 
  32.        } 
  33.     } 
  34.     @Override 
  35.     protected void onDestroy() { 
  36.         super.onDestroy(); 
  37.         mOrientationListener.disable(); 
  38.     } 

总结

快年底了,很多人都要找工作或者写毕业设计,有不懂就发私信给我,或许可以给你点帮助建议;

我们一起努力进步;

 

责任编辑:武晓燕 来源: Android开发编程
相关推荐

2011-07-07 11:12:57

iPad iPhone

2010-05-25 17:30:36

移动IPv6切换

2019-12-26 13:06:07

Windows 10旋转屏幕Windows

2023-11-02 09:42:21

iOS屏幕旋转

2015-09-17 09:42:31

更新Windows RT 微软

2019-03-29 13:38:51

Windows 10旋转屏幕

2021-09-06 18:55:57

MySQLCheckpoint机制

2010-01-26 18:00:07

Android屏幕元素

2021-12-08 06:53:28

Choreograph屏幕机制

2009-07-08 15:01:00

Servlet Ses

2009-08-06 17:31:46

C#制作屏幕保护

2009-12-03 09:49:25

Linux系统引导程序

2020-04-24 15:44:50

MySQL数据库锁机制

2010-08-11 09:40:44

LINQ

2011-03-09 09:11:52

java反射机制

2011-09-27 10:23:24

Java反射机制

2020-04-02 15:10:57

Kubernetes集群安全

2010-06-17 10:38:08

UML动态建模机制

2011-05-26 15:23:34

JavaReflection

2011-03-17 09:20:05

异常处理机制
点赞
收藏

51CTO技术栈公众号