Android实现屏幕旋转方法总结
本文实例总结了android实现屏幕旋转方法。分享给大家供大家参考。具体如下:
在介绍之前,我们需要先了解默认情况下android屏幕旋转的机制:
默认情况下,当用户手机的重力感应器打开后,旋转屏幕方向,会导致当前activity发生ondestroy-> oncreate,这样会重新构造当前activity和界面布局,如果在camera界面,则表现为卡顿或者黑屏一段时间。如果是在横竖屏ui设计方面,那么想很好地支持屏幕旋转,则建议在res中建立layout-land和layout-port两个文件夹,把横屏和竖屏的布局文件分别放入对应的layout文件夹中。
了解了这些以后,我们对android的屏幕旋转方法进行如下总结:
1. androidmanifest.xml设置
如果单单想设置横屏或者竖屏,那么只需要添加横竖屏代码:
android:screenorientation="landscape"横屏设置; android:screenorientation="portrait"竖屏设置;
这种方法的优点:即使屏幕旋转,activity也不会重新oncreate。
缺点:屏幕只有一个方向。
2. 代码动态设置
如果你需要动态改变横竖屏设置,那么,只需要在代码中调用setrequestedorientation()函数:
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:
<activity android:name=".test" android:configchanges="orientation|keyboard"> </activity>
注意,keyboardhidden表示键盘辅助功能隐藏,如果你的开发api等级等于或高于13,还需要设置screensize,因为screensize会在屏幕旋转时改变;
android:configchanges="keyboardhidden|orientation|screensize"
然后,在activity中重写onconfigurationchanged方法,这个方法将会在屏幕旋转变化时,进行监听处理:
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对象:
private orientationeventlistener morientationlistener; // screen orientation listener private boolean mscreenprotrait = true; private boolean mcurrentorient = false;
然后,自定义屏幕变化回调接口
abstract protected void orientationchanged(int orientation); //screen orientation change event
最后,自定义监听类
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()中调用:
startorientationchangelistener();
这个方法的优点:你可以任意随时准确的监听屏幕旋转变化的状态,可以随时动态改变横竖屏状态;
注:对于camera来说,你可以设置初始化为横屏或者竖屏,然后对外提供旋转监听,这样,既可以获得屏幕旋转状态,让你做出相应的操作,又不会出现重新oncreate当前activity造成的卡顿与短暂的黑屏切换。
希望本文所述对大家的android程序设计有所帮助。
下一篇: Android串口操作方法实例