Android 折疊屏適配攻略

隨著三星 Galaxy Fold 和 華為 Mate X 的發(fā)布博敬,折疊屏手機(jī)開始進(jìn)入大家的視線友浸。在改變手機(jī)體驗(yàn)的同時(shí),也給我們開發(fā)人員在適配方面帶來(lái)了更多的挑戰(zhàn)偏窝。本文給大家介紹一下 Android 開發(fā)中和折疊屏相關(guān)的一些概念收恢,以及如何進(jìn)行折疊屏的適配。

折疊屏適配

折疊屏之所以需要適配祭往,是因?yàn)槲覀兊膽?yīng)用有可能在運(yùn)行的過程中伦意,所在的屏幕尺寸發(fā)生了變化,這種情況對(duì)現(xiàn)有項(xiàng)目多少都會(huì)產(chǎn)生一些問題硼补。

所以折疊屏適配的本質(zhì)是:當(dāng)應(yīng)用運(yùn)行時(shí)驮肉,屏幕的尺寸、密度或比例發(fā)生了變化已骇,應(yīng)用能夠繼續(xù)在變化后的屏幕上正常顯示和正常運(yùn)行离钝。

其實(shí)這種情況并不是折疊屏出現(xiàn)之后才有的,應(yīng)用的縱向橫向切換也會(huì)發(fā)生同樣的情況褪储,只不過很多應(yīng)用都強(qiáng)制縱向奈辰,不需要處理這種適配了。

允許改變應(yīng)用尺寸

要適配折疊屏乱豆,首先是要讓應(yīng)用支持動(dòng)態(tài)改變尺寸,我們需要在 menifest 中的 Application 或?qū)?yīng)的 Activity 下聲明:

android:resizeableActivity="true"

相反吊趾,如果暫時(shí)不打算適配宛裕,把這個(gè)參數(shù)設(shè)為 false 就好了。

需要說(shuō)明的是论泛,這個(gè)參數(shù)在 Android 7.0 或更高版本默認(rèn)為 true揩尸,以下則默認(rèn)為 false。

下面介紹兩個(gè)和這個(gè)參數(shù)相關(guān)的概念屁奏。

分屏模式

之所以從 Android 7.0 開始岩榆,把 resizeableActivity 默認(rèn)改為 true,是因?yàn)樵?7.0 里增加了一個(gè)新功能坟瓢,叫分屏模式勇边。

如果把 resizeableActivity 設(shè)為 false,就意味著應(yīng)用是不支持分屏模式的折联,它決定了應(yīng)用是否有分屏的設(shè)置項(xiàng)粒褒。

兼容模式

當(dāng) resizeableActivity 取 false 時(shí),展開折疊屏可能會(huì)變成這樣的效果:

這個(gè)效果類似于在 iPad 上使用不兼容的 iPhone 應(yīng)用诚镰,這個(gè)四周用黑色填充的模式奕坟,叫兼容模式祥款。

兼容模式的顯示和最大支持比例 maxAspectRatio 有關(guān),當(dāng)屏幕比例超過 maxAspectRatio 時(shí)才會(huì)用黑邊填充月杉,官方建議把 maxAspectRatio 設(shè)為 2.4 (12 : 5)刃跛,修改 maxAspectRatio 的方法如下:

  • Android 8.0 或以上版本

在 <activity> 標(biāo)簽中配置 android:maxAspectRatio:

<activity android:name=".MainActivity"
          android:maxAspectRatio="2.4" />
  • Android 8.0 以下版本

在 <application> 標(biāo)簽中添加名為 android.max_aspect 的 meta-data:

<meta-data android:name="android.max_aspect" android:value="2.4" />

如果 resizeableActivity 設(shè)為 true,就不需要設(shè)置 maxAspectRatio 了苛萎,設(shè)了也不會(huì)生效桨昙。

監(jiān)聽尺寸改變

在默認(rèn)情況下,當(dāng)屏幕發(fā)生了變化首懈,系統(tǒng)會(huì)銷毀并重新創(chuàng)建整個(gè) Activity绊率。但我們希望屏幕變化之后,程序能夠以切換前的狀態(tài)繼續(xù)運(yùn)行究履,不需要重啟頁(yè)面滤否。

我們可以給 Activity 添加配置:

android:configChanges="screenSize|smallestScreenSize|screenLayout"

這樣配置后,當(dāng)屏幕發(fā)生變化就不會(huì)重啟 Activity 了最仑,會(huì)調(diào)用到 onConfigurationChanged 方法藐俺,我們可以在這個(gè)方法里獲取到當(dāng)前的屏幕信息:

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

這樣改之后需要注意測(cè)試,看看頁(yè)面的布局是否發(fā)生錯(cuò)亂泥彤,如果布局不合理就需要修改布局以適配不同分辨率欲芹。

我們也可以根據(jù)屏幕信息來(lái)更新布局,比如在大屏幕上把 LinearLayout 切換成 GridLayout吟吝,充分利用大屏幕的顯示空間菱父,這是更進(jìn)一步的優(yōu)化做法了:

Android Q

在即將到來(lái)的 Android Q 上,增加了一些支持折疊屏的特性剑逃。

Multi-resume

對(duì)于分屏模式浙宜,過去的分屏只支持兩個(gè)應(yīng)用同時(shí)顯示,而大屏幕帶來(lái)了更多的可能性蛹磺,現(xiàn)在已經(jīng)允許兩個(gè)以上的應(yīng)用同時(shí)顯示了粟瞬。

