orientationandroid
① Android中Camera方向问题总结
如今生活当中每一个人都离不开手机,拍摄照片更加常见,刚好最近在研究Android中的Camera的“方向”问题,总结一下。好了,进入正题,通过手机的Camera拍摄出来的照片来自于相机的图像传感器,相机被固定到手机后,相机的图像传感器的图像采集方向就固定住了,因此相机传感器的采集图像的方向我们是改变不了,只能对采集后获得的图片数据进行旋转,以便得到正确的预览。我们可以通过CameraInfo对象的orientation属性来获取图像传感器的图像采集方向,orientation属性就描述着相机的图像传感器采集图像的方向,orientation是一个角度值,只能是0,90,180,270四个中的一个,表示的含义就是图像传感器采集图像的角度,忘记说了,这里的角度是相对于手机的“自然方向”来说的,何为“自然方向”?是指当宽比高短时,我们看到的手机的方向(竖屏),可以这样理解,这个值是相机所采集的图片需要顺时针旋转至自然方向的角度值,因为如果我们要想在手机的自然方向上正确预览相机拍照的图片数据,我们必须对相机传感器采集的图像进行顺时针旋转,这个旋转的角度就是orientation,注意只能对拍照后获得的图片数据进行旋转,我们是无法改变相机传感器采集图像的方向的,因为它在相机被固定到手机上后,就被固定死了。
图像传感器的预览方向默认情况下是和图像传感器的图像采集方向是一致,也就是前面提到的orientation值,那这里为什么说默认呢?是因为相机传感器的预览方向是可以改变的,不像图像传感器的图像采集方向无法改变,通过Camera对象的setDisplayOrientation方法改变预览方向(顺时针旋转)。对大部分手机来说,后置摄像头的orientation为90,也就是说我们需要对拍照采集的图片数据顺时针旋转90度,才能够在自然方向正确预览我们拍摄后的图片,需要通过Camera对象的setDisplayOrientation顺时针旋转90度才能在自然方向正确预览我们的摄像头画面。同样对于大部分手机来说,前置摄像头的orientation通常为270度,也就是说我们需要对拍照采集的图片数据顺时针旋转270度,才能够在自然方向正确预览我们拍摄后的图片,但是我们预览方向我们却不是顺时针旋转270度,而是90度,这是为什么呢?因为前者摄像头会在旋转预览方向之前,会对预览方向来一个水平的镜像翻转,这就是为什么我们通过前者摄像头像是在照镜子一般,可能还不太理解,我们会通过图片来对上面的分析进行演示。
后置摄像头orientation=90,此时图像传感器采集图像的方向90度,相对于自然方向,如下:
此时图像采集的方向我们是无法改变的,但是能够改变预览的方向,通过setDisplayOrientation(90)顺时针旋转预览方向,以便在自然方向进行正确预览。
我们来看看前置摄像头orientation=270的情况,铭记前置摄像头预览方向在旋转之前会进行一个水平镜像翻转(可以理解为逆时针旋转180),这就是为什么我们通过手机前置摄像头预览时,看到的像是在照镜子一般。
此时我们需要将获取到的图片数据进行顺时针旋转270度,才能够在手机自然方向正确预览。接下来看看前者摄像头预览方向,注意咯
好了,就到这,水平有限,有什么错误的地方,希望各位大神留言,拜托了。
② android 屏幕旋转生命周期和setRequestedOrientation强制旋转
屏幕会根据当前传感器进行自动旋转,旋转之后,activity屏幕的 生命周期不会发生变化 ,在activity中只会回调onConfigurationChanged方法
可见每次旋转onDestory()方法都会被调用,如果要保存一些activity被销毁前的数据的可以在onSaveInstanceState()方法中通过Bundle去保存
当我们调用了:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)
或者
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
之后屏幕不会再自动旋转回来的情况
关于这点:我在b站App端也发现相关问题,点进b站的播放视频界面,我们手机开启屏幕自动旋转,当我们横竖屏旋转的时候是可以正常横竖屏切换的,但是我们点击视频右下角的放大(就是横屏)之后,自动旋转就失效了,要竖屏的话需要再点击一次
关于这个问题,就是我们说的setRequestedOrientation之后重力传感失效的问题,处理的方法也很简单
在AndroidManifest.xml中设置了android:configChanges="orientation|keyboardHidden|screenSize的基础上,在onConfigurationChanged中调用 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR) 方法,使其恢复重力传感即可
③ 如何在 Android 程序中禁止屏幕旋转和重启Activity
第一种方法:在清单文件的那个Activity标签中添加:android:screenOrientation="portrait"
第二种:在activity的onCreate中加入这些:
if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
} else {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
一般在全项目都需要加的时候,只需要写个Activity的基类,让其他的都继承这个类,然后设置第二种就可以了,不用每个都写