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

1. Activity的Oritentation

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

ORIENTATION_PORTRAIT,ORIENTATION_LANDSCAPE

如果用户的手机没有开启重力感应器或者在AndroidManifest.xml中设置了android:screenOrientation,默认情况下,该Activity不会响应屏幕旋转事件。
如果在这种情况下,依然希望Activity能响应屏幕旋转,则添加如下代码:

// activity的 onCreate 函数中
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);

当你的Activity添加了android:configChanges="orientation|screenSize"属性,并且重载了public void onConfigurationChanged(Configuration newConfig)函数后,你会在手机屏幕旋转的时候在函数onConfigurationChanged中得到即将旋转的屏幕发向,由newConfig.orientation 给出,判断newConfig是否等于Configuration.ORIENTATION_LANDSCAPE,Configuration.ORIENTATION_PORTRAIT。
这种方式,你只能知道当前的手机是横屏还是竖屏,你无法准确地知道当前手机被旋转到了哪个方向。

2. Activity的 Rotation

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

getWindowManager().getDefaultDisplay().getRotation()

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

Surface.ROTATION_0,

Surface.ROTATION_90,

Surface.ROTATION_180,

Surface.ROTATION_270

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

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

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

最近发现这种方法有一个Bug,它只能一次旋转90度,如果你突然一下子旋转180度,onConfigurationChanged函数不会被调用。

3. 相机的Preview方向

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

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

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

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

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

通过派生OrientationEventListener 类,监听传感器给出的信息来确定屏幕的方向,这种方法比Activity的onConfigurationChanged 要准确很多,而且还可以支持把固定了Activity方向的应用。该派生类会重载一个函数:

public void onOrientationChanged(int orientation)

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

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

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

参考链接:http://blog.51cto.com/ticktick/1346579

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 屏幕旋转

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

  4. Android屏幕旋转总结

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

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

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

  6. Qt for Android 程序禁止屏幕旋转

    有时候我们希望让一个程序的界面始终保持在一个方向,不随手机(平板)方向旋转而变化:在AndroidManifest.xml的每一个需要禁止转向的Activity配置中加入 android:screen ...

  7. 设置Android默认锁定屏幕旋转

    /********************************************************************************** * 设置Android默认锁定屏 ...

  8. 【转】如何在 Android 程序中禁止屏幕旋转和重启Activity

    原文网址:http://www.cnblogs.com/bluestorm/p/3665890.html 禁止屏幕随手机旋转变化 有时候我们希望让一个程序的界面始终保持在一个方向,不随手机方向旋转而变 ...

  9. android学习---屏幕旋转

    /** *问题:今天学习android访问Servlet,Servlet给返回一个xml格式的字符串,android得到数据后将其显示到一个TextView中,发现Activity得到数据显 * 示到 ...

随机推荐

  1. 进程与线程的通信机制----Queue

    进程运行时候变量是隔离的,线程间共享全局变量. 进程: from multiprocessing import Process from threading import Thread def get ...

  2. Jquery mobile动态生成ListView调用刷新方法报错

    错误:cannot call methods on listview prior to initialization... 示例: <div data-role="page" ...

  3. Linux命令1

     1.获取当前系统支持的所有命令的列表: compgen ­-c  2.怎样查看一个linux命令的概要与用法: whatis grep #便可查到grep的用法 3.怎样一页一页地查看一个大文件的内 ...

  4. System.nanoTime与System.currentTimeMillis的区别(转)

    原文地址:http://blog.csdn.net/dliyuedong/article/details/8806868 平时产生随机数时我们经常拿时间做种子,比如用System.currentTim ...

  5. app.use和app.get,app.post区别

    express中,express的实例app: app.use(path,callback)中的callback既可以是router对象又可以是函数 app.get(path,callback)中的c ...

  6. ST表

    ST表的原理及其实现 ST表类似树状数组,线段树这两种算法,是一种用于解决RMQ(Range Minimum/Maximum Query,即区间最值查询)问题的离线算法 与线段树相比,预处理复杂度同为 ...

  7. Java的selenium代码随笔(5)

    //以下七种方法主要用于生成年.月.日.小时.分钟和秒的信息,用于生成保存截图的文件目录名和文件名/** 格式化输出日期* * @return 返回字符型日期*/public static Strin ...

  8. DAY11、函数总结

    一.函数的对象 1.函数对象:函数名存放的就是函数的地址,所以函数名也是对像 2.函数对象的应用: 2.1.可以直接被引用   fn = cp_fn 2.2.可以当作函数参数传递    compute ...

  9. MySQL 中触发器的应用

    在一个教育系统里面,有 科目表 ,章节表(每一科目对应若干大章节),小节表(每一大章节下面有若干小节),习题表(每一小节对应若干习题), 在后台管理系统中 有这样几个功能要实现,在 科目列表页面中  ...

  10. ThreadPoolExecutor 中的 shutdown() 、awaitTermination() 、 shutdownNow() 的用法

    shutdown和awaitTermination为接口ExecutorService定义的两个方法,一般情况配合使用来关闭线程池. 方法简介shutdown方法:将线程池状态置为SHUTDOWN.平 ...