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的基類,讓其他的都繼承這個類,然後設置第二種就可以了,不用每個都寫