移动开发与PC端开发一个很大的不同就是,移动终端(如手机)可以以任意方向任意角度来旋转屏幕,而PC机很难做到,这样就要求我们的APP要能针对性地处理好各种屏幕的旋转。


090746911.png


   例如,一个手机最基本的旋转方向有上面4种,而在Android开发中,涉及到屏幕旋转的地方很多,而且各个函数给出的角度值都不一样,比如 Activity的getRotateCamera的setDisplayOrientationSensor的onOrientationChanged,这些API都会给出一个角度值,这些角度值是如何跟手机当前的旋转方向对应的呢?


   在《Android开发实践:屏幕旋转的处理》这篇文章中,我简单地总结了关于Android屏幕旋转的处理,这里我再针对上面提出的问题,再次深入总结一下。


1. ActivityOritentation


Activity中,如果你希望知道当前的屏幕是横屏还是竖屏时,可以通过getRequestedOrientation()获取,它的值主要有如下2种:


ORIENTATION_PORTRAITORIENTATION_LANDSCAPE


当你的Activity添加了android:configChanges="orientation|screenSize"属性,并且重载了public void onConfigurationChanged(Configuration newConfig)函数后,你会在手机屏幕旋转的时候在函数onConfigurationChanged中得到即将旋转的屏幕发向,由newConfig.orientation 给出,


这种方式,你只能知道当前的手机是横屏还是竖屏,你无法准确地知道当前手机被旋转到了哪个方向。


2. Activity Rotation


Activity中,还提供了一个接口,就是获取当前手机的旋转角度:


getWindowManager().getDefaultDisplay().getRotation()


这个接口返回的值主要有如下4个:


Surface.ROTATION_0

Surface.ROTATION_90

Surface.ROTATION_180

Surface.ROTATION_270


依次代表手机的如下几个方向:


090931142.png


对于Activity,默认的手机方向是:竖屏Home键在下面,这个方向是Activity的0度方向。


注意:它的角度规律是:逆时针方向旋转递增,每次递增90度。


3. 相机的Preview方向


根手机屏幕相关的最常见的应用就是Camera相关的应用了,下面分析系统关于CameraPreview方向的定义。


你可以通过编写一个简单的测试程序来验证这个定义,这里我就不给出源码了,直接给出得到的结论,系统定义的Camera方向如下:


091001570.png


对于Camera默认情况下,手机横屏,HOME键在右边,这个方向是Camera0度方向。(注:关于CameraPreview方向的设置的函数为setDisplayOrientation


注意:它的角度递增规律是:顺时针方向旋转,每次递增90度。


4. 传感器得到的屏幕方向


《Android开发实践:屏幕旋转的处理》这篇文章中我给出了一种精确获取屏幕旋转方向的方法,即通过派生OrientationEventListener 类,监听传感器给出的信息来确定屏幕的方向,这种方法比ActivityonConfigurationChanged 要准确很多,而且还可以支持把固定了Activity方向的应用。该派生类会重载一个函数:


public void onOrientationChanged(int orientation)


它不需要等待手机旋转了90度才会有反应,而是在手机旋转了任何角度的时候,都会回调onOrientationChanged告诉你当前手机的角度,当然,如果你只希望得到4个角度的变化事件,可以自己在该函数中做判断,这里给出它的值分别对应的手机方向:


091030816.png


对于Sensor,默认的手机方向是:竖屏Home键在下面,这个是Sensor的0度方向。


注意:它的角度递增规律是:顺时针方向旋转,每次递增90度。


5. 小结


关于屏幕的方向和旋转,我相信通过这两篇文章算是基本搞清楚了,希望这份总结对初学者有所帮助,有不清楚的地方,欢迎留言或者来信lujun.hust@gmail.com交流,或者关注我的新浪微博 @卢_俊 获取最新的文章和资讯。