Android實現螢幕旋轉方法總結

NO IMAGE

本文例項總結了Android實現螢幕旋轉方法。分享給大家供大家參考。具體如下:

在介紹之前,我們需要先了解預設情況下android螢幕旋轉的機制:

預設情況下,當使用者手機的重力感應器開啟後,旋轉螢幕方向,會導致當前activity發生onDestroy-> onCreate,這樣會重新構造當前activity和介面佈局,如果在Camera介面,則表現為卡頓或者黑屏一段時間。如果是在橫豎屏UI設計方面,那麼想很好地支援螢幕旋轉,則建議在res中建立layout-land和layout-port兩個資料夾,把橫屏和豎屏的佈局檔案分別放入對應的layout資料夾中。

瞭解了這些以後,我們對android的螢幕旋轉方法進行如下總結:

1. AndroidManifest.xml設定

如果單單想設定橫屏或者豎屏,那麼只需要新增橫豎屏程式碼:


android:screenOrientation="landscape"橫屏設定;
android:screenOrientation="portrait"豎屏設定;

這種方法的優點:即使螢幕旋轉,Activity也不會重新onCreate。

缺點:螢幕只有一個方向。

2. 程式碼動態設定

如果你需要動態改變橫豎屏設定,那麼,只需要在程式碼中呼叫setRequestedOrientation()函式:


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:


<activity android:name=".Test"
android:configChanges="orientation|keyboard">
</activity>

注意,keyboardHidden表示鍵盤輔助功能隱藏,如果你的開發API等級等於或高於13,還需要設定screenSize,因為screenSize會在螢幕旋轉時改變;


android:configChanges="keyboardHidden|orientation|screenSize"

然後,在Activity中重寫onConfigurationChanged方法,這個方法將會在螢幕旋轉變化時,進行監聽處理:


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物件:


private OrientationEventListener mOrientationListener;
// screen orientation listener
private boolean mScreenProtrait = true;
private boolean mCurrentOrient = false;

然後,自定義螢幕變化回撥介面


abstract protected void OrientationChanged(int orientation);
//screen orientation change event

最後,自定義監聽類


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()中呼叫:


startOrientationChangeListener();

這個方法的優點:你可以任意隨時準確的監聽螢幕旋轉變化的狀態,可以隨時動態改變橫豎屏狀態;

注:對於Camera來說,你可以設定初始化為橫屏或者豎屏,然後對外提供旋轉監聽,這樣,既可以獲得螢幕旋轉狀態,讓你做出相應的操作,又不會出現重新onCreate當前Activity造成的卡頓與短暫的黑屏切換。

希望本文所述對大家的Android程式設計有所幫助。

您可能感興趣的文章:

Android動畫之補間動畫(Tween Animation)例項詳解Android動畫之漸變動畫(Tween Animation)詳解 (漸變、縮放、位移、旋轉)Android開發之圖形影象與動畫(二)Animation實現影象的漸變/縮放/位移/旋轉Android中利用matrix 控制圖片的旋轉、縮放、移動android 多點觸控圖片縮放的具體實現方法Android 圖片縮放與旋轉的實現詳解Android程式設計實現popupwindow彈出後螢幕背景變成半透明效果Android程式設計實現設定按鈕背景透明與半透明及圖片背景透明的方法android 對話方塊彈出位置和透明度的設定具體實現方法Android應用中設定alpha值來製作透明與漸變效果的例項Android設定Activity背景為透明style的簡單方法(必看)Android開發 旋轉螢幕導致Activity重建解決方法Android Tween動畫之RotateAnimation實現圖片不停旋轉效果例項介紹Android程式設計中呼叫Camera時預覽畫面有旋轉問題的解決方法Android補間動畫基本使用(位移、縮放、旋轉、透明)