1. 在介绍之前,我们需要先了解默认情况下android屏幕旋转的机制:
  2.  
  3. 默认情况下,当用户手机的重力感应器打开后,旋转屏幕方向,会导致当前activity发生onDestroy-> onCreate,这样会重新构造当前activity和界面布局,如果在Camera界面,则表现为卡顿或者黑屏一段时间。如果是在横竖屏UI设计方面,那么想很好地支持屏幕旋转,则建议在res中建立layout-landlayout-port两个文件夹,把横屏和竖屏的布局文件分别放入对应的layout文件夹中。
  4.  
  5. 了解了这些以后,我们对android的屏幕旋转方法进行如下总结:
  6.  
  7. 1AndroidManifest.xml设置
  8.  
  9. 如果单单想设置横屏或者竖屏,那么只需要添加横竖屏代码:
  10.  
  11. android:screenOrientation=”landscape”横屏设置;android:screenOrientation=”portrait”竖屏设置;
  12.  
  13. 这种方法的优点:即使屏幕旋转,Activity也不会重新onCreate
  14.  
  15. 缺点:屏幕只有一个方向。
  16.  
  17. 2,代码动态设置
  18.  
  19. 如果你需要动态改变横竖屏设置,那么,只需要在代码中调用setRequestedOrientation()函数:
  20.  
  21. setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//横屏设置
  22.  
  23. setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//竖屏设置
  24.  
  25. setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);//默认设置
  26.  
  27. 这种方法优点:可以随意动态设置,满足我们人为改变横竖屏的要求,同时满足横竖屏UI不同的设计需求;
  28.  
  29. 缺点:如果改变设置,那么,Activity会被销毁,重新构建,即重新onCreate
  30.  
  31. 3,重写onConfigurationChanged
  32.  
  33. 如果你不希望旋转屏幕的时候Activity被不断的onCreate(这种情况往往会造成屏幕切换时的卡顿),那么,可以使用此方法:
  34.  
  35. 首先,在AndroidMainfest.xml中添加configChanges
  36.  
  37. </activity>
  38. 注意,keyboardHidden表示键盘辅助功能隐藏,如果你的开发API等级等于或高于13,还需要设置screenSize,因为screenSize会在屏幕旋转时改变;
  39. ?
  40. 1
  41. android:configChanges="keyboardHidden|orientation|screenSize"
  42.  
  43. 然后,在Activity中重写onConfigurationChanged方法,这个方法将会在屏幕旋转变化时,进行监听处理:
  44. ?
  45.  
  46. <pre class="java" name="code">public void onConfigurationChangedConfiguration newConfig {
  47. // TODO Auto-generated method stubsuper.onConfigurationChanged(newConfig);
  48. if newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE {
  49. // Nothing need to be done here
  50. } else {
  51. // Nothing need to be done here
  52. }
  53. }
  54.  
  55. </pre>
  56. <pre class="brush:java;"></pre>
  57.  
  58. 这个方法的优点:我们可以随时监听屏幕旋转变化,并对应做出相应的操作;
  59. 缺点:它只能一次旋转90度,如果一下子旋转180度,onConfigurationChanged函数不会被调用。
  60. 4,结合OrientationEventListener,自定义旋转监听设置
  61. 如果你想更加完美,更加完全的掌控监听屏幕旋转变化,比如,转屏时不想重新onCreate,尤其是在Camera界面,不想出现旋转preview时屏幕的卡顿、黑屏等问题,那么,可以尝试:
  62.  
  63. 首先,创建OrientationEventListener对象:
  64. <pre class="brush:java;">private OrientationEventListener mOrientationListener; // screen orientation listener</pre><pre class="brush:java;">private boolean mScreenProtrait = true;
  65. private boolean mCurrentOrient = false;</pre>
  66. 然后,自定义屏幕变化回调接口<br>
  67. <pre class="brush:java;">abstract protected void OrientationChanged(int orientation);//screen orientation change event</pre>
  68. 最后,自定义监听类<br>
  69. <pre class="brush:java;">private final void startOrientationChangeListener() {
  70. mOrientationListener = new OrientationEventListener(this) {
  71. @Override
  72. public void onOrientationChanged(int rotation) {
  73. if (((rotation >= 0) && (rotation <= 45)) || (rotation >= 315)||((rotation>=135)&&(rotation<=225))) {//portrait
  74. mCurrentOrient = true;
  75. if(mCurrentOrient!=mScreenProtrait)
  76. {
  77. mScreenProtrait = mCurrentOrient;
  78. OrientationChanged(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
  79. Log.d(TAG, "Screen orientation changed from Landscape to Portrait!");
  80. }
  81. }
  82. else if (((rotation > 45) && (rotation < 135))||((rotation>225)&&(rotation<315))) {//landscape
  83. mCurrentOrient = false;
  84. if(mCurrentOrient!=mScreenProtrait)
  85. {
  86. mScreenProtrait = mCurrentOrient;
  87. OrientationChanged(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
  88. Log.d(TAG, "Screen orientation changed from Portrait to Landscape!");
  89. }
  90. }
  91. }
  92. };
  93. mOrientationListener.enable();
  94. }</pre>
  95. onCreate()中调用:
  96. <pre class="brush:java;">startOrientationChangeListener(); </pre>
  97. 这个方法的优点:你可以任意随时准确的监听屏幕旋转变化的状态,可以随时动态改变横竖屏状态;
  98. 注:对于Camera来说,你可以设置初始化为横屏或者竖屏,然后对外提供旋转监听,这样,既可以获得屏幕旋转状态,让你做出相应的操作,又不会出现重新onCreate当前Activity造成的卡顿与短暂的黑屏切换。<br>
  99.  
  100. <br>
  101.  
  102. <p> </p>
  103. <p> </p>

  

android--屏幕旋转方法总结的更多相关文章

  1. Android 屏幕旋转 处理 AsyncTask 和 ProgressDialog 的最佳方案

    的最佳方案 标签: Android屏幕旋转AsyncTaskProgressDialog 2014-07-19 09:25 39227人阅读 评论(46) 收藏 举报 分类: [android 进阶之 ...

  2. 【Android】[转] Android屏幕旋转使用OrientationEventListener的监听

    说明 遇到一个奇葩的问题,我在使用onConfigChanged拦截屏幕的横竖屏旋转时,发现直接进行180度的横屏/竖屏转换居然没有反应!查找原因发现仅对landscape或者portrait状态有用 ...

  3. Android屏幕旋转

    一个手机最基本的旋转方向有上面4种,而在Android开发中,涉及到屏幕旋转的地方很多,而且各个函数给出的角度值都不一样,比如 Activity的getRotate,Camera的setDisplay ...

  4. android 屏幕旋转

    转自:http://blog.csdn.net/oyzhizhong/article/details/8131799 屏是LANDSCAPE的,要让它默认显示为PORTRAIT. 1.kernel里要 ...

  5. Android屏幕旋转总结

    转自:http://www.myexception.cn/operating-system/1452058.html 1. ProjectConifg.mk中定义宏MTK_LCM_PHYSICAL_R ...

  6. android屏幕适配方法

    android中图片适配是一件很棘手的事情,本篇文章详细的介绍屏幕显示的原理,为什么会资源文件中会存在 drawable-ldpi.drawable-mdpi.drawable-hdpi.drawab ...

  7. android 屏幕旋转 不重新加载oncreate

    当手机设定了使用横屏或者竖屏的时候,还想要使用重力感应,可以设置activity属性 android:screenOrientation="sensor" 但是每次翻转屏幕,都会重 ...

  8. ios实现屏幕旋转的方法

    1.屏蔽AppDelegate下面的屏幕旋转方法 #pragma mark - 屏幕旋转的 //- (UIInterfaceOrientationMask)application:(UIApplica ...

  9. IOS屏幕旋转思路和实践

    这段时间同事在做一个直播项目,项目有个需求:一个界面需要手动设置屏幕的方向,设置好之后方向不能变化.完成这个需求花了特别大的精力,归因是网上关于屏幕旋转的知识比较凌乱,解决问题花费不少时间,最后决定把 ...

随机推荐

  1. Counting Stars

    Counting Stars 题目链接:http://acm.xidian.edu.cn/problem.php?id=1177 离线+一维树状数组 一眼扫过去:平面区间求和,1e6的数据范围,这要h ...

  2. 2016 Technology

    rem 62.5%在chrome谷歌和其他浏览器不一样 http://www.5imoban.net/jiaocheng/div+css/201512191529.html http://blog.c ...

  3. PostgreSQL 命令

    查看Schema: select * from information_schema.schemata; 查看使用的配置文件: SHOW config_file;

  4. OpenCL( 一)

    #include <CL/cl.h> #include <iostream> #include <string> #include <fstream> ...

  5. winform控件背景透明问题(label..等)

    在使用winform写界面的时候,要想label这种控件实现对背景色透明,并且也懒得每次拖动一次控件都要在后台写一遍label1.Parent=PictureBox1 那么下面方法就介绍了比较简单便捷 ...

  6. 工具类 Util.Browser

    /** * @description get the param form browser * @author xf.radish * @param {String} key the param yo ...

  7. mysql建表设置两个默认CURRENT_TIMESTAMP的技巧

    转载:http://blog.163.com/user_zhaopeng/blog/static/166022708201252323942430/   业务场景: 例如用户表,我们需要建一个字段是创 ...

  8. 如何让图片在div里面剧中显示

    你可能有很多种方式,但是这种方式我觉得更加简单,供大家参考. 用一个 display:inline-block 的helper容器高度为height: 100% 并且vertical-align: m ...

  9. android 录制视频方式

    http://www.cnblogs.com/skyseraph/archive/2012/03/31/2427593.html http://bbs.csdn.net/topics/39088448 ...

  10. 有关webapplicationcontext的初始化

    ApplicationContext是Spring的核心,Context我们通常解释为上下文环境,我想用“容器”来表述它更容易理解一些,ApplicationContext则是“应用的容器”了:在We ...