Android實(shí)現(xiàn)屏幕旋轉(zhuǎn)方法總結(jié)
本文實(shí)例總結(jié)了Android實(shí)現(xiàn)屏幕旋轉(zhuǎn)方法。分享給大家供大家參考。具體如下:
在介紹之前,我們需要先了解默認(rèn)情況下android屏幕旋轉(zhuǎn)的機(jī)制:
默認(rèn)情況下,當(dāng)用戶手機(jī)的重力感應(yīng)器打開后,旋轉(zhuǎn)屏幕方向,會(huì)導(dǎo)致當(dāng)前activity發(fā)生onDestroy-> onCreate,這樣會(huì)重新構(gòu)造當(dāng)前activity和界面布局,如果在Camera界面,則表現(xiàn)為卡頓或者黑屏一段時(shí)間。如果是在橫豎屏UI設(shè)計(jì)方面,那么想很好地支持屏幕旋轉(zhuǎn),則建議在res中建立layout-land和layout-port兩個(gè)文件夾,把橫屏和豎屏的布局文件分別放入對(duì)應(yīng)的layout文件夾中。
了解了這些以后,我們對(duì)android的屏幕旋轉(zhuǎn)方法進(jìn)行如下總結(jié):
1. AndroidManifest.xml設(shè)置
如果單單想設(shè)置橫屏或者豎屏,那么只需要添加橫豎屏代碼:
android:screenOrientation="landscape"橫屏設(shè)置; android:screenOrientation="portrait"豎屏設(shè)置;
這種方法的優(yōu)點(diǎn):即使屏幕旋轉(zhuǎn),Activity也不會(huì)重新onCreate。
缺點(diǎn):屏幕只有一個(gè)方向。
2. 代碼動(dòng)態(tài)設(shè)置
如果你需要?jiǎng)討B(tài)改變橫豎屏設(shè)置,那么,只需要在代碼中調(diào)用setRequestedOrientation()函數(shù):
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); //橫屏設(shè)置 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); //豎屏設(shè)置 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); //默認(rèn)設(shè)置
這種方法優(yōu)點(diǎn):可以隨意動(dòng)態(tài)設(shè)置,滿足我們?nèi)藶楦淖儥M豎屏的要求,同時(shí)滿足橫豎屏UI不同的設(shè)計(jì)需求;
缺點(diǎn):如果改變?cè)O(shè)置,那么,Activity會(huì)被銷毀,重新構(gòu)建,即重新onCreate;
3. 重寫onConfigurationChanged
如果你不希望旋轉(zhuǎn)屏幕的時(shí)候Activity被不斷的onCreate(這種情況往往會(huì)造成屏幕切換時(shí)的卡頓),那么,可以使用此方法:
首先,在AndroidMainfest.xml中添加configChanges:
<activity android:name=".Test" android:configChanges="orientation|keyboard"> </activity>
注意,keyboardHidden表示鍵盤輔助功能隱藏,如果你的開發(fā)API等級(jí)等于或高于13,還需要設(shè)置screenSize,因?yàn)閟creenSize會(huì)在屏幕旋轉(zhuǎn)時(shí)改變;
android:configChanges="keyboardHidden|orientation|screenSize"
然后,在Activity中重寫onConfigurationChanged方法,這個(gè)方法將會(huì)在屏幕旋轉(zhuǎn)變化時(shí),進(jìn)行監(jiān)聽處理:
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
}
}
這個(gè)方法的優(yōu)點(diǎn):我們可以隨時(shí)監(jiān)聽屏幕旋轉(zhuǎn)變化,并對(duì)應(yīng)做出相應(yīng)的操作;
缺點(diǎn):它只能一次旋轉(zhuǎn)90度,如果一下子旋轉(zhuǎn)180度,onConfigurationChanged函數(shù)不會(huì)被調(diào)用。
4. 結(jié)合OrientationEventListener,自定義旋轉(zhuǎn)監(jiān)聽設(shè)置
如果你想更加完美,更加完全的掌控監(jiān)聽屏幕旋轉(zhuǎn)變化,比如,轉(zhuǎn)屏?xí)r不想重新onCreate,尤其是在Camera界面,不想出現(xiàn)旋轉(zhuǎn)preview時(shí)屏幕的卡頓、黑屏等問題,那么,可以嘗試:
首先,創(chuàng)建OrientationEventListener對(duì)象:
private OrientationEventListener mOrientationListener; // screen orientation listener private boolean mScreenProtrait = true; private boolean mCurrentOrient = false;
然后,自定義屏幕變化回調(diào)接口
abstract protected void OrientationChanged(int orientation); //screen orientation change event
最后,自定義監(jiān)聽類
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()中調(diào)用:
startOrientationChangeListener();
這個(gè)方法的優(yōu)點(diǎn):你可以任意隨時(shí)準(zhǔn)確的監(jiān)聽屏幕旋轉(zhuǎn)變化的狀態(tài),可以隨時(shí)動(dòng)態(tài)改變橫豎屏狀態(tài);
注:對(duì)于Camera來說,你可以設(shè)置初始化為橫屏或者豎屏,然后對(duì)外提供旋轉(zhuǎn)監(jiān)聽,這樣,既可以獲得屏幕旋轉(zhuǎn)狀態(tài),讓你做出相應(yīng)的操作,又不會(huì)出現(xiàn)重新onCreate當(dāng)前Activity造成的卡頓與短暫的黑屏切換。
希望本文所述對(duì)大家的Android程序設(shè)計(jì)有所幫助。
- Android實(shí)現(xiàn)屏幕旋轉(zhuǎn)四個(gè)方向準(zhǔn)確監(jiān)聽
- Android如何監(jiān)聽屏幕旋轉(zhuǎn)
- Android屏幕旋轉(zhuǎn)之橫屏豎屏切換的實(shí)現(xiàn)
- Android6.0開發(fā)中屏幕旋轉(zhuǎn)原理與流程分析
- Android webview旋轉(zhuǎn)屏幕導(dǎo)致頁面重新加載問題解決辦法
- Android屏幕旋轉(zhuǎn) 處理Activity與AsyncTask的最佳解決方案
- 詳解Android中Runtime解決屏幕旋轉(zhuǎn)問題(推薦)
- Android開發(fā) 旋轉(zhuǎn)屏幕導(dǎo)致Activity重建解決方法
- Android實(shí)現(xiàn)簡單旋轉(zhuǎn)動(dòng)畫
- Android App獲取屏幕旋轉(zhuǎn)角度的方法
相關(guān)文章
關(guān)于Android添加fragment后版本不兼容問題
這篇文章主要介紹了Android添加fragment后版本不兼容問題的解決方法,需要的朋友可以參考下2017-12-12
kotlin實(shí)現(xiàn)五子棋單機(jī)游戲
這篇文章主要為大家詳細(xì)介紹了kotlin實(shí)現(xiàn)五子棋單機(jī)游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04
Android中創(chuàng)建類似Instagram的漸變背景效果
這篇文章主要介紹了Android中創(chuàng)建類似Instagram的漸變背景效果,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2017-12-12
Android 代碼設(shè)置開機(jī)自啟動(dòng)App的方法
今天小編就為大家分享一篇Android 代碼設(shè)置開機(jī)自啟動(dòng)App的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-07-07
Android編程實(shí)現(xiàn)webview將網(wǎng)頁打包成apk的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)webview將網(wǎng)頁打包成apk的方法,以打包HTML5為例分析了webview打包apk的相關(guān)方法、屬性與事件操作技巧,需要的朋友可以參考下2017-08-08
android studio logcat 無篩選 顯示全部日志 無應(yīng)用包名區(qū)分方式
這篇文章主要介紹了android studio logcat 無篩選 顯示全部日志 無應(yīng)用包名區(qū)分方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-04-04
Android 邊播邊緩存的實(shí)現(xiàn)(MP4 未加密m3u8)
這篇文章主要介紹了Android 邊播邊緩存的實(shí)現(xiàn)(MP4 未加密m3u8),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11

