电竞比分网-中国电竞赛事及体育赛事平台

分享

Android劉海屏、水滴屏全面屏適配方案

 西北望msm66g9f 2019-06-24

本文來(lái)源:聰明叉

原文鏈接:https://www.jianshu.com/p/2b8db60ba8df

前言

我將適配方案整理后,封裝成了一個(gè)庫(kù)并上傳至github,可參考使用

項(xiàng)目地址:
https://github.com/smarxpan/NotchScreenTool

市面上的屏幕尺寸和全面屏方案五花八門(mén)。

這里我使用了小米的圖來(lái)說(shuō)明:

上述兩種屏幕都可以統(tǒng)稱(chēng)為劉海屏,不過(guò)對(duì)于右側(cè)較小的劉海,業(yè)界一般稱(chēng)為水滴屏或美人尖。為便于說(shuō)明,后文提到的「劉海屏」「劉海區(qū)」都同時(shí)指代上圖兩種屏幕。

當(dāng)我們?cè)谡勂聊贿m配時(shí),我們?cè)谡勈裁?/h2>
  1. 適應(yīng)更長(zhǎng)的屏幕

  2. 防止內(nèi)容被劉海遮擋

其中第一點(diǎn)是所有應(yīng)用都需要適配的,對(duì)應(yīng)下文的聲明最大長(zhǎng)寬比

而第二點(diǎn),如果應(yīng)用本身不需要全屏顯示或使用沉浸式狀態(tài)欄,是不需要適配的。

針對(duì)需要適配第二點(diǎn)的應(yīng)用,需要獲取劉海的位置和寬高,然后將顯示內(nèi)容避開(kāi)即可。

聲明最大長(zhǎng)寬比

以前的普通屏長(zhǎng)寬比為16:9,全面屏手機(jī)的屏幕長(zhǎng)寬比增大了很多,如果不適配的話就會(huì)類(lèi)似下面這樣:

黑色區(qū)域?yàn)槲蠢玫膮^(qū)域。

適配方式

適配方式有兩種:

  1. 將targetSdkVersion版本設(shè)置到API 24及以上

    這個(gè)操作將會(huì)為 標(biāo)簽隱式添加一個(gè)屬性,android:resizeableActivity=”true”, 該屬性的作用后面將詳細(xì)說(shuō)明。

  2. 在 標(biāo)簽中增加屬性:android:resizeableActivity=”false”

    同時(shí)在節(jié)點(diǎn)下增加一個(gè)meta-data標(biāo)簽:

原理說(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)開(kāi)始,官方提供了適配異形屏的方式。

Support display cutouts:
https://developer./guide/topics/display-cutout?hl=zh-CN

通過(guò)全新的 DisplayCutout 類(lèi),可以確定非功能區(qū)域的位置和形狀,這些區(qū)域不應(yīng)顯示內(nèi)容。 要確定這些凹口屏幕區(qū)域是否存在及其位置,請(qǐng)使用 getDisplayCutout() 函數(shù)。

1、全新的窗口布局屬性 layoutInDisplayCutoutMode 讓您的應(yīng)用可以為設(shè)備凹口屏幕周?chē)膬?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

  1. LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT

  2. LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES

  3. LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER

您可以按如下方法在任何運(yùn)行 Android P 的設(shè)備或模擬器上模擬屏幕缺口:

1、啟用開(kāi)發(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)景的右移特殊處理

我的NotchScreenTool中使用的就是方案二,如果需要針對(duì)Activity,建議自行修改。

1. 設(shè)置應(yīng)用窗口在華為劉海屏手機(jī)使用劉海區(qū)

2. 清除添加的華為劉海屏Flag,恢復(fù)應(yīng)用不使用劉海區(qū)顯示

  1. 設(shè)置顯示到劉海區(qū)域

  1. 獲取劉海寬高

適配oppoAndroid O設(shè)備

判斷是否是劉海屏

獲取劉海的左上角和右下角的坐標(biāo)

Oppo Android O機(jī)型不需要設(shè)置顯示到劉海區(qū)域,只要設(shè)置了應(yīng)用全屏就會(huì)默認(rèn)顯示。

因此Oppo機(jī)型必須適配。

適配總結(jié)

根據(jù)上述功能,我將其整理成了一個(gè)依賴(lài)庫(kù):NotchScreenTool

使用起來(lái)很簡(jiǎn)單:

獲取劉海區(qū)域信息后就可以根據(jù)自己應(yīng)用的需要,來(lái)避開(kāi)重要的控件。

詳情可參考我項(xiàng)目中的代碼。

參考鏈接

華為劉海屏手機(jī)安卓O版本適配指導(dǎo)

1、OPPO凹形屏適配說(shuō)明:
https://open./wiki/doc#id=10159

2、vivo 全面屏應(yīng)用適配指南:
https://dev.vivo.com.cn/documentCenter/doc/103

3、小米劉海屏水滴屏 Android O 適配:
https://dev.mi.com/console/doc/detail?pId=1293

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多