作者: Megan Potoski, Android 系統(tǒng)用戶(hù)界面產(chǎn)品經(jīng)理
智能手機(jī)發(fā)展至今娜亿,邊框越做越窄,屏幕中橫比越做越大廓块。而凹口屏 (又稱(chēng) "劉海屏") 更是成為各大設(shè)備廠商手中的 "神兵利器":既能讓用戶(hù)享受到全面屏體驗(yàn)厢绝,又能預(yù)留出足夠空間安裝感應(yīng)器。目前带猴,已經(jīng)有 11 家廠商相繼發(fā)布了 16 款帶有 "劉海" 設(shè)計(jì)的手機(jī)昔汉,其中部分機(jī)型為 Android P Beta 設(shè)備。預(yù)計(jì)今后會(huì)有更多凹口屏設(shè)備與消費(fèi)者見(jiàn)面拴清。
凹口屏一方面為開(kāi)發(fā)者創(chuàng)造了絕好的條件靶病,展示各自應(yīng)用的獨(dú)特魅力;另一方面口予,它又凸顯了適配的重要性娄周,不論設(shè)備擁有一個(gè)還是兩個(gè)屏幕缺口,采用的是 18:9 亦或是其它尺寸的屏幕沪停,開(kāi)發(fā)者需要保證應(yīng)用在所有設(shè)備上都能夠提供相同的用戶(hù)體驗(yàn)昆咽。
凹口屏幕適配方案
隨著各大設(shè)備廠商陸續(xù)躋身凹口屏大軍之列,開(kāi)發(fā)者應(yīng)該如何正確應(yīng)對(duì)牙甫,確保應(yīng)用能夠快速適配呢掷酗?
好消息是:即使在凹口屏設(shè)備上,大部分應(yīng)用內(nèi)容并不會(huì)受到影響窟哺。默認(rèn)情況下泻轰,如果開(kāi)發(fā)者在豎屏模式下未對(duì)狀態(tài)欄設(shè)定任何特殊標(biāo)志位,狀態(tài)欄會(huì)根據(jù)屏幕缺口情況自行調(diào)整高度 (缺口高度 ≤ 狀態(tài)欄高度)且轨,而應(yīng)用內(nèi)容則會(huì)顯示在狀態(tài)欄以下區(qū)域浮声;在橫屏和全屏模式下虚婿,系統(tǒng)會(huì)在應(yīng)用窗口四周保留黑邊,避開(kāi)在缺口區(qū)顯示應(yīng)用內(nèi)容泳挥。
不過(guò)然痊,為避免應(yīng)用在凹口屏上出現(xiàn)適配問(wèn)題,開(kāi)發(fā)者還需注意以下幾點(diǎn):
>> 不要將狀態(tài)欄高度設(shè)置為固定值屉符,否則很容易出現(xiàn)問(wèn)題剧浸。在條件允許的情況下,可以調(diào)用 WindowInsetsCompat 獲取狀態(tài)欄高度矗钟;
>> 在全屏模式下唆香,由于系統(tǒng)在應(yīng)用周?chē)A袅撕谶叄虼水?huà)面不會(huì)占滿(mǎn)整個(gè)屏幕吨艇,此時(shí)開(kāi)發(fā)者需要謹(jǐn)慎考慮躬它,窗口坐標(biāo)或屏幕坐標(biāo)之間作出抉擇。比如說(shuō)东涡,如果您調(diào)用了 MotionEvent.getRawX/Y() 來(lái)獲取觸摸點(diǎn)觸相對(duì)于屏幕原點(diǎn)坐標(biāo)冯吓,請(qǐng)別忘了使用getLocationOnScreen() 將它們轉(zhuǎn)換為視圖坐標(biāo);
>> 請(qǐng)?zhí)貏e注意應(yīng)用在進(jìn)入和退出全屏模式時(shí)的視圖轉(zhuǎn)換問(wèn)題疮跑。
請(qǐng)查閱《屏幕缺口支持指南》组贺,了解適配過(guò)程中您可能遇到的問(wèn)題以及相應(yīng)解決方案。
靈活利用缺口區(qū)域
通過(guò)在缺口區(qū)域顯示應(yīng)用內(nèi)容祸挪,尤其是視頻、圖片贞间、地圖或者游戲一類(lèi)的內(nèi)容贿条,開(kāi)發(fā)者能夠顯著提升應(yīng)用沉浸度,為用戶(hù)打造真正的全面屏體驗(yàn)增热≌裕△?應(yīng)用請(qǐng)求在缺口區(qū)域進(jìn)行布局
開(kāi)發(fā)者可以調(diào)用 Android P 中的相關(guān) API,判斷設(shè)備是否具有凹口屏峻仇,然后在獲取缺口的位置信息公黑,并管理內(nèi)容在缺口區(qū)域的布局。
您可以利用全新的窗口布局屬性 layoutInDisplayCutoutMode 管理應(yīng)用在凹口屏幕上的布局顯示摄咆。在默認(rèn)情況下凡蚜,只有當(dāng)缺口完全包含在狀態(tài)欄內(nèi)時(shí),系統(tǒng)才會(huì)允許應(yīng)用延伸至缺口區(qū)域吭从,否則窗口不會(huì)與缺口重疊朝蜘。此外,您可以通過(guò)更改 layoutInDisplayCutoutMode 參數(shù)涩金,讓設(shè)備始終 (或絕不) 允許應(yīng)用使用缺口區(qū)域谱醇。如果您希望利用到整個(gè)顯示區(qū)域暇仲,而且不介意缺口位置無(wú)法顯示應(yīng)用內(nèi)容,SHORT_EDGES 模式是個(gè)不錯(cuò)的選擇副渴,在該模式下奈附,系統(tǒng)始終允許應(yīng)用窗口延伸至缺口區(qū)域。
在適配過(guò)程中煮剧,您可調(diào)用 getDisplayCutout() 獲取無(wú)顯示凹口區(qū)的外邊距和包圍盒值斥滤,并利用這些數(shù)值判斷應(yīng)用內(nèi)容是否與缺口重合,以及是否需要重新調(diào)整內(nèi)容位置轿秧。
此外中跌,我們已經(jīng)將 activity 主題中的 layoutInDisplayCutoutMode 屬性往后添加到 Android 8.1 (API 27) 的設(shè)備上,您也可以在缺口區(qū)域?qū)?yīng)用內(nèi)容進(jìn)行布局菇篡。不過(guò)若系統(tǒng)版本為 Android 8.1 或更低漩符,設(shè)備是否具有凹口屏支持則取決于廠商。
如果應(yīng)用需要針對(duì)多個(gè) API 等級(jí)進(jìn)行內(nèi)容布局驱还,您可以通過(guò) SDK manager 下載 AndroidX 庫(kù)嗜暴,并使用庫(kù)中的 DisplayCutoutCompat 來(lái)簡(jiǎn)化管理流程。
針對(duì)凹口屏測(cè)試您的應(yīng)用
強(qiáng)烈建議您對(duì)應(yīng)用的所有界面和操作進(jìn)行測(cè)試议蟆,確保應(yīng)用在凹口屏設(shè)備上能夠流暢運(yùn)行闷沥。建議您選擇一款配有凹口屏的 Android P Beta 設(shè)備作為調(diào)試設(shè)備,如 Essential PH-1咐容。
如果您暫時(shí)沒(méi)有條件進(jìn)行真機(jī)測(cè)試舆逃,您可以在非凹口屏 P 版本手機(jī)或者 Android 模擬器中,開(kāi)啟 "模擬具有凹口的顯示屏" 的設(shè)置項(xiàng)戳粒,然后再進(jìn)行調(diào)試路狮。這能幫助您發(fā)現(xiàn)應(yīng)用在凹口屏設(shè)備上運(yùn)行時(shí)可能會(huì)遇到的問(wèn)題,不論設(shè)備的系統(tǒng)版本是 Android 8.1 還是 Android P蔚约。
凹口屏幕全知道
Android P 中引入了對(duì)凹口屏幕的官方平臺(tái)支持奄妨,同時(shí)提供了一系列 API 幫助開(kāi)發(fā)者在缺口區(qū)內(nèi)外對(duì)應(yīng)用內(nèi)容進(jìn)行布局。為了保障一致性與應(yīng)用兼容性苹祟,我們目前正在與設(shè)備合作伙伴展開(kāi)積極合作砸抛,攜手制定相關(guān)行業(yè)標(biāo)準(zhǔn)。
首先树枫,廠商需要確保設(shè)備的凹口屏幕不會(huì)對(duì)應(yīng)用造成不良影響直焙,這涉及到以下兩項(xiàng)關(guān)鍵要求:
>> 在豎屏模式下,若沒(méi)有設(shè)定特殊標(biāo)志位砂轻,狀態(tài)欄高度必須大于或等于缺口高度箕般;
>> 在全屏或橫屏模式下,缺口區(qū)域必須整個(gè)落在黑色填充區(qū)內(nèi)舔清。
第二點(diǎn)丝里,屏幕每條短邊上缺口數(shù)量不可超過(guò) 1曲初,即:
>> 不允許一條短邊上存在 2 個(gè)或 2 個(gè)以上缺口,即每臺(tái)設(shè)備最多擁有 2 個(gè)屏幕缺口杯聚;
>> 不允許在屏幕左側(cè)或右側(cè)出現(xiàn)缺口臼婆。
在滿(mǎn)足以上條件的前提下,廠商可以按照各自需求幌绍,設(shè)計(jì)缺口位置和形狀颁褂。
特殊模式
在某些運(yùn)行 Android 8.1 (API 等級(jí) 27) 或更早版本的設(shè)備上,用戶(hù)可以通過(guò)開(kāi)啟 "特殊模式"傀广,允許系統(tǒng)在全屏或橫屏模式下延伸應(yīng)用窗口至缺口區(qū)域颁独。用戶(hù)一般可以在導(dǎo)航欄中找到并勾選該模式,接著系統(tǒng)會(huì)彈出一個(gè)確認(rèn)對(duì)話(huà)框伪冰,在征得用戶(hù)同意后誓酒,模式才會(huì)正式生效。
如果應(yīng)用的 targetSdkVersion 為 27 或更高贮聂,在必要時(shí)您可以通過(guò)更改活動(dòng)主題中的layoutInDisplayCutoutMode 屬性靠柑,退出特殊模式。
別忘了: 為長(zhǎng)屏幕設(shè)備做好準(zhǔn)備
在適配凹口屏的同時(shí)吓懈,您不妨考慮一下如何確保應(yīng)用在長(zhǎng)屏幕設(shè)備上 (縱橫比大于或等于 18:9) 也能夠正常運(yùn)行歼冰,尤其是現(xiàn)在市面上長(zhǎng)屏手機(jī)越來(lái)越多,而且這些設(shè)備往往同時(shí)還采用了凹口屏設(shè)計(jì)耻警。
強(qiáng)烈建議您選擇靈活的適配方案隔嫡,確保應(yīng)用不受運(yùn)行設(shè)備所限,高效利用全部顯示區(qū)域甘穿。您可以針對(duì)不同屏幕尺寸進(jìn)行相應(yīng)的兼容性測(cè)試腮恩,以確保應(yīng)用在功能和視圖方面都表現(xiàn)良好。
建議查閱《長(zhǎng)屏幕設(shè)備適配指南》和《如何針對(duì)長(zhǎng)屏幕設(shè)備優(yōu)化您的應(yīng)用》一文中列出的幾項(xiàng)建議扒磁,進(jìn)行相應(yīng)開(kāi)發(fā)庆揪。如果您的應(yīng)用無(wú)法適應(yīng)長(zhǎng)屏幕的縱橫比式曲,您可以通過(guò)設(shè)置應(yīng)用的最大支持縱橫比妨托,要求系統(tǒng)用黑色填充應(yīng)用邊緣的顯示空間。
希望以上內(nèi)容能對(duì)您有所幫助吝羞,讓您不懼 "劉海"兰伤,只為更好體驗(yàn)!
點(diǎn)擊這里?"我們?cè)敢飧玫貎A聽(tīng)您的聲音 "