在 Android Q 之前的版本,以分屏模式運(yùn)行的應(yīng)用里面萤捆,只有獲取到焦點(diǎn)的 Activity 會(huì)處于 onResume 狀態(tài)裙品,其他可見 Activity 都是處于 onPause 狀態(tài)。

而在 Android Q 上俗或,所有頂層可見 Activity 都處于 onResume 狀態(tài)市怎,保證在分屏模式下的可見 Activity 都能正常運(yùn)行。但能獲取到焦點(diǎn)的 Activity 依然只有一個(gè)蕴侣,我們把這個(gè) Activity 叫做 TopResumedActivity焰轻。

在 Android Q 的 Activity 里增加了一個(gè)生命周期回調(diào)方法 onTopResumedActivityChanged(),它會(huì)在 Activity 獲取或失去焦點(diǎn)時(shí)調(diào)用昆雀,可以用來(lái)判斷當(dāng)前 Activity 是否擁有焦點(diǎn):

protected void onTopResumedActivityChanged(boolean topResumed) {
    if (topResumed) {
        // 獲取到焦點(diǎn)
    } else {
        // 失去焦點(diǎn)
    }
}

當(dāng)我們使用了獨(dú)占資源時(shí)就要用到這個(gè)方法辱志。什么叫獨(dú)占資源蝠筑?麥克風(fēng)、攝像頭就是揩懒,這類資源同一時(shí)間只能給一個(gè) Activity 使用什乙。

比如分屏模式下的多個(gè) Activity 都使用了攝像頭,但這時(shí)候只有獲取到焦點(diǎn)的 Activity 擁有訪問權(quán)限已球,這種情況下就要通過 onTopResumedActivityChanged() 判斷當(dāng)前 Activity 是否獲取到焦點(diǎn)臣镣。在失去焦點(diǎn)的時(shí)候可以不釋放攝像頭,但是需要處理好攝像頭斷開連接和重新連接的情況智亮。

minAspectRatio

在 Android Q 之前只能配置最大支持比例 maxAspectRatio忆某,現(xiàn)在 Android Q 可以配置最小支持比例 minAspectRatio 了,
用法和 maxAspectRatio 一樣:

<activity android:name=".MainActivity"
          android:maxAspectRatio="2.4"
          android:minAspectRatio="1"/>

最大最小支持比例阔蛉,都是在 resizeableActivity 取 false 的時(shí)候才會(huì)有用弃舒。

調(diào)試

最好的調(diào)試工具當(dāng)然就是用真機(jī)了,但目前只有少部分人有這個(gè)條件状原,下面是真機(jī)以外的兩個(gè)調(diào)試方案聋呢。

Android Studio

在 Android Studio 3.5 里增加了折疊屏設(shè)備的虛擬機(jī),我們可以創(chuàng)建一個(gè)來(lái)調(diào)試:

通過點(diǎn)擊模擬器上的按鈕颠区,我們可以切換虛擬機(jī)的折疊和展開狀態(tài):

命令行

我們可以通過命令行動(dòng)態(tài)修改手機(jī)分辨率削锰,達(dá)到模擬折疊屏切換的效果,以 Mate X 的分辨率為例毕莱,我們先使用命令行:

adb shell wm size 1148x2480

手機(jī)分辨率將模擬為 1148x2480器贩,這是 Mate X 折疊時(shí)的分辨率,這時(shí)再輸入:

adb shell wm size 2200x2480

將手機(jī)分辨率修改為 Mate X 展開后的分辨率 2200x2480朋截,用這種方式模擬了折疊屏展開的切換磨澡。

你可以再次修改分辨率為 1148x2480,模擬屏幕折疊的切換质和。最后玩完了用下面命令行恢復(fù)手機(jī)自身分辨率:

adb shell wm size reset

結(jié)束

關(guān)于折疊屏的適配,就介紹這么多稚字∷撬蓿總的來(lái)說(shuō),如果要適配折疊屏胆描,第一步是把 resizeableActivity 設(shè)為 true瘫想,然后給 Activity 配置 configChanges,并進(jìn)行測(cè)試昌讲。最后可以更近一步国夜,給大屏幕設(shè)計(jì)另一套 UI,在折疊屏切換時(shí)切換 UI短绸。

下面是一些相關(guān)的參考資料:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末车吹,一起剝皮案震驚了整個(gè)濱河市筹裕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌窄驹,老刑警劉巖朝卒,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異乐埠,居然都是意外死亡抗斤,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門丈咐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)瑞眼,“玉大人,你說(shuō)我怎么就攤上這事棵逊∩烁恚” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵歹河,是天一觀的道長(zhǎng)掩浙。 經(jīng)常有香客問我,道長(zhǎng)秸歧,這世上最難降的妖魔是什么厨姚? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮键菱,結(jié)果婚禮上谬墙,老公的妹妹穿的比我還像新娘。我一直安慰自己经备,他們只是感情好拭抬,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著侵蒙,像睡著了一般造虎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上纷闺,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天算凿,我揣著相機(jī)與錄音,去河邊找鬼犁功。 笑死氓轰,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的浸卦。 我是一名探鬼主播署鸡,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了靴庆?” 一聲冷哼從身側(cè)響起时捌,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎撒穷,沒想到半個(gè)月后匣椰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡端礼,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年禽笑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛤奥。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡佳镜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出凡桥,到底是詐尸還是另有隱情蟀伸,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布缅刽,位于F島的核電站啊掏,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏衰猛。R本人自食惡果不足惜迟蜜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望啡省。 院中可真熱鬧娜睛,春花似錦、人聲如沸卦睹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)结序。三九已至障斋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間徐鹤,已是汗流浹背配喳。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留凳干,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓被济,卻偏偏與公主長(zhǎng)得像救赐,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

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