Android游戲開發(fā)屏幕旋轉(zhuǎn)問題完美解決

做游戲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)延遲以外性穿,別的都是完美解決

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市雷滚,隨后出現(xiàn)的幾起案子需曾,更是在濱河造成了極大的恐慌,老刑警劉巖祈远,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件呆万,死亡現(xiàn)場離奇詭異,居然都是意外死亡车份,警方通過查閱死者的電腦和手機(jī)谋减,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來扫沼,“玉大人出爹,你說我怎么就攤上這事庄吼。” “怎么了严就?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵总寻,是天一觀的道長。 經(jīng)常有香客問我梢为,道長渐行,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任铸董,我火速辦了婚禮祟印,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘粟害。我一直安慰自己旁理,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布我磁。 她就那樣靜靜地躺著,像睡著了一般驻襟。 火紅的嫁衣襯著肌膚如雪夺艰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天沉衣,我揣著相機(jī)與錄音郁副,去河邊找鬼。 笑死豌习,一個胖子當(dāng)著我的面吹牛存谎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播肥隆,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼既荚,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了栋艳?” 一聲冷哼從身側(cè)響起恰聘,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎吸占,沒想到半個月后晴叨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡矾屯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年兼蕊,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片件蚕。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡孙技,死狀恐怖产禾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情绪杏,我是刑警寧澤下愈,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站蕾久,受9級特大地震影響势似,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜僧著,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一履因、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧盹愚,春花似錦栅迄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至愈腾,卻和暖如春憋活,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背虱黄。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工悦即, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人橱乱。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓辜梳,卻偏偏與公主長得像,于是被迫代替她去往敵國和親泳叠。 傳聞我的和親對象是個殘疾皇子作瞄,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,871評論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件危纫、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,066評論 4 62
  • 鵬慧閱讀 344評論 0 0
  • 今天我去看了心理老師粉洼。其實我最大的收獲就是她告訴我。其實每個人的心里暗示很重要的叶摄。如果一個人不停地對自己說属韧。我不行...
    橞在祺中閱讀 171評論 0 0