Android實現屏幕旋轉方法總結

本文實例總結了Android實現屏幕旋轉方法。分享給你們供你們參考。具體以下:android

在介紹以前,咱們須要先了解默認狀況下android屏幕旋轉的機制:ide

默認狀況下,當用戶手機的重力感應器打開後,旋轉屏幕方向,會致使當前activity發生onDestroy-> onCreate,這樣會從新構造當前activity和界面佈局,若是在Camera界面,則表現爲卡頓或者黑屏一段時間。若是是在橫豎屏UI設計方面,那麼想很好地支持屏幕旋轉,則建議在res中創建layout-land和layout-port兩個文件夾,把橫屏和豎屏的佈局文件分別放入對應的layout文件夾中。函數

瞭解了這些之後,咱們對android的屏幕旋轉方法進行以下總結:佈局

1. AndroidManifest.xml設置this

若是單單想設置橫屏或者豎屏,那麼只須要添加橫豎屏代碼:spa

?.net

1設計

2code

android:screenOrientation="landscape"橫屏設置;xml

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) {

// TODO Auto-generated method stubsuper.onConfigurationChanged(newConfig);

if (newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE){

// Nothing need to be done here

} else {

// Nothing need to be done here

 }

}

這個方法的優勢:咱們能夠隨時監聽屏幕旋轉變化,並對應作出相應的操做;
缺點:它只能一次旋轉90度,若是一會兒旋轉180度,onConfigurationChanged函數不會被調用。

4. 結合OrientationEventListener,自定義旋轉監聽設置

若是你想更加完美,更加徹底的掌控監聽屏幕旋轉變化,好比,轉屏時不想從新onCreate,尤爲是在Camera界面,不想出現旋轉preview時屏幕的卡頓、黑屏等問題,那麼,能夠嘗試:
 
首先,建立OrientationEventListener對象:

?

1

2

3

4

private OrientationEventListener mOrientationListener;

// screen orientation listener

private boolean mScreenProtrait = true;

private boolean mCurrentOrient = false;

而後,自定義屏幕變化回調接口

?

1

2

abstract protected void OrientationChanged(int orientation);

//screen orientation change event

最後,自定義監聽類

?

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))) {//portrait

 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))) {//landscape

 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程序設計有所幫助。

相關文章
相關標籤/搜索