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