pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

Android 橫豎屏處理的知識小結

這篇文章主要介紹了Android 橫豎屏處理的知識小結,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

Android 手機一般都支持橫豎屏旋轉,系統也會提供一個設置,控制允不允許旋轉。這里對如何在 App 中控制界面的旋轉方向做一個小結。

界面旋轉方向的決定因素

決定一個界面顯示為橫屏/豎屏的因素有幾個:

  • 系統的設置項,一般可以設置為只允許豎屏或可旋轉切換。
  • 設備的物理傳感器感應到的設備方向。
  • 不同 App 里的代碼對橫豎屏的設置。

需要注意的一點是,這三個因素沒有固定的優先級。所以即使系統的設置項中設置了固定為豎屏,App 里的代碼也可以將界面設置為橫屏,當然影響的范圍僅限于 App 內部界面。

代碼中設置橫豎屏的方法

我們有2種方法設置橫豎屏:

在 AndroidManifest.xml 文件中,對 <activity> 標簽設置 android:screenOrientation 屬性,具體的值和作用見下文。
在 Java 中調用 Activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) ,具體的值和作用見下文。

如果在 xml 中設置,則在初始化界面時就已經確定好其方向。而在如果 Java 中設置,則可以做到根據不同情況動態設置。

設置橫豎屏時傳入的值和作用

以下列出在 AndroidManifest.xml 中 <activity> 標簽的 android:screenOrientation 屬性的可能的值。如果采用 Java 方式設置,參數與之一一對應。(參考官方文檔 )

  • unspecified :默認值,不做任何指定,由系統來決定顯示方向。這將由上一個 activity 來決定,或者當 activity 處于棧底時由用戶設置的方向來決定。
  • landscape : 保持橫屏。
  • portrait : 保持豎屏。
  • user : 用戶當前設置的 orientation 值。
  • behide : 保持和上一個 Activity 的方向一致。
  • sensor : 完全根據物理傳感器的方向來決定。注意用這個值時會忽略用戶在系統設置中的旋轉開關狀態。(注意一般機器即使用這個值也不會支持豎屏旋轉180度)
  • nosensor : 忽略物理傳感器的方向。這將導致用戶旋轉手機時不會切換橫豎屏。
  • sensorLandscape : 保持橫屏,但可以根據物理傳感器來決定橫屏的方向。
  • sensorPortrait : 保持豎屏,但可以根據物理傳感器來決定豎屏的方向。
  • reverseLandscape : 保持橫屏,但方向與使用 landscape 時相反。
  • reversePortrait : 保持豎屏,但方向與使用 portrait 時相反。
  • fullSensor : 與 sensor 大致相同,區別在于這個屬性會允許4個方向都可以旋轉。
  • userLandscape : 保持橫屏,但可以在用戶允許旋轉的情況下,根據物理傳感器來決定橫屏的方向。(注意與 sensorLandscape 對比)
  • userPortrait : 保持豎屏,但可以在用戶允許旋轉的情況下,根據物理傳感器來決定豎屏的方向。(注意與 sensorPortrait 對比)
  • fullUser : 與 user 大致相同,區別在于如果用戶允許旋轉,這個屬性允許4個方向都可以旋轉。
  • locked : 屏幕方向會鎖定在當前方向,不能再旋轉。

該屬性的值有很多,但一般比較常用的幾個值也就幾個: unspecified (允許旋轉)、 landscape (固定為橫屏)、 portrait (固定為豎屏)。而且一般我們只需要在 AndroidManifest.xml 中指定好固定的值就可以了。除非你對橫豎屏切換有自己的一套邏輯,才需要在不同的邏輯下進行不同的設置。

橫豎屏切換時引起的 Activity 重新創建

默認情況下,橫豎屏切換會引起當前 Activity 銷毀然后重新創建。所以我們可以在 Activity 重新創建時根據當前橫豎屏狀態做一些差異化。最常見的就是根據橫豎屏采用不同的 layout xml。

在 res 目錄下建立 layout-land 和 layout-port 目錄,在不同目錄下分別放一個同名的 layout xml 文件,然后在代碼里正常使用這個 layout 文件,系統就會在橫豎屏切換并重新創建 Activity 時自動使用對應的 layout 文件。如:


@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_layout);
}

如果不想通過創建多個 layout 文件來區分橫豎屏布局,也可以用 Java 代碼來做一些差異化,只要使用以下判斷即可獲取當前橫豎屏的信息。


@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_layout);
  // 獲取橫豎屏信息
  int orientation = getResources().getConfiguration().orientation;
  if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
    // 針對橫屏做一些處理
  } else if (orientation == Configuration.ORIENTATION_PORTRAIT) {
    // 針對豎屏做一些處理
  }
}

有一個點需要注意,關于 Activity 的生命周期被重新調用,有的資料說:

當不設置 Activity 的 android:configChanges 屬性時,切到橫屏時會重新執行一次生命周期,而切到豎屏時會執行兩次。

