Android 摺疊屏適配攻略

隨着三星 Galaxy Fold 和 華爲 Mate X 的發佈,摺疊屏手機開始進入你們的視線。在改變手機體驗的同時,也給咱們開發人員在適配方面帶來了更多的挑戰。本文給你們介紹一下 Android 開發中和摺疊屏相關的一些概念,以及如何進行摺疊屏的適配。android

摺疊屏適配

摺疊屏之因此須要適配,是由於咱們的應用有可能在運行的過程當中,所在的屏幕尺寸發生了變化,這種狀況對現有項目多少都會產生一些問題。shell

因此摺疊屏適配的本質是:當應用運行時,屏幕的尺寸、密度或比例發生了變化,應用可以繼續在變化後的屏幕上正常顯示和正常運行。bash

其實這種狀況並非摺疊屏出現以後纔有的,應用的縱向橫向切換也會發生一樣的狀況,只不過不少應用都強制縱向,不須要處理這種適配了。app

容許改變應用尺寸

要適配摺疊屏,首先是要讓應用支持動態改變尺寸,咱們須要在 menifest 中的 Application 或對應的 Activity 下聲明:ide

android:resizeableActivity="true"
複製代碼

相反,若是暫時不打算適配,把這個參數設爲 false 就行了。工具

須要說明的是,這個參數在 Android 7.0 或更高版本默認爲 true,如下則默認爲 false。佈局

下面介紹兩個和這個參數相關的概念。測試

分屏模式

之因此從 Android 7.0 開始,把 resizeableActivity 默認改成 true,是由於在 7.0 裏增長了一個新功能,叫分屏模式。優化

若是把 resizeableActivity 設爲 false,就意味着應用是不支持分屏模式的,它決定了應用是否有分屏的設置項。ui

兼容模式

當 resizeableActivity 取 false 時,展開摺疊屏可能會變成這樣的效果:

這個效果相似於在 iPad 上使用不兼容的 iPhone 應用,這個四周用黑色填充的模式,叫兼容模式。

兼容模式的顯示和最大支持比例 maxAspectRatio 有關,當屏幕比例超過 maxAspectRatio 時纔會用黑邊填充,官方建議把 maxAspectRatio 設爲 2.4 (12 : 5),修改 maxAspectRatio 的方法以下:

  • Android 8.0 或以上版本

在 標籤中配置 android:maxAspectRatio:

<activity android:name=".MainActivity" android:maxAspectRatio="2.4" />
複製代碼
  • Android 8.0 如下版本

在 標籤中添加名爲 android.max_aspect 的 meta-data:

<meta-data android:name="android.max_aspect" android:value="2.4" />
複製代碼

若是 resizeableActivity 設爲 true,就不須要設置 maxAspectRatio 了,設了也不會生效。

監聽尺寸改變

在默認狀況下,當屏幕發生了變化,系統會銷燬並從新建立整個 Activity。但咱們但願屏幕變化以後,程序可以以切換前的狀態繼續運行,不須要重啓頁面。

咱們能夠給 Activity 添加配置:

android:configChanges="screenSize|smallestScreenSize|screenLayout"
複製代碼

這樣配置後,當屏幕發生變化就不會重啓 Activity 了,會調用到 onConfigurationChanged 方法,咱們能夠在這個方法裏獲取到當前的屏幕信息:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    Log.i("config", "newConfig.screenHeightDp:" + newConfig.screenHeightDp
            + ", newConfig.screenWidthDp" + newConfig.screenWidthDp);
}
複製代碼

這樣改以後須要注意測試,看看頁面的佈局是否發生錯亂,若是佈局不合理就須要修改佈局以適配不一樣分辨率。

咱們也能夠根據屏幕信息來更新佈局,好比在大屏幕上把 LinearLayout 切換成 GridLayout,充分利用大屏幕的顯示空間,這是更進一步的優化作法了:

Android Q

在即將到來的 Android Q 上,增長了一些支持摺疊屏的特性。

Multi-resume

對於分屏模式,過去的分屏只支持兩個應用同時顯示,而大屏幕帶來了更多的可能性,如今已經容許兩個以上的應用同時顯示了。

在 Android Q 以前的版本,以分屏模式運行的應用裏面,只有獲取到焦點的 Activity 會處於 onResume 狀態,其餘可見 Activity 都是處於 onPause 狀態。

而在 Android Q 上,全部頂層可見 Activity 都處於 onResume 狀態,保證在分屏模式下的可見 Activity 都能正常運行。但能獲取到焦點的 Activity 依然只有一個,咱們把這個 Activity 叫作 TopResumedActivity。

在 Android Q 的 Activity 裏增長了一個生命週期回調方法 onTopResumedActivityChanged(),它會在 Activity 獲取或失去焦點時調用,能夠用來判斷當前 Activity 是否擁有焦點:

protected void onTopResumedActivityChanged(boolean topResumed) {
    if (topResumed) {
        // 獲取到焦點
    } else {
        // 失去焦點
    }
}
複製代碼

當咱們使用了獨佔資源時就要用到這個方法。什麼叫獨佔資源?麥克風、攝像頭就是,這類資源同一時間只能給一個 Activity 使用。

好比分屏模式下的多個 Activity 都使用了攝像頭,但這時候只有獲取到焦點的 Activity 擁有訪問權限,這種狀況下就要經過 onTopResumedActivityChanged() 判斷當前 Activity 是否獲取到焦點。在失去焦點的時候能夠不釋放攝像頭,可是須要處理好攝像頭斷開鏈接和從新鏈接的狀況。

minAspectRatio

在 Android Q 以前只能配置最大支持比例 maxAspectRatio,如今 Android Q 能夠配置最小支持比例 minAspectRatio 了, 用法和 maxAspectRatio 同樣:

<activity android:name=".MainActivity" android:maxAspectRatio="2.4" android:minAspectRatio="1"/>
複製代碼

最大最小支持比例,都是在 resizeableActivity 取 false 的時候纔會有用。

調試

最好的調試工具固然就是用真機了,但目前只有少部分人有這個條件,下面是真機之外的兩個調試方案。

Android Studio

在 Android Studio 3.5 裏增長了摺疊屏設備的虛擬機,咱們能夠建立一個來調試:

經過點擊模擬器上的按鈕,咱們能夠切換虛擬機的摺疊和展開狀態:

命令行

咱們能夠經過命令行動態修改手機分辨率,達到模擬摺疊屏切換的效果,以 Mate X 的分辨率爲例,咱們先使用命令行:

adb shell wm size 1148x2480
複製代碼

手機分辨率將模擬爲 1148x2480,這是 Mate X 摺疊時的分辨率,這時再輸入:

adb shell wm size 2200x2480
複製代碼

將手機分辨率修改成 Mate X 展開後的分辨率 2200x2480,用這種方式模擬了摺疊屏展開的切換。

你能夠再次修改分辨率爲 1148x2480,模擬屏幕摺疊的切換。最後玩完了用下面命令行恢復手機自身分辨率:

adb shell wm size reset
複製代碼

結束

關於摺疊屏的適配,就介紹這麼多。總的來講,若是要適配摺疊屏,第一步是把 resizeableActivity 設爲 true,而後給 Activity 配置 configChanges,並進行測試。最後能夠更近一步,給大屏幕設計另外一套 UI,在摺疊屏切換時切換 UI。

下面是一些相關的參考資料:

相關文章
相關標籤/搜索