本文实例总结了Android实现屏幕旋转方法。分享给大家供大家参考。具体如下:

在介绍之前,我们需要先了解默认情况下android屏幕旋转的机制:

默认情况下,当用户手机的重力感应器打开后,旋转屏幕方向,会导致当前activity发生onDestroy-> onCreate,这样会重新构造当前activity和界面布局,如果在Camera界面,则表现为卡顿或者黑屏一段时间。如果是在横竖屏UI设计方面,那么想很好地支持屏幕旋转,则建议在res中建立layout-land和layout-port两个文件夹,把横屏和竖屏的布局文件分别放入对应的layout文件夹中。

了解了这些以后,我们对android的屏幕旋转方法进行如下总结:

1. AndroidManifest.xml设置

如果单单想设置横屏或者竖屏,那么只需要添加横竖屏代码:

?
1 2 android:screenOrientation= "landscape" 横屏设置; android:screenOrientation= "portrait" 竖屏设置;

这种方法的优点:即使屏幕旋转,Activity也不会重新onCreate。

缺点:屏幕只有一个方向。

2. 代码动态设置

如果你需要动态改变横竖屏设置,那么,只需要在代码中调用setRequestedOrientation()函数:

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

这种方法优点:可以随意动态设置,满足我们人为改变横竖屏的要求,同时满足横竖屏UI不同的设计需求;

缺点:如果改变设置,那么,Activity会被销毁,重新构建,即重新onCreate;

3. 重写onConfigurationChanged

如果你不希望旋转屏幕的时候Activity被不断的onCreate(这种情况往往会造成屏幕切换时的卡顿),那么,可以使用此方法:

首先,在AndroidMainfest.xml中添加configChanges:

?
1 2 3 < activity android:name = ".Test"   android:configChanges = "orientation|keyboard" > activity >

注意,keyboardHidden表示键盘辅助功能隐藏,如果你的开发API等级等于或高于13,还需要设置screenSize,因为screenSize会在屏幕旋转时改变;

?
1 android:configChanges="keyboardHidden|orientation|screenSize"

然后,在Activity中重写onConfigurationChanged方法,这个方法将会在屏幕旋转变化时,进行监听处理:

?
1 2 3 4 5 6 7 8 public void onConfigurationChanged(Configuration newConfig) { // TODO Auto-generated method stubsuper.onConfigurationChanged(newConfig); if (newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE){ // Nothing need to be done here } else { // Nothing need to be done here   } }

这个方法的优点:我们可以随时监听屏幕旋转变化,并对应做出相应的操作;
缺点:它只能一次旋转90度,如果一下子旋转180度,onConfigurationChanged函数不会被调用。

4. 结合OrientationEventListener,自定义旋转监听设置

如果你想更加完美,更加完全的掌控监听屏幕旋转变化,比如,转屏时不想重新onCreate,尤其是在Camera界面,不想出现旋转preview时屏幕的卡顿、黑屏等问题,那么,可以尝试:
 
首先,创建OrientationEventListener对象:

?
1 2 3 4 private OrientationEventListener mOrientationListener; // screen orientation listener private boolean mScreenProtrait = true ; private boolean mCurrentOrient = false ;

然后,自定义屏幕变化回调接口

?
1 2 abstract protected void OrientationChanged( int orientation); //screen orientation change event

最后,自定义监听类

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 private final void startOrientationChangeListener() {   mOrientationListener = new OrientationEventListener( this ) {   @Override   public void onOrientationChanged( int rotation) {   if (((rotation >= 0 ) && (rotation <= 45 )) || (rotation >= 315 )||((rotation>= 135 )&&(rotation<= 225 ))) { //portrait   mCurrentOrient = true ;   if (mCurrentOrient!=mScreenProtrait)   {   mScreenProtrait = mCurrentOrient;   OrientationChanged(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);   Log.d(TAG, "Screen orientation changed from Landscape to Portrait!" );   }   }   else if (((rotation > 45 ) && (rotation < 135 ))||((rotation> 225 )&&(rotation< 315 ))) { //landscape   mCurrentOrient = false ;   if (mCurrentOrient!=mScreenProtrait)   {   mScreenProtrait = mCurrentOrient;   OrientationChanged(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);   Log.d(TAG, "Screen orientation changed from Portrait to Landscape!" );   }   }   }   };   mOrientationListener.enable(); }

在onCreate()中调用:

?
1 startOrientationChangeListener();

这个方法的优点:你可以任意随时准确的监听屏幕旋转变化的状态,可以随时动态改变横竖屏状态;

注:对于Camera来说,你可以设置初始化为横屏或者竖屏,然后对外提供旋转监听,这样,既可以获得屏幕旋转状态,让你做出相应的操作,又不会出现重新onCreate当前Activity造成的卡顿与短暂的黑屏切换。

希望本文所述对大家的Android程序设计有所帮助。

更多相关文章

  1. android EditText设置不可写
  2. Android屏幕分辨率正确获取及PX,DPI,DP,SP等的对应关系
  3. Android(安卓)matrix 控制图片的旋转、缩放、移动
  4. Android系统配置数据库注释(settings.db)
  5. android“设置”里的版本号
  6. [Android(安卓)NDK]Android(安卓)JNI开发例子 ---3 在JNI中实现o
  7. 在Fragment中设置控件点击方法,执行失败。
  8. Android(安卓)闹钟管理类的使用
  9. Android设置通知栏/状态栏透明改变通知栏颜色和app最上部分颜色

随机推荐

  1. 一文详解RIP路由协议及环路问题!
  2. zookeeper技术介绍
  3. Mac电脑永久删除了文档该怎么找回?
  4. 【资源分享】拥抱开源、分享开源、热爱开
  5. Microsoft Ignite 2021:通过新的Azure基础
  6. Nosql数据库服务之redis
  7. OCP 071中文考试题库(cuug内部资料)第12
  8. Microsoft Ignite 2021:Azure Migrate 简
  9. 高性能、高可用平台架构的演变过程
  10. 学会这15点,让你分分钟拿下Redis数据库