如果設置了 android:configChanges="orientation" 屬性,則都只會執行一次。

但是個人實驗沒有驗證出這個說法。保險起見,可以加上 android:configChanges="orientation" 屬性,確保生命周期只調用一次。

阻止橫豎屏切換時 Activity 重啟

雖然我們可以用上面的方法對橫豎屏做不同的布局,但是橫豎屏切換導致的 Activity 重新創建還會引起用戶當前狀態、數據的丟失。例如 EditText 中輸入到一半的文字在 Activity 重新創建后會丟失。所以如果有辦法能在旋轉屏幕時不重新創建 Activity,應該是更好的一種選擇。

我們可以在 AndroidManifest.xml 中為相應的 <activity> 設置 android:configChanges 屬性,讓它不在橫豎屏切換時引起 Activity 的重新創建。

Android 3.2(API Level 13)以前的 SDK 可以使用如下配置


android:configChanges="orientation|keyboardHidden" 

而 Android 3.2 以后的 SDK 則需要設置為


android:configChanges="keyboardHidden|orientation|screenSize" 

這樣一來,橫豎屏切換時 Activity 將不會重新創建。

橫豎屏切換時的回調

一旦我們按照上述方法設置了 android:configChanges 屬性,那么橫豎屏切換時 Activity 將不會重新創建,那么當屏幕旋轉時,我們在代碼上怎么感知呢?可以通過 Override Activity 和 View 的 onConfigurationChanged 方法。


@Override 
public void onConfigurationChanged(Configuration newConfig) { 
  super.onConfigurationChanged(newConfig);
  if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { 
    // 針對橫屏做一些處理
  } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){ 
    // 針對豎屏做一些處理
  } 
}

判斷當前屏幕方向

有了上面的橫豎屏切換的回調,我們就可以及時感知到屏幕的狀態變化。但因為豎屏、橫屏都有兩個不同的方向,所以 Android 系統又提供了方法給我們獲取當前屏幕精確的旋轉方向。


Display display = activity.getWindowManager().getDefaultDisplay();
int rotation = display.getRotation();
//
// rotation 的值表示了當前屏幕的旋轉角度,可能的值有:
// Surface.ROTATION_0、Surface.ROTATION_90、
// Surface.ROTATION_180、Surface.ROTATION_270。
//

這樣我們就可以判斷當前屏幕的方向了。

舉個例子,以下方法獲取當前屏幕的旋轉方向,然后將旋轉方向鎖定,使用戶不能再旋轉。


public static void lockScreenOrientation(Activity activity) {
  Display display = activity.getWindowManager().getDefaultDisplay();
  switch (display.getRotation()) {
    case Surface.ROTATION_90:
      activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
      break;
    case Surface.ROTATION_180:
      activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);
      break;
    case Surface.ROTATION_270:
      activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
      break;
    default:
      activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
  }
}

總結

  1. android:screenOrientation 屬性可以控制 Activity 的方向,常用的值有 unspecified (默認,可旋轉)、 landscape (保持橫屏)、 portrait (保持豎屏)。
  2. 觸發橫豎屏切換時,如果希望 Activity 銷毀并重新創建,則可以設置 Activity 的 android:configChanges="orientation" 。
  3. 觸發橫豎屏切換時,如果不希望 Activity 銷毀并重新創建,可以設置 Activity 的 android:configChanges="keyboardHidden|orientation|screenSize" 。此后橫豎屏切換時,可以在 Activity.onConfigurationChanged 或 View.onConfigurationChanged 方法中處理切換后的事情。
  4. 在任何時候可以用 getResources().getConfiguration().orientation 獲取屏幕的橫豎屏狀態。
  5. 在任何時候可以用 activity.getWindowManager().getDefaultDisplay().getRotation() 獲取屏幕的旋轉角度。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持html5模板網。

【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

相關文檔推薦

