最近開發(fā)Android Camera相關(guān)的程序,被屏幕旋轉(zhuǎn)搞得頭大,一方面得考慮屏幕旋轉(zhuǎn)后布局的變化,另一方面得搞清楚屏幕的旋轉(zhuǎn)方向、角度與Camera的Preview角度的關(guān)系。本來通過重載Activity的onConfigurationChanged方法,可以檢測到屏幕旋轉(zhuǎn),但發(fā)現(xiàn)有一個問題,它只能檢測水平方向與垂直方向的切換,無法檢測180度的跳轉(zhuǎn)(例如:水平方向突然轉(zhuǎn)180度到水平方向),所以最后不得不換成OrientationEventListener方法來解決問題。在這里分享下經(jīng)驗,并就此順便總結(jié)下Android開發(fā)中屏幕旋轉(zhuǎn)的處理吧。
1. 不做任何處理的情況下
如果沒有針對性地做任何處理的話,默認(rèn)情況下,當(dāng)用戶手機(jī)的重力感應(yīng)器打開后,旋轉(zhuǎn)屏幕方向,會導(dǎo)致app的當(dāng)前activity發(fā)生onDestroy-> onCreate,會重新構(gòu)造當(dāng)前activity和界面布局,很多橫屏/豎屏的布局如果沒有很好的設(shè)計的話,轉(zhuǎn)換為豎屏/橫屏后,會顯示地很難看。
如果想很好地支持屏幕旋轉(zhuǎn),則建議在res中建立layout-land和layout-port兩個文件夾,把橫屏和豎屏的布局文件放入對應(yīng)的layout文件夾中。
2. 如何設(shè)置固定的屏幕方向
在AndroidManifest.xml對應(yīng)的 activity 屬性中,添加:
android:screenOrientation="landscape" //橫屏
android:screenOrientation="portrait" //豎屏
那么,默認(rèn)的情況下,應(yīng)用啟動后,會固定為指定的屏幕方向,即使屏幕旋轉(zhuǎn),Activity也不會出現(xiàn)銷毀或者轉(zhuǎn)向等任何反應(yīng)。
3. 強(qiáng)制開啟屏幕旋轉(zhuǎn)效果
如果用戶的手機(jī)沒有開啟重力感應(yīng)器或者在AndroidManifest.xml中設(shè)置了android:screenOrientation,默認(rèn)情況下,該Activity不會響應(yīng)屏幕旋轉(zhuǎn)事件。如果在這種情況下,依然希望Activity能響應(yīng)屏幕旋轉(zhuǎn),則添加如下代碼:
// activity的 onCreate 函數(shù)中
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
4. 屏幕旋轉(zhuǎn)時,不希望activity被銷毀
如果希望捕獲屏幕旋轉(zhuǎn)事件,并且不希望activity 被銷毀,方法如下:
(1)在AndroidManifest.xml對應(yīng)的activity屬性中,添加:
android:configChanges="orientation|screenSize"
(2)在對應(yīng)的activity中,重載函數(shù)onConfigurationChanged
@Override
public voidonConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
}
在該函數(shù)中可以通過兩種方法檢測當(dāng)前的屏幕狀態(tài):
第一種:
判斷newConfig是否等于Configuration.ORIENTATION_LANDSCAPE,Configuration.ORIENTATION_PORTRAIT
當(dāng)然,這種方法只能判斷屏幕是否為橫屏,或者豎屏,不能獲取具體的旋轉(zhuǎn)角度。
第二種:
調(diào)用this.getWindowManager().getDefaultDisplay().getRotation();
該函數(shù)的返回值,有如下四種:
Surface.ROTATION_0,Surface.ROTATION_90,Surface.ROTATION_180,Surface.ROTATION_270
其中,Surface.ROTATION_0 表示的是手機(jī)豎屏方向向上,后面幾個以此為基準(zhǔn)依次以順時針90度遞增。
(3) 這種方法的Bug
最近發(fā)現(xiàn)這種方法有一個Bug,它只能一次旋轉(zhuǎn)90度,如果你突然一下子旋轉(zhuǎn)180度,onConfigurationChanged函數(shù)不會被調(diào)用。
相關(guān)閱讀:
Android屏幕分辨率、密度的正確獲取 http://www./Linux/2013-07/87417.htm
更多Android相關(guān)信息見Android 專題頁面 http://www./topicnews.aspx?tid=11
接下來請看第2頁精彩內(nèi)容: http://www./Linux/2013-09/90534p2.htm
