Android屏幕旋轉(zhuǎn)之橫屏豎屏切換的實現(xiàn)
剛實現(xiàn)了App內(nèi)手機橫/豎放置時,屏幕橫/豎屏的切換。記錄一下中間需要的關鍵信息和實現(xiàn)過程。
開門見山的說,實現(xiàn)屏幕自動/手動旋轉(zhuǎn)的方式有兩種:
一種是在工程的代碼中定義,這種方式在橫豎屏切換時執(zhí)行的操作是:銷毀當前Activity–根據(jù)新的屏幕尺寸重建Activity。如果不進行數(shù)據(jù)存儲的操作,在切換的過程中Activity中的數(shù)據(jù)會丟失。
另一種是在工程的AndroidManifest.xml中定義,這種定義的方式在某些情況下可以實現(xiàn)“不銷毀需要橫豎屏的Activity”,因為這種方式不會銷毀Activity后重建Activity,因此Activity的數(shù)據(jù)不會丟失。
接下來分別介紹這兩種實現(xiàn)方式:
方式一:代碼中定義
在需要橫屏的Activity中的onCreate方法內(nèi)添加如下語句,并且要求該語句位于onCreate方法內(nèi)setContentView(**)語句之前。
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
上條語句中,常數(shù)SCREEN_ORIENTATION_FULL_SENSOR是決定屏幕如何旋轉(zhuǎn)的參數(shù)。總結所有的參數(shù)對應的功能:
參數(shù) | 功能 |
---|---|
SCREEN_ORIENTATION_BEHIND | 繼承Activity堆棧中當前Activity下面的那個Activity的方向 |
SCREEN_ORIENTATION_FULL_SENSOR | 由重力傳感器決定0/90/180/270° |
SCREEN_ORIENTATION_FULL_USER | |
SCREEN_ORIENTATION_LANDSCAPE | 始終橫屏 |
SCREEN_ORIENTATION_PORTRAIT | 始終豎屏 |
SCREEN_ORIENTATION_LOCKED | 鎖定屏幕方向 |
SCREEN_ORIENTATION_NOSENSOR | 關閉重力傳感器對橫/豎屏的影響 |
SCREEN_ORIENTATION_REVERSE_LANDSCAPE | 另一個方向的橫屏 |
SCREEN_ORIENTATION_REVERSE_PORTRAIT | 另一個方向的豎屏(倒拿手機) |
SCREEN_ORIENTATION_SENSOR | 重力傳感器影響屏幕的方向0/90/270° |
SCREEN_ORIENTATION_SENSOR_LANDSCAPE | 始終橫屏,由重力傳感器決定是哪個方向的橫屏 |
SCREEN_ORIENTATION_SENSOR_PORTRAIT | 始終豎屏,由重力傳感器決定是哪個方向的豎屏 |
SCREEN_ORIENTATION_UNSPECIFIED | 不指定方向,使用默認方向 |
SCREEN_ORIENTATION_USER | 由用戶和重力傳感器共同決定,詳見文本末端 |
SCREEN_ORIENTATION_USER_LANDSCAPE | 用戶和重力傳感器共同決定是哪個方向的橫屏 |
SCREEN_ORIENTATION_USER_PORTRAIT | 用戶和重力傳感器共同決定是哪個方向的豎屏 |
UIOPTION_SPLIT_ACTION_BAR_WHEN_NARROW | 當屏幕較窄時導航欄有一部分會顯示在底部 |
由于該方式下橫/豎屏切換時,對應的Activity的數(shù)據(jù)會丟失,可以在對應的Activity中重寫如下兩個方法,來保證數(shù)據(jù)不丟失:
@Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); //橫豎屏切換前調(diào)用,保存用戶想要保存的數(shù)據(jù),以下是樣例 outState.putString("name","yoosir"); outState.putInt("age",24); outState.putBoolean("handsome",true); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); // 屏幕切換完畢后調(diào)用用戶存儲的數(shù)據(jù),以下為樣例: if(savedInstanceState != null) { int age = savedInstanceState.getInt("age"); String name = savedInstanceState.getString("name"); boolean isHandsome = savedInstanceState.getBoolean("handsome"); } }
方式二:在AndroidManifest.xml中定義
在AndroidManifest.xml中對應的Activity屬性定義中配置android:configChanges和screenOrientation。參考的文章中在android:configChanges的配置說的很清楚,我直接把結論貼出來:
android:configChanges="orientation|keyboardHidden|screenSize"
- 配置configChanges為以上配置時,切屏不會重新調(diào)用各個生命周期,只會執(zhí)行onConfigurationChanged方法。Activity中的數(shù)據(jù)不會被銷毀。
- 不配置configChanges或配置configChanges為非以上配置時,切屏會重新調(diào)用當前Activity的各個生命周期。Activity中的數(shù)據(jù)會被銷毀。
給出示例代碼如下:
<activity android:name=".com.cdsn.SearchActivity" ... ... android:screenOrientation="sensor" android:configChanges="keyboardHidden|orientation|screenSize" />
上述代碼中的android:screenOrientation所有可能的參數(shù)配置如下 。
值 | 描述 |
---|---|
unspecified | 默認值。系統(tǒng)自動選擇屏幕方向 |
behind | 跟activity堆棧中的下面一個activity的方向一致 |
landscape | 橫屏方向,顯示的寬比高長 |
portrait | 豎屏方向,顯示的高比寬長 |
sensor | 由設備的物理方向傳感器決定,如果用戶旋轉(zhuǎn)設備,這屏幕就會橫豎屏切換 |
nosensor | 忽略物理方向傳感器,這樣就不會隨著用戶旋轉(zhuǎn)設備而橫豎屏切換了(”unspecified”設置除外) |
user | 用戶當前首選的方向 |
reverseLandscape | API 9 以上,反向橫屏 |
reversePortrait | API 9 以上,反向豎屏 |
sensorLandscape | API 9 以上,橫屏,但是可以根據(jù) 物理方向傳感器來切換正反向橫屏 |
sensorPortrait | API 9 以上,豎屏,但是可以根據(jù) 物理方向傳感器來切換正反向豎屏 |
fullSensor | API 9 以上,上下左右四個方向,由物理方向傳感器決定 |
locked | API 18 以上,鎖死當前屏幕的方向 |
上述代碼中的android:configChanges所有可能的參數(shù)配置如下:
值 | 描述 |
---|---|
mcc | IMSI移動臺的國家代碼(MCC)發(fā)生變化——一個SIM被探測到并且更新MCC |
mnc | IMSI移動臺的網(wǎng)絡代碼(MNC)發(fā)生變化——一個SIM被探測到并且更新MNC |
locale | 區(qū)域發(fā)生變化——用戶選擇了一個文本需要顯示的新語言 |
keyboard | 鍵盤類型發(fā)生變化——例如:用戶插入了外接鍵盤。 |
keyboardHidden | 鍵盤的可訪問性發(fā)生變化——例如:用戶發(fā)現(xiàn)了硬件鍵盤。 |
screenLayout | 屏幕布局發(fā)生變化——這個會導致顯示不同的Activity。 |
orientation | 屏幕方向發(fā)生變化——用戶旋轉(zhuǎn)了屏幕。注意:如果應用程序的目標API級別是13或更高(通過屬性minSdkVersion和屬性targetSdkVersion聲明),你也需要聲明配置項screenSize,因為這將在設備選擇肖像和屏幕方向時發(fā)生改變。 |
screenSize | 當前可用屏幕大小發(fā)生變化。這代表一個當前可用大小的變化,和當前的比率相關,因此當用戶選擇不同的畫面和圖像,會發(fā)生變化。然而,如果你的程序目標API級別是12或更低,你的Activity總是會自己處理這個配置變化(這個變化不會引起Activity的重啟,甚至在Android 3.2或更新的設備上)。在API級別13里加入的。 |
smallestScreenSize | 物理屏幕大小的變化。不管方向的變化,僅僅在實際物理屏幕打包變化的時候,如:外接顯示器。這個配置項的變化引起在smallestWidth configuration里的變化。然而,如果你的程序目標API級別是12或更低,你的Activity將自己處理這個變化(這個變化不會引起Activity的重啟,甚至在Android 3.2或更新的設備上)在API級別13里加入的。 |
layoutDirection | 布局方向變化。例如書寫方式從左向右(LTR)轉(zhuǎn)換為從右向左(RTL) |
配置了以上屬性之后,進行橫豎屏切換的Activity的數(shù)據(jù)不會丟失,如果想根據(jù)不同的屏幕方向來展示不同UI或做不同的事,需要在該Activity中重寫以下方法:
@Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); // 在這里添加屏幕切換后的操作 }
番外
我按照上述方法,根據(jù)重力傳感器實現(xiàn)了屏幕旋轉(zhuǎn),雖然可以做到屏幕隨重力傳感器切換,但是發(fā)現(xiàn):無論手機設置中“屏幕旋轉(zhuǎn)”或“方向鎖定”是開是關,App內(nèi)的Activity都會隨著手機的橫豎方向切換橫豎屏。我想要實現(xiàn)的是當打開“屏幕旋轉(zhuǎn)”時,App內(nèi)的Activity跟隨重力感應器;當關閉“屏幕旋轉(zhuǎn)”時,App內(nèi)的Activity固定為默認方向。如何做到關閉重力傳感器時,App亦關閉屏幕自動旋轉(zhuǎn)?
android:screenOrientation="sensor"
改上述代碼為以下代碼
android:screenOrientation="user"
意即:當參數(shù)為sensor時,無論是否關閉“屏幕旋轉(zhuǎn)”設置,App內(nèi)的特定Activity都會根據(jù)重力傳感器改變橫豎屏。
當參數(shù)為user時,當“屏幕旋轉(zhuǎn)”開啟,則特定Activity根據(jù)根據(jù)重力傳感器改變橫豎屏;當“屏幕旋轉(zhuǎn)”關閉,則特定Activity會固定位默認方向(一般為正面豎屏)。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持我們。
上一篇:android shape實現(xiàn)陰影或模糊邊效果
欄 目:Android
下一篇:Android實現(xiàn)自定義手勢和識別手勢的功能
本文標題:Android屏幕旋轉(zhuǎn)之橫屏豎屏切換的實現(xiàn)
本文地址:http://mengdiqiu.com.cn/a1/Android/9156.html
您可能感興趣的文章
- 01-10Android自定義View之繪制圓形頭像功能
- 01-10Android實現(xiàn)雙擊返回鍵退出應用實現(xiàn)方法詳解
- 01-10android實現(xiàn)記住用戶名和密碼以及自動登錄
- 01-10android實現(xiàn)簡單計算器功能
- 01-10Android 友盟第三方登錄與分享的實現(xiàn)代碼
- 01-10android實現(xiàn)指紋識別功能
- 01-10Emoji表情在Android JNI中的兼容性問題詳解
- 01-10Android實現(xiàn)圓形漸變加載進度條
- 01-10android開發(fā)環(huán)境中SDK文件夾下的所需內(nèi)容詳解
- 01-10android異步消息機制 源碼層面徹底解析(1)


閱讀排行
本欄相關
- 01-10Android自定義View之繪制圓形頭像功能
- 01-10Android實現(xiàn)雙擊返回鍵退出應用實現(xiàn)方
- 01-10android實現(xiàn)簡單計算器功能
- 01-10android實現(xiàn)記住用戶名和密碼以及自動
- 01-10C++自定義API函數(shù)實現(xiàn)大數(shù)相乘算法
- 01-10Android 友盟第三方登錄與分享的實現(xiàn)代
- 01-10android實現(xiàn)指紋識別功能
- 01-10如何給Flutter界面切換實現(xiàn)點特效
- 01-10Android實現(xiàn)圓形漸變加載進度條
- 01-10Emoji表情在Android JNI中的兼容性問題詳
隨機閱讀
- 01-10delphi制作wav文件的方法
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 04-02jquery與jsp,用jquery
- 01-11ajax實現(xiàn)頁面的局部加載
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10C#中split用法實例總結
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-10SublimeText編譯C開發(fā)環(huán)境設置