android:screenOrientation屬性說明:
- unspecified末盔,默認(rèn)值,由系統(tǒng)決定它碎,不同手機可能不一致
- landscape券敌,強制橫屏顯示岖研,只有一個方向
- portrait卿操,強制豎屏顯警检,只有一個方向
- behind,與前一個activity方向相同
- sensor害淤,根據(jù)物理傳感器方向轉(zhuǎn)動扇雕,用戶90度、180度窥摄、270度旋轉(zhuǎn)手機方向镶奉,activity都更著變化,會重啟activity(無論系統(tǒng)是否設(shè)置為自動轉(zhuǎn)屏崭放,activity頁面都會跟隨傳感器而轉(zhuǎn)屏)
- sensorLandscape哨苛,橫屏旋轉(zhuǎn),就是可以上下旋轉(zhuǎn)币砂,有兩個方向移国,不會重啟activity
- sensorPortrait,豎屏旋轉(zhuǎn)道伟,就是可以上下旋轉(zhuǎn),有兩個方向使碾,不會重啟activity
- nosensor蜜徽,旋轉(zhuǎn)設(shè)備時候,界面不會跟著旋轉(zhuǎn)票摇。初始化界面方向由系統(tǒng)控制(無論系統(tǒng)是否設(shè)置為自動轉(zhuǎn)屏拘鞋,activity頁面都不會轉(zhuǎn)屏)
- user,用戶當(dāng)前設(shè)置的方向
- reverseLandscape矢门,與正常的橫向方向相反顯示(反向橫屏)
- reversePortrait盆色,與正常的縱向方向相反顯示(反向豎屏)(我設(shè)置沒用)
1、AndroidManifest.xml設(shè)置
<activity
android:name=".ManifestHorizontalActivity"
android:screenOrientation="landscape" /><!--橫屏設(shè)置-->
<activity
android:name=".ManifestVerticalActivity"
android:screenOrientation="portrait" /><!--豎屏設(shè)置-->
直接如上代碼設(shè)置祟剔,橫屏或者豎屏是被直接定死隔躲,旋轉(zhuǎn)方向不會變化,只有一個方向(意思是旋轉(zhuǎn)180°也不會改變)物延,當(dāng)然就不會在手機旋轉(zhuǎn)的時候重啟activity宣旱。
2、代碼動態(tài)設(shè)置
想要在代碼中設(shè)置叛薯,就需要調(diào)用setRequestedOrientation()函數(shù)浑吟,其效果就是和在
AndroidManifest中設(shè)置一樣的,當(dāng)前方向和設(shè)置的方向不一致的時候耗溜,會重啟activity组力,一致的話不會重啟。
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//橫屏設(shè)置
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//豎屏設(shè)置
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);//默認(rèn)設(shè)置
如果不想activity被重啟抖拴,可以在AndroidManifest中加上android:configChanges(orientation|screenSize這兩個一定要加上)
<activity
android:name=".MainActivity"
android:screenOrientation="sensor"
android:configChanges="keyboardHidden|orientation|screenSize">
之后在Activity中重寫onConfigurationChanged方法(如果你不需要做監(jiān)聽處理燎字,可以不寫)
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
Log.d(TAG, "onConfigurationChanged");
}
這個方法將會在屏幕旋轉(zhuǎn)變化時調(diào)用,可以在這里做出我們在屏幕變化時想要的操作,并且不會重啟activity轩触。但它只能一次旋轉(zhuǎn)90度寞酿,如果一下子旋轉(zhuǎn)180度,onConfigurationChanged函數(shù)不會被調(diào)用脱柱。
如果想要更詳細(xì)的監(jiān)聽旋轉(zhuǎn)的角度伐弹,就要使用到OrientationEventListener,
private OrientationEventListener orientationEventListener;
在onCreate中初始化監(jiān)聽器
mOrientationListener = new OrientationEventListener(this) {
@Override
public void onOrientationChanged(int orientation) {
Log.d(TAG, "onOrientationChanged: " + orientation);
if (orientation == OrientationEventListener.ORIENTATION_UNKNOWN) {
return; // 手機平放時榨为,檢測不到有效的角度
}
// 只檢測是否有四個角度的改變
if (orientation > 350 || orientation < 10) {
// 0度:手機默認(rèn)豎屏狀態(tài)(home鍵在正下方)
Log.d(TAG, "下");
} else if (orientation > 80 && orientation < 100) {
// 90度:手機順時針旋轉(zhuǎn)90度橫屏(home建在左側(cè))
Log.d(TAG, "左");
} else if (orientation > 170 && orientation < 190) {
// 180度:手機順時針旋轉(zhuǎn)180度豎屏(home鍵在上方)
Log.d(TAG, "上");
} else if (orientation > 260 && orientation < 280) {
// 270度:手機順時針旋轉(zhuǎn)270度橫屏惨好,(home鍵在右側(cè))
Log.d(TAG, "右");
}
}
};
之后調(diào)用 mOrientationListener.enable();
打開監(jiān)聽和mOrientationListener.disable();
關(guān)閉監(jiān)聽。