今天小編就為大家分享一篇關于移動端使用CSS或JS判斷橫屏和豎屏的講解,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
這篇文章主要介紹了Android開發之TabHost選項卡及相關疑難解決方法,結合實例形式較為詳細的分析了Android開發中TabHost選項卡的常見用法以及相關疑難問題解決方法,需要的朋友可以參考下
這篇文章主要介紹了Android TabHost選項卡標簽圖標始終不出現的解決方法,涉及Android界面布局相關屬性與狀態設置操作技巧,需要的朋友可以參考下
這篇文章主要介紹了Android開發之Notification手機狀態欄通知用法,結合實例形式分析了Android Notification手機狀態欄通知的常見函數、功能及使用技巧,需要的朋友可以參考下
這篇文章主要介紹了Android開發實現模仿微信小窗口功能,結合實例形式分析了Android實現微信風格Dialog對話框窗口相關功能與布局操作技巧,需要的朋友可以參考下
這篇文章主要介紹了Android開發之PopupWindow創建彈窗、對話框的方法,結合實例形式詳細分析了Android使用PopupWindow創建對話框相關操作技巧,需要的朋友可以參考下
主站蜘蛛池模板: PC构件-PC预制构件-构件设计-建筑预制构件-PC构件厂-锦萧新材料科技(浙江)股份有限公司 | 龙门加工中心-数控龙门加工中心厂家价格-山东海特数控机床有限公司_龙门加工中心-数控龙门加工中心厂家价格-山东海特数控机床有限公司 | 上海公司注册-代理记账-招投标审计-上海昆仑扇财税咨询有限公司 上海冠顶工业设备有限公司-隧道炉,烘箱,UV固化机,涂装设备,高温炉,工业机器人生产厂家 | 冻干机(冷冻干燥机)_小型|实验型|食品真空冷冻干燥机-松源 | 螺杆泵_中成泵业 | vr安全体验馆|交通安全|工地安全|禁毒|消防|安全教育体验馆|安全体验教室-贝森德(深圳)科技 | 上海办公室装修公司_办公室设计_直营办公装修-羚志悦装 | 杭州中央空调维修_冷却塔/新风机柜/热水器/锅炉除垢清洗_除垢剂_风机盘管_冷凝器清洗-杭州亿诺能源有限公司 | 自动气象站_农业气象站_超声波气象站_防爆气象站-山东万象环境科技有限公司 | 杭州实验室尾气处理_实验台_实验室家具_杭州秋叶实验设备有限公司 | 胶水,胶粘剂,AB胶,环氧胶,UV胶水,高温胶,快干胶,密封胶,结构胶,电子胶,厌氧胶,高温胶水,电子胶水-东莞聚力-聚厉胶粘 | 拖鞋定制厂家-品牌拖鞋代加工厂-振扬实业中国高端拖鞋大型制造商 | 折弯机-刨槽机-数控折弯机-数控刨槽机-数控折弯机厂家-深圳豐科机械有限公司 | 氨水-液氨-工业氨水-氨水生产厂家-辽宁顺程化工 | 物流之家新闻网-最新物流新闻|物流资讯|物流政策|物流网-匡匡奈斯物流科技 | 辐射仪|辐射检测仪|辐射巡测仪|个人剂量报警仪|表面污染检测仪|辐射报警仪|辐射防护网 | 学习安徽网| 全自动固相萃取仪_高通量真空平行浓缩仪-勤业永为 | 塑料异型材_PVC异型材_封边条生产厂家_PC灯罩_防撞扶手_医院扶手价格_东莞市怡美塑胶制品有限公司 | 江西自考网-江西自学考试网| 宜兴紫砂壶知识分享 - 宜兴壶人| 家庭教育吧-在线家庭教育平台,专注青少年家庭教育 | 电动打包机_气动打包机_钢带捆扎机_废纸打包机_手动捆扎机 | 水冷式工业冷水机组_风冷式工业冷水机_水冷螺杆冷冻机组-深圳市普威机械设备有限公司 | 合肥通道闸-安徽车牌识别-人脸识别系统厂家-安徽熵控智能技术有限公司 | 法钢特种钢材(上海)有限公司 - 耐磨钢板、高强度钢板销售加工 阀门智能定位器_电液动执行器_气动执行机构-赫尔法流体技术(北京)有限公司 | 哈尔滨发电机,黑龙江柴油发电机组-北方星光 | 工业rfid读写器_RFID工业读写器_工业rfid设备厂商-ANDEAWELL | 小区健身器材_户外健身器材_室外健身器材_公园健身路径-沧州浩然体育器材有限公司 | 精密五金加工厂-CNC数控车床加工_冲压件|蜗杆|螺杆加工「新锦泰」 | 免费B2B信息推广发布平台 - 推发网 | 菏泽知彼网络科技有限公司 | 喷砂机厂家_自动喷砂机生产_新瑞自动化喷砂除锈设备 | 安全,主动,被动,柔性,山体滑坡,sns,钢丝绳,边坡,防护网,护栏网,围栏,栏杆,栅栏,厂家 - 护栏网防护网生产厂家 | 蓄电池在线监测系统|SF6在线监控泄露报警系统-武汉中电通电力设备有限公司 | 房车价格_依维柯/大通/东风御风/福特全顺/江铃图片_云梯搬家车厂家-程力专用汽车股份有限公司 | 压砖机_电动螺旋压力机_粉末成型压力机_郑州华隆机械tel_0371-60121717 | 土壤养分检测仪|土壤水分|土壤紧实度测定仪|土壤墒情监测系统-土壤仪器网 | 集装箱展厅-住人集装箱住宿|建筑|房屋|集装箱售楼处-山东锐嘉科技工程有限公司 | 高温高压釜(氢化反应釜)百科 | 胶水,胶粘剂,AB胶,环氧胶,UV胶水,高温胶,快干胶,密封胶,结构胶,电子胶,厌氧胶,高温胶水,电子胶水-东莞聚力-聚厉胶粘 |