Android开发实践:屏幕旋转的处理
来源:互联网 发布:地方门户源码带手机版 编辑:程序博客网 时间:2024/05/18 16:38
移动开发与PC端开发一个很大的不同就是,移动终端(如手机)可以以任意方向任意角度来旋转屏幕,而PC机很难做到,这样就要求我们的APP要能针对性地处理好各种屏幕的旋转。
例如,一个手机最基本的旋转方向有上面4种,而在Android开发中,涉及到屏幕旋转的地方很多,而且各个函数给出的角度值都不一样,比如Activity的getRotate,Camera的setDisplayOrientation,Sensor的onOrientationChanged,这些API都会给出一个角度值,这些角度值是如何跟手机当前的旋转方向对应的呢?
在《Android开发实践:屏幕旋转的处理》这篇文章中,我简单地总结了关于Android屏幕旋转的处理,这里我再针对上面提出的问题,再次深入总结一下。
1. Activity的Oritentation
在Activity中,如果你希望知道当前的屏幕是横屏还是竖屏时,可以通过getRequestedOrientation()获取,它的值主要有如下2种:
ORIENTATION_PORTRAIT,ORIENTATION_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
依次代表手机的如下几个方向:
对于Activity,默认的手机方向是:竖屏Home键在下面,这个方向是Activity的0度方向。
注意:它的角度规律是:“逆时针”方向旋转递增,每次递增90度。
3. 相机的Preview方向
根手机屏幕相关的最常见的应用就是Camera相关的应用了,下面分析系统关于Camera的Preview方向的定义。
你可以通过编写一个简单的测试程序来验证这个定义,这里我就不给出源码了,直接给出得到的结论,系统定义的Camera方向如下:
对于Camera,默认情况下,手机横屏,HOME键在右边,这个方向是Camera的0度方向。(注:关于Camera的Preview方向的设置的函数为setDisplayOrientation)
注意:它的角度递增规律是:“顺时针”方向旋转,每次递增90度。
4. 传感器得到的屏幕方向
在《Android开发实践:屏幕旋转的处理》这篇文章中我给出了一种精确获取屏幕旋转方向的方法,即通过派生OrientationEventListener类,监听传感器给出的信息来确定屏幕的方向,这种方法比Activity的onConfigurationChanged要准确很多,而且还可以支持把固定了Activity方向的应用。该派生类会重载一个函数:
public void onOrientationChanged(int orientation)
它不需要等待手机旋转了90度才会有反应,而是在手机旋转了任何角度的时候,都会回调onOrientationChanged告诉你当前手机的角度,当然,如果你只希望得到4个角度的变化事件,可以自己在该函数中做判断,这里给出它的值分别对应的手机方向:
对于Sensor,默认的手机方向是:竖屏Home键在下面,这个是Sensor的0度方向。
注意:它的角度递增规律是:“顺时针”方向旋转,每次递增90度。
5. 小结
- Android开发实践:屏幕旋转的处理
- Android开发实践:屏幕旋转的处理
- Android开发实践:屏幕旋转的处理
- Android开发实践:屏幕旋转的处理
- Android开发实践:屏幕旋转的处理
- Android 屏幕旋转的处理
- android 开发屏幕旋转问题
- 屏幕旋转角度的处理
- Android 屏幕旋转 处理 AsyncTask 和 ProgressDialog 的最佳方案
- Android 屏幕旋转 处理 AsyncTask 和 ProgressDialog 的最佳方案
- Android 屏幕旋转 处理 AsyncTask 和 ProgressDialog 的最佳方案
- Android 屏幕旋转 处理 AsyncTask 和 ProgressDialog 的最佳方案
- Android 屏幕旋转 处理 AsyncTask 和 ProgressDialog 的最佳方案
- Android 屏幕旋转 处理 AsyncTask 和 ProgressDialog 的最佳方案
- Android 屏幕旋转 处理 AsyncTask 和 ProgressDialog 的最佳方案
- Android 屏幕旋转 处理 AsyncTask 和 ProgressDialog 的最佳方案
- Android 屏幕旋转 处理 AsyncTask 和 ProgressDialog 的最佳方案
- Android 屏幕旋转 处理 AsyncTask 和 ProgressDialog 的最佳方案
- jQuery之css样式操作、value属性值操作和复选框操作
- 小白入门---HTML基础
- [LeetCode日常] 水塘抽样
- 暑假训练第3天总结
- POJ 1681 Painter's Problem (高斯消元)
- Android开发实践:屏幕旋转的处理
- CDH:hdfs劵故障
- CFNetwork internal error (0xc01a:/BuildRoot/Library/Caches/com.apple.xbs/Sources/CFNetwork_Sim/CFNet
- Android Activty的加载过程 启动流程 源码分析
- 设计模式(19)--观察者模式
- LeetCode 3Sum Closest C++
- 2015多校第7场 HDU 5373 The shortest problem 规律,暴力
- LaTeX插入多行多列图
- 学习笔记