android 横竖屏切换

来源:互联网 发布:vm10 mac os补丁 编辑:程序博客网 时间:2024/06/09 18:41

        android 横竖屏切换,屏幕旋转网上已经又很多参考资料,这里就不照搬照抄了。

        这里想描述一个比较特殊的情况。在android应用开发中,我们可能遇到这种需求:限定屏幕只支持某个特定方向。当然,如果只支持横屏,或者只支持竖屏,都好处理,在AndroidManifest.xml里加限定android:screenOrientation="landscape"(或者portrait即可)。这里要提到的仍然是一种比较特殊的情况:限定横屏只支持180度,竖屏只支持270度。

        首先我们需要在layout-landscape和layout-portrait目录下建立同名的layout文件。如果没有限定屏幕旋转时,activity不会被销毁重建,即在AndroidManifest.xml文件中没有加入android:configChanges="orientation|screenSize|keyboardHidden",那么情况很简单,当屏幕旋转的时候,acrivity将会销毁重建,这个时候自动加载对应的layout,没有任何问题。但是如果我们限定了当屏幕旋转的时候,activity不能被销毁,情况稍稍复杂。如果想要让应用加载不同的布局,很多文章提到在onConfigurationChanged()函数中拦截屏幕信息,进行特殊处理。实际上这个时候屏幕旋转已经发生,相应的资源都已经加载,这个时候再做任何处理都已经晚了,不会再起作用。正确的做法是扩展OrientationEventListener类,重载函数onOrientationChanged()。那么应该怎么处理呢?以下是一段示例代码,满足上述的限制只支持180度和270度的preview。

    private void checkOrientation(int orientation) {
        if (!mIsOrientationCheckNeeded) return;

        if (0 == orientation % 180) {
            if (ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT != getRequestedOrientation()) {
                Log.v("Force to portrait view");
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);
            }
        } else { /* 90 */
            if (ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE != getRequestedOrientation()) {
                Log.v("Force to landscape view");
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
            }
        }
    }


        但是发现这种处理方法在某些特定应用(需要用到摄像头的应用,比如camera)中,当同时启用了face unlock(屏幕解锁),有可能会造成系统崩溃。原因在于face unlock也回调用摄像头,当设备处于被应用不支持的角度时,比如0度,用face unlock解锁,本来preview为0度,但是进入应用之后需要马上切换到180度,此时从face unlock的log中会发现有一个500ms的延时,因为face unlock还没有释放摄像头,并且还处于0度的状态,但是我们的app紧接着要求转入180度的preview,两者发生了冲突,系统无法分辨应该以哪个为准。一个workaround的做法是将以上操作插入消息队列,延时500ms再执行。

 

        当然处理此类问题应该还有其它方法。

0 0