本文來(lái)源:聰明叉 原文鏈接:https://www.jianshu.com/p/2b8db60ba8df 前言我將適配方案整理后,封裝成了一個(gè)庫(kù)并上傳至github,可參考使用
市面上的屏幕尺寸和全面屏方案五花八門。 這里我使用了小米的圖來(lái)說(shuō)明: 上述兩種屏幕都可以統(tǒng)稱為劉海屏,不過(guò)對(duì)于右側(cè)較小的劉海,業(yè)界一般稱為水滴屏或美人尖。為便于說(shuō)明,后文提到的「劉海屏」「劉海區(qū)」都同時(shí)指代上圖兩種屏幕。 當(dāng)我們?cè)谡勂聊贿m配時(shí),我們?cè)谡勈裁?/h2>適應(yīng)更長(zhǎng)的屏幕 防止內(nèi)容被劉海遮擋 其中第一點(diǎn)是所有應(yīng)用都需要適配的,對(duì)應(yīng)下文的聲明最大長(zhǎng)寬比 而第二點(diǎn),如果應(yīng)用本身不需要全屏顯示或使用沉浸式狀態(tài)欄,是不需要適配的。 針對(duì)需要適配第二點(diǎn)的應(yīng)用,需要獲取劉海的位置和寬高,然后將顯示內(nèi)容避開即可。 聲明最大長(zhǎng)寬比以前的普通屏長(zhǎng)寬比為16:9,全面屏手機(jī)的屏幕長(zhǎng)寬比增大了很多,如果不適配的話就會(huì)類似下面這樣: 黑色區(qū)域?yàn)槲蠢玫膮^(qū)域。 適配方式適配方式有兩種:
原理說(shuō)明這里涉及到的知識(shí)點(diǎn)是android:resizeableActivity屬性。 在 Android 7.0(API 級(jí)別 24)或更高版本的應(yīng)用,android:resizeableActivity屬性默認(rèn)為true(對(duì)應(yīng)適配方式1)。這個(gè)屬性是控制多窗口顯示的,決定當(dāng)前的應(yīng)用或者Activity是否支持多窗口。
在清單的或 節(jié)點(diǎn)中設(shè)置該屬性,啟用或禁用多窗口顯示: 如果該屬性設(shè)置為 true,Activity 將能以分屏和自由形狀模式啟動(dòng)。 如果此屬性設(shè)置為 false,Activity 將不支持多窗口模式。 如果該值為 false,且用戶嘗試在多窗口模式下啟動(dòng) Activity,該 Activity 將全屏顯示。 適配方式2即為設(shè)置屏幕的最大長(zhǎng)寬比,這是官方提供的設(shè)置方式。 如果設(shè)置了最大長(zhǎng)寬比,必須android:resizeableActivity=”false”。 否則最大長(zhǎng)寬比沒(méi)有任何作用。 適配劉海屏Android9.0及以上適配Android P(9.0)開始,官方提供了適配異形屏的方式。 Support display cutouts: 通過(guò)全新的 DisplayCutout 類,可以確定非功能區(qū)域的位置和形狀,這些區(qū)域不應(yīng)顯示內(nèi)容。 要確定這些凹口屏幕區(qū)域是否存在及其位置,請(qǐng)使用 getDisplayCutout() 函數(shù)。 1、全新的窗口布局屬性 layoutInDisplayCutoutMode 讓您的應(yīng)用可以為設(shè)備凹口屏幕周圍的內(nèi)容進(jìn)行布局。 您可以將此屬性設(shè)為下列值之一: 默認(rèn)值是LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT,劉海區(qū)域不會(huì)顯示內(nèi)容,需要將值設(shè)置為LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
您可以按如下方法在任何運(yùn)行 Android P 的設(shè)備或模擬器上模擬屏幕缺口: 1、啟用開發(fā)者選項(xiàng)。 2、在 Developer options 屏幕中,向下滾動(dòng)至 Drawing 部分并選擇 Simulate a display with a cutout。 3、選擇凹口屏幕的大小。 適配參考: 其中延伸顯示區(qū)域到劉海的代碼,也可以通過(guò)修改Activity或應(yīng)用的style實(shí)現(xiàn),例如: Android O 適配因Google官方的適配方案到Android P才推出,因此在Android O設(shè)備上,各家廠商有自己的實(shí)現(xiàn)方案。 我這里主要適配了華為、小米、oppo,這三家都給了完整的解決方案。至于vivo,vivo給了判斷是否劉海屏的API,但是沒(méi)用設(shè)置劉海區(qū)域顯示到API,因此無(wú)需適配。 適配華為Android O設(shè)備方案一: 1、具體方式如下所示: 對(duì)Application生效,意味著該應(yīng)用的所有頁(yè)面,系統(tǒng)都不會(huì)做豎屏場(chǎng)景的特殊下移或者是橫屏場(chǎng)景的右移特殊處理: 對(duì)Activity生效,意味著可以針對(duì)單個(gè)頁(yè)面進(jìn)行劉海屏適配,設(shè)置了該屬性的Activity系統(tǒng)將不會(huì)做特殊處理: 方案二 對(duì)Application生效,意味著該應(yīng)用的所有頁(yè)面,系統(tǒng)都不會(huì)做豎屏場(chǎng)景的特殊下移或者是橫屏場(chǎng)景的右移特殊處理
1. 設(shè)置應(yīng)用窗口在華為劉海屏手機(jī)使用劉海區(qū) 2. 清除添加的華為劉海屏Flag,恢復(fù)應(yīng)用不使用劉海區(qū)顯示
適配oppoAndroid O設(shè)備判斷是否是劉海屏 獲取劉海的左上角和右下角的坐標(biāo) Oppo Android O機(jī)型不需要設(shè)置顯示到劉海區(qū)域,只要設(shè)置了應(yīng)用全屏就會(huì)默認(rèn)顯示。 因此Oppo機(jī)型必須適配。 適配總結(jié)根據(jù)上述功能,我將其整理成了一個(gè)依賴庫(kù):NotchScreenTool 使用起來(lái)很簡(jiǎn)單: 獲取劉海區(qū)域信息后就可以根據(jù)自己應(yīng)用的需要,來(lái)避開重要的控件。 詳情可參考我項(xiàng)目中的代碼。 參考鏈接華為劉海屏手機(jī)安卓O版本適配指導(dǎo) 1、OPPO凹形屏適配說(shuō)明: 2、vivo 全面屏應(yīng)用適配指南: 3、小米劉海屏水滴屏 Android O 適配: |
|
來(lái)自: 西北望msm66g9f > 《培訓(xùn)》