開發(fā)需求:只能橫屏蜻拨,并且根據(jù)手機(jī)自動(dòng)旋轉(zhuǎn)開關(guān)的狀態(tài)調(diào)整是否可以上下翻轉(zhuǎn)
設(shè)置橫屏其實(shí)很簡(jiǎn)單荚守,就是設(shè)置android:screenOrientation就可以希俩。所以我們先來(lái)了解一下android:screenOrientation的屬性都有哪些?
unspecified档押,默認(rèn)值逞力,由系統(tǒng)決定煌往,不同手機(jī)可能不一致
landscape倾哺,強(qiáng)制橫屏顯示
portrait,強(qiáng)制豎屏顯
behind刽脖,與前一個(gè)activity方向相同
sensor羞海,根據(jù)物理傳感器方向轉(zhuǎn)動(dòng),用戶90度曲管、180度扣猫、270度旋轉(zhuǎn)手機(jī)方向,activity都更著變化
sensorLandscape翘地,橫屏旋轉(zhuǎn)申尤,一般橫屏游戲會(huì)這樣設(shè)置
sensorPortrait,豎屏旋轉(zhuǎn)
nosensor衙耕,旋轉(zhuǎn)設(shè)備時(shí)候昧穿,界面不會(huì)跟著旋轉(zhuǎn)。初始化界面方向由系統(tǒng)控制
user橙喘,用戶當(dāng)前設(shè)置的方向
而滿足我們需求的屬性时鸵,分別為
1 強(qiáng)制橫屏顯示
android:screenOrientation="landscape"
2 橫屏旋轉(zhuǎn)
android:screenOrientation="sensorLandscape"
他們之間又有什么區(qū)別呢?
1 landscape :強(qiáng)制橫屏厅瞎,不管自動(dòng)旋轉(zhuǎn)開關(guān)是否開啟饰潜,都只能是正方向橫屏,不會(huì)180度旋轉(zhuǎn)
2 sensorLandscape : 橫屏旋轉(zhuǎn)和簸,不管自動(dòng)旋轉(zhuǎn)開關(guān)是否開啟彭雾,都會(huì)180度旋轉(zhuǎn)
這兩個(gè)屬性明顯不滿足我們的需求,這時(shí)候我們只能去監(jiān)聽自動(dòng)旋轉(zhuǎn)開關(guān)的狀態(tài)锁保,然后設(shè)置對(duì)應(yīng)的screenOrientation薯酝,這樣才能滿足需求半沽。
如何判斷自動(dòng)旋轉(zhuǎn)開關(guān)是否開啟
//是否開啟自動(dòng)旋轉(zhuǎn)設(shè)置 1 開啟 0 關(guān)閉
int screenchange = Settings.System.getInt(getContentResolver(), Settings.System.ACCELEROMETER_ROTATION);
但是這只是一次獲取,所以我們需求實(shí)時(shí)監(jiān)聽開關(guān)狀態(tài)吴菠。
如何監(jiān)聽自動(dòng)旋轉(zhuǎn)開關(guān)狀態(tài)改變
我們通過(guò)ContentObserver來(lái)監(jiān)聽自動(dòng)開關(guān)狀態(tài)的改變
//觀察屏幕旋轉(zhuǎn)設(shè)置變化者填,類似于注冊(cè)動(dòng)態(tài)廣播監(jiān)聽變化機(jī)制
private class RotationObserver extends ContentObserver {
ContentResolver mResolver;
public RotationObserver(Handler handler) {
super(handler);
mResolver = getContentResolver();
// TODO Auto-generated constructor stub
}
//屏幕旋轉(zhuǎn)設(shè)置改變時(shí)調(diào)用
@Override
public void onChange(boolean selfChange) {
// TODO Auto-generated method stub
super.onChange(selfChange);
//更新按鈕狀態(tài)
setScreenOrientation();
}
public void startObserver() {
mResolver.registerContentObserver(Settings.System
.getUriFor(Settings.System.ACCELEROMETER_ROTATION), false,
this);
}
public void stopObserver() {
mResolver.unregisterContentObserver(this);
}
}
了解了這些之后,我們就能完成需求了
需要添加的code
1 初始化監(jiān)聽
//創(chuàng)建觀察類對(duì)象
mRotationObserver = new RotationObserver(new Handler());
2 注冊(cè)監(jiān)聽
@Override
protected void onResume() {
mRotationObserver.startObserver();
setScreenOrientation();
super.onResume();
}
3 退出時(shí)取消監(jiān)聽
@Override
protected void onPause() {
mRotationObserver.stopObserver();
super.onPause();
}
4 相關(guān)的類與方法
private void setScreenOrientation() {
try {
int screenchange = Settings.System.getInt(getContentResolver(), Settings.System.ACCELEROMETER_ROTATION);
//是否開啟自動(dòng)旋轉(zhuǎn)設(shè)置 1 開啟 0 關(guān)閉
if (screenchange == 1){
setRequestedOrientation(SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
}else {
setRequestedOrientation(SCREEN_ORIENTATION_LANDSCAPE);
}
} catch (Settings.SettingNotFoundException e) {
e.printStackTrace();
}
}
//觀察屏幕旋轉(zhuǎn)設(shè)置變化做葵,類似于注冊(cè)動(dòng)態(tài)廣播監(jiān)聽變化機(jī)制
private class RotationObserver extends ContentObserver {
ContentResolver mResolver;
public RotationObserver(Handler handler) {
super(handler);
mResolver = getContentResolver();
// TODO Auto-generated constructor stub
}
//屏幕旋轉(zhuǎn)設(shè)置改變時(shí)調(diào)用
@Override
public void onChange(boolean selfChange) {
// TODO Auto-generated method stub
super.onChange(selfChange);
//更新按鈕狀態(tài)
setScreenOrientation();
}
public void startObserver() {
mResolver.registerContentObserver(Settings.System
.getUriFor(Settings.System.ACCELEROMETER_ROTATION), false,
this);
}
public void stopObserver() {
mResolver.unregisterContentObserver(this);
}
}