3

我正在嘗試構建自定義相機應用程序。我有一個爲相機預覽擴展SurfaceView的類。當設備改變方向時,該表面被破壞並重新創建,導致明顯的「故障」,從而降低用戶體驗。Android:保留相機預覽方向更改,而其他視圖可以旋轉

我想要做的就是防止在取向改變時重新創建相機預覽。另外,我想在這個預覽上覆蓋一些按鈕(例如,閃光燈,前/後相機的選擇等),其將在方向改變時旋轉。這類似於股票相機應用做什麼:

Stock camera in landscape mode.

Stock camera in portrait mode. Note that buttons rotate on orientation change.

我發現(例如描述,here)最好的方法是使用清單文件中的活動方向,以迫使景觀,拍攝照片後,根據實際的設備方向旋轉結果圖像。據我所知,這種方法的缺點是這也會阻止重疊按鈕的旋轉。另外,正如我已經讀了一些關於使用片段和保留片段實例,我想知道我是否可以通過保留包含相機預覽的片段(是的,我是一個noob)來實現我的目標。

什麼是正確的方法來做到這一點?

回答

4

如果您的清單沒有聲明活動處理方向更改,並且未鎖定到單個方向,則設備的旋轉將導致整個活動被卸載並重新加載。這不是你現在體驗到的嗎?

如果您爲自己的活動指定了android:configChanges="orientation|screenSize",那麼用戶體驗將會更平滑。但是,在這種旋轉之後,您仍然無法保持相機預覽「完好無損」;佈局將被重建。

最後,股票相機應用程序的方法是通過更改按鈕和其他UI元素來設置固定(通常是風景)活動方向並僞造肖像方向。但是,如果您查看底部的系統通知或導航(軟)按鈕,則會明白實際設備已鎖定在橫向上,只有控件重新繪製。您還會注意到相機應用程序會避免使用標準文本小部件,因爲這些小部件無法輕鬆旋轉。

順便說一下,您的問題還有另一個誤解。如果您想將圖片存儲爲肖像,無論您的活動方向如何,您都需要(或不需要)手動旋轉JPEG。在大多數設備上,相機只能生成橫向JPEG文件。 Camera API包括setRotation()方法,但通常這隻在JPEG標頭中設置EXIF標誌。並非所有圖像瀏覽者都尊重這個標誌。如果您不想妥協,您可能需要手動旋轉圖像。

+0

謝謝。你說股票相機應用程序「通過更改按鈕和其他UI元素來僞造肖像方向」,他們是如何做到的?我猜他們在清單中爲此活動設置了'android:screenOrientation =「landscape」',但是如何旋轉UI元素呢? – nerdelicious

+0

他們有一個OrientationListener,當他們檢測到設備已轉向縱向時,他們旋轉按鈕圖標。你可以在開源庫存[Camera app](https://android.googlesource.com/platform/packages/apps/Camera.git)和[Open camera](https://github.com)/almalence/OpenCamera) –

+0

與聽衆的股票攝像頭似乎是最好的方法。但是,是否有任何可用的解決方案來使用OrientationListener旋轉狀態欄(通知,電池等)? – Fllo