本文實例總結了Android實現屏幕旋轉方法。分享給大家供大家參考。具體如下:
在介紹之前,我們需要先了解默認情況下android屏幕旋轉的機制:
默認情況下,當用戶手機的重力感應器打開後,旋轉屏幕方向,會導致當前activity發生onDestroy-> onCreate,這樣會重新構造當前activity和界面佈局,如果在Camera界面,則表現爲卡頓或者黑屏一段時間。如果是在橫豎屏UI設計方面,那麼想很好地支持屏幕旋轉,則建議在res中建立layout-land和layout-port兩個文件夾,把橫屏和豎屏的佈局文件分別放入對應的layout文件夾中。
瞭解了這些以後,我們對android的屏幕旋轉方法進行如下總結:
1. AndroidManifest.xml設置
如果單單想設置橫屏或者豎屏,那麼只需要添加橫豎屏代碼:
1
2
|
android:screenOrientation= "landscape" 橫屏設置;
android:screenOrientation= "portrait" 豎屏設置;
|
這種方法的優點:即使屏幕旋轉,Activity也不會重新onCreate。
缺點:屏幕只有一個方向。
2. 代碼動態設置
如果你需要動態改變橫豎屏設置,那麼,只需要在代碼中調用setRequestedOrientation()函數:
1
2
3
4
5
6
|
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
|
這種方法優點:可以隨意動態設置,滿足我們人爲改變橫豎屏的要求,同時滿足橫豎屏UI不同的設計需求;
缺點:如果改變設置,那麼,Activity會被銷燬,重新構建,即重新onCreate;
3. 重寫onConfigurationChanged
如果你不希望旋轉屏幕的時候Activity被不斷的onCreate(這種情況往往會造成屏幕切換時的卡頓),那麼,可以使用此方法:
首先,在AndroidMainfest.xml中添加configChanges:
1
2
3
|
< activity
android:name = ".Test"
android:configChanges = "orientation|keyboard" >
</ activity >
|
注意,keyboardHidden表示鍵盤輔助功能隱藏,如果你的開發API等級等於或高於13,還需要設置screenSize,因爲screenSize會在屏幕旋轉時改變;
1
|
android:configChanges="keyboardHidden|orientation|screenSize"
|
然後,在Activity中重寫onConfigurationChanged方法,這個方法將會在屏幕旋轉變化時,進行監聽處理:
1
2
3
4
5
6
7
8
|
public
void
onConfigurationChanged(Configuration newConfig) {
if
(newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE){
}
else
{
}
}
|
這個方法的優點:我們可以隨時監聽屏幕旋轉變化,並對應做出相應的操作;
缺點:它只能一次旋轉90度,如果一下子旋轉180度,onConfigurationChanged函數不會被調用。
4. 結合OrientationEventListener,自定義旋轉監聽設置
如果你想更加完美,更加完全的掌控監聽屏幕旋轉變化,比如,轉屏時不想重新onCreate,尤其是在Camera界面,不想出現旋轉preview時屏幕的卡頓、黑屏等問題,那麼,可以嘗試:
首先,創建OrientationEventListener對象:
1
2
3
4
|
private
OrientationEventListener mOrientationListener;
private
boolean
mScreenProtrait = true ;
private
boolean
mCurrentOrient = false ;
|
然後,自定義屏幕變化回調接口
1
2
|
abstract
protected
void
OrientationChanged( int
orientation);
|
最後,自定義監聽類
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
private
final
void
startOrientationChangeListener() {
mOrientationListener
= new
OrientationEventListener( this )
{
@Override
public
void
onOrientationChanged( int
rotation) {
if
(((rotation >= 0 )
&& (rotation <= 45 ))
|| (rotation >= 315 )||((rotation>= 135 )&&(rotation<= 225 )))
{
mCurrentOrient
= true ;
if (mCurrentOrient!=mScreenProtrait)
{
mScreenProtrait
= mCurrentOrient;
OrientationChanged(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
Log.d(TAG,
"Screen
orientation changed from Landscape to Portrait!" );
}
}
else
if
(((rotation > 45 )
&& (rotation < 135 ))||((rotation> 225 )&&(rotation< 315 )))
{
mCurrentOrient
= false ;
if (mCurrentOrient!=mScreenProtrait)
{
mScreenProtrait
= mCurrentOrient;
OrientationChanged(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
Log.d(TAG,
"Screen
orientation changed from Portrait to Landscape!" );
}
}
}
};
mOrientationListener.enable();
}
|
在onCreate()中調用:
1
|
startOrientationChangeListener();
|
這個方法的優點:你可以任意隨時準確的監聽屏幕旋轉變化的狀態,可以隨時動態改變橫豎屏狀態;
注:對於Camera來說,你可以設置初始化爲橫屏或者豎屏,然後對外提供旋轉監聽,這樣,既可以獲得屏幕旋轉狀態,讓你做出相應的操作,又不會出現重新onCreate當前Activity造成的卡頓與短暫的黑屏切換。
希望本文所述對大家的Android程序設計有所幫助。