Android 劉海屏適配總結

2021-09-11 17:06:56 字數 3540 閱讀 1702

劉海屏手機因為比平常的手機多了一塊頂部的遮擋性劉海,所以會造成頂部 ******* 以及搜尋框的遮擋,而且有些廠商的手機(vivo、華為),預設是在「無狀態列」的介面將狀態列進行黑化顯示,這時候會導致系統下移,從而導致底部的一些 ui 被截斷。除此之外,一些控制項的顯示規則還會受到影響,如 popupwindow 的顯示高度會在「無狀態列」的介面中比普通手機低乙個「劉海的高度」,從而遮擋住原先在 popupwindow 周圍的圖示。

1、系統下移造成的底部 ui 截斷

2、劉海擋住標題欄和搜尋框

3、popupwindow 顯示異常

理論上來講,通過 android p 版本提供的劉海屏相關介面,判斷手機是否為劉海屏手機,以及進行一些相應的處理是最合適的方式,但現在在國內使用 android p 的介面是不現實的,所以只能通過各大廠商提供的技術文件來進行適配,但適配的流程基本是一致的。

劉海屏的適配流程

其中需要著重處理的是:

3.1 應用是否已經適配劉海屏

現在國內的主流機型(華為、vivo、oppo、小公尺)在劉海屏的顯示上分為兩個陣營:

所以,我們在進行劉海屏適配的時候,首先需要通過一些手段,統一各大廠商的顯示方案,讓所有的劉海屏手機都利用狀態列的介面,「告知系統」我們已經適配了劉海屏,確保系統不會下移我們的應用,保留原生體驗。

這裡主要有兩種方式:

1、設定螢幕高寬比例

因為劉海屏手機的「寬高比」比之前的手機大,如果不適配的話,android 預設為最大的寬高比為 1.86, 小於劉海屏手機的寬高比,因此我們需要申明更高的寬高比來告訴系統,我們應用已經適配了劉海屏。

只要在 androidmanifest.xml 中加入如下配置:

"android.max_aspect"  android:value="2.1"/>

複製**

android:maxaspectratio="ratio_float"

複製**

ps:這個屬性需要 api 26 才支援

2、設定應用支援 resize

我們還可以通過設定應用支援 resizeable,來告訴系統我們適配了劉海屏,而且這也是 google 官方推薦的方式。不過需要注意的是,使用這個屬性之後,應用也會跟著支援分屏模式。只需要在 androidmanifest.xml 中新增:

android:resizeableactivity="true"

複製**

3.2 頁面是否顯示狀態列

對於劉海屏適配,我們將介面分為兩種:

因此,我們進行劉海屏適配,其實針對的就是沒有狀態列的介面,而有狀態列的介面顯示是正常的。對於沒有狀態列的介面,主要是將對被劉海遮擋到的控制項,設定對應劉海高度的 margintop,從而避免控制項被遮擋。而對於底部可能被截斷的介面,可以考慮將底部做成 scrollview 的形式。

現在 android p 的介面還沒法用,但各手機廠商都制定了自己的 api,對此我們需要對各大機型進行特殊的適配,這裡主要介紹 vivo、oppo、華為 這三種主流手機的適配方案。

華為華為作為國內的手機廠商大頭,自己仿照 android p 提供的 api,實現了一套幾乎差不多的 api,所以我們如果想要告訴系統我們的應用適配了劉海屏,最好直接使用華為的 api,這樣才是最保險的。

以下**來自:華為劉海屏適配官方技術指導

1、應用頁面設定使用劉海區顯示

"android.notch_support" android:value="true"/>

複製**

增加這個屬性之後,系統就不會對應用進行下移處理,從而保證原生體驗。

② 方案二:通過新增視窗 flag 的方式設定介面使用劉海區:

public static void setfullscreenwindowlayoutindisplaycutout(window window) 

windowmanager.layoutparams layoutparams = window.getattributes();

try catch (classnotfoundexception | nosuchmethodexception | illegalacces***ception |instantiationexception

| invocationtargetexception e) catch (exception e)

}複製**

2、判斷該華為手機是否劉海屏
public static boolean hasnotchinhuawei(context context) 

} catch (exception e)

return hasnotch;

}複製**

3、獲取劉海的高度
public static int getnotchsize(context context) ;

try catch (classnotfoundexception e) catch (nosuchmethodexception e) catch (exception e) finally

複製**

oppo

oppo 是主流廠商中的一股清流,學 iphonex 是最像的,oppo 手機對於不顯示狀態列的介面,採取的是「狀態列原先的位置也用於顯示介面」的方案,所以我們只要進行相關控制項的位置移動就可以了。

以下**來自: oppo 凹形屏適配說明

1、判斷該 oppo 手機是否為劉海屏手機

public static boolean hasnotchinoppo(context context) 

複製**

2、獲取劉海屏的高度

對於 oppo 劉海屏手機的劉海高度,oppo 官方的文件沒有提供相關的 api,但官方文件表示 oppo 手機的劉海高度和狀態列的高度是一致的,而且我也對此進行了驗證,確實如此。所以我們可以直接獲取狀態列的高度,作為 oppo 手機的劉海高度。

public static int getstatusbarheight(context context) 

return statusbarheight ;

}複製**

vivo

vivo 提供的技術文件對於開發者來說是最不友好的,只提供了乙個 api 來進行劉海屏的判斷,並沒有提供劉海高度的獲取方式,我們只能通過獲取狀態列高度來當做劉海的高度,但在某些機型可能會有些偏差。

官方文件:vivo 手機適配指南

判斷該 vivo 手機是否為劉海屏手機

public static boolean hasnotchinvivo(context context) }}

}} catch (exception e)

return hasnotch;

}複製**

以上便是在之前在進行 android 劉海屏適配的時候,所積累的一些經驗和心得。將其記錄下來,以便自己以後進行回顧,同時也希望這篇文章能對進行劉海屏適配的同學一些幫助。

android 全面屏 劉海屏有效適配

手機廠商追求高使用者體驗,螢幕寬高比越做越高。17 9 19 10 18 9 18.5 9所謂全面屏。原來一般主流手機1920 1080解析度 16 9高寬比。如果沒有單獨去配置屬性,會導致在超過17 9寬高比手機上,底部一大塊黑底。在應用配置檔案androidmanifest.xml中顯式宣告支援...

前端iPhone劉海屏適配

對於iphone系列出的越來越多,如果只是使用 media來做適配的話,老 想要適配新機型還是有一定侷限性的。今天去搜了搜相關的解決方法,那麼就來總結一下。早期蘋果對於 iphone x 的設計布局意見如下 核心內容應該處於 safe area 確保不會被裝置圓角 corners 感測器外殼 sen...

使用 css 適配 iphoneX 劉海屏

iphonex 劉海螢幕導致 h5 頁面不能正常的全屏顯示了,就需要對 頁面進行適配,下面就詳細說說如何適配。首先上一張適配之前的圖 可以看到頁面頂部被遮擋,底部貼著最下面 ios11 增加新特性,增加webkit 的 css 函式,css 預定義變數 四個預定義變數為設定安全區域和邊界的距離,如下...