做游戲Android上的游戲開發(fā)也有一年多了楞卡,雖然沒有什么高深的見解唆樊,但就遇到的問題及解決方案做下記錄
我們的游戲宛琅,橫屏的棋牌游戲,一直是鎖定橫屏的一個方向運行逗旁,有一天嘿辟,項目經(jīng)理找到我舆瘪,想讓游戲像一些IPhone游戲一樣,在旋轉(zhuǎn)屏幕的時候按照重力進(jìn)行旋轉(zhuǎn)红伦,在鎖定方向的時候又能固定一個方向英古,也就是能按照用戶選擇在橫屏方向進(jìn)行鎖定和旋轉(zhuǎn)
當(dāng)然,我信心滿滿的答應(yīng)了昙读,感覺對于一個以Android起家的我來說這并不算什么召调,五分鐘搞定
結(jié)果一個小時過去了,并沒有找到完美的解決方案蛮浑,在Android的manifest.xml做配置是不可行的
經(jīng)過我一番百度和看Android文檔唠叛,我才發(fā)現(xiàn),Android對旋轉(zhuǎn)屏沮稚,特別是只有橫屏或者豎屏雖重力旋轉(zhuǎn)的支持是到Android4.3.1才有完美支持的
unspecified - 默認(rèn)值艺沼,由系統(tǒng)選擇顯示方向
landscape - 橫向
portrait - 縱向
reverseLandscape - 反橫向(API >= 9)
reversePortrait - 反縱向(API >= 9)
user - 用戶當(dāng)前的首選方向
behind - 與Activity堆棧下的方向相同
sensor - 根據(jù)物理傳感器方向3/4個方向(取決于設(shè)備)
fullSensor - 根據(jù)物理傳感器方向4個方向
nosensor - 不按照物理傳感器方向,除此之外與"unspecified"無區(qū)別
sensorLandscape - 按照物理傳感器蕴掏,只在橫向(2個方向)進(jìn)行翻轉(zhuǎn)(API >= 9)
sensorPortrait - 按照物理傳感器障般,只在縱向(2個方向)進(jìn)行翻轉(zhuǎn)(API >= 9)
userLandscape - 按照用戶選擇,鎖定一個橫向盛杰,或者按照物理傳感器進(jìn)行橫向的翻轉(zhuǎn)(API >= 18)
userPortrait - 按照用戶選擇挽荡,鎖定一個縱向,或者按照物理傳感器進(jìn)行縱向的翻轉(zhuǎn)(API >= 18)
fullUser - 如果用戶鎖定了屏幕即供,它與"user"作用一致定拟,如果是解鎖了旋轉(zhuǎn),它與"fullSensor"作用一致(API >= 18)
locked - 鎖定了屏幕當(dāng)前方向(API >= 18)
但由于游戲是要適配各個系統(tǒng)版本的募狂,只在AndroidManifest.xml里配置顯然只能滿足部分系統(tǒng)需求办素,于是我寫了下面的代碼
public class TestOrientationActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
resetScreenOrientation();
Uri rotationUri = Settings.System.getUriFor(Settings.System.ACCELEROMETER_ROTATION);
ContentResolver resolver = getApplication().getContentResolver();
// 此處注冊監(jiān)聽旋轉(zhuǎn)設(shè)置變化
resolver.registerContentObserver(rotationUri, true, mContentConfigObserver);
}
/**
* 用于監(jiān)聽旋轉(zhuǎn)變化
*/
private ContentObserver mContentConfigObserver = new ContentObserver(new Handler()) {
@Override
public void onChange(boolean selfChange) {
resetScreenOrientation();
}
};
@Override
protected void onRestart() {
// TODO Auto-generated method stub
super.onRestart();
resetScreenOrientation();
}
private void resetScreenOrientation() {
// TODO Auto-generated method stub
int orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
int sdkInt = android.os.Build.VERSION.SDK_INT;
if (sdkInt >= Build.VERSION_CODES.JELLY_BEAN_MR2 /*18*/) {
//大于JELLY_BEAN_MR2(4.3.1)版本的直接支持按照用戶選擇進(jìn)行屏幕旋轉(zhuǎn)
//Field requires API level 18 (current min is 8):
orientation = ActivityInfo.SCREEN_ORIENTATION_USER_LANDSCAPE;
} else if (sdkInt >= Build.VERSION_CODES.GINGERBREAD) {
int flag = Settings.System.getInt(getContentResolver(),Settings.System.ACCELEROMETER_ROTATION, 0);
if (0 == flag) {
// 屏幕旋轉(zhuǎn)已經(jīng)關(guān)閉,那么固定屏幕在某一個方向
orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
} else {
// 屏幕旋轉(zhuǎn)打開祸穷,屏幕按照sensor的參數(shù)進(jìn)行旋轉(zhuǎn)
// 此參數(shù)只在GINGERBREAD(2.3.3)以上的系統(tǒng)支持
//Field requires API level 18 (current min is 8):
orientation = ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE;
}
} else {
// 小于GINGERBREAD(2.3.3)版本的系統(tǒng)不支持屏幕旋轉(zhuǎn)
orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
}
int curOrientation = getRequestedOrientation();
if (orientation != curOrientation) {
setRequestedOrientation(orientation);
}
}
}
除了在2.3.3-4.3.1的部分手機(jī)監(jiān)聽設(shè)置改變時候會出現(xiàn)延遲以外性穿,別的都是完美解決