随着iPhone X釋出,國内一些廠商也推出了劉海屏手機,即将釋出的Android p也提供了對劉海屏的支援。so,我們的app也要提前做好适配。
1
什麼是劉海屏?
螢幕的正上方居中位置(下圖黑色區域)會被挖掉一個孔,螢幕被挖掉的區域無法正常顯示内容,這種類型的螢幕就是劉海屏,也有其他叫法:挖孔屏、凹凸屏等等,這裡統一按劉海屏命名。

目前國内廠商已經推出的劉海屏Android手機有華為P20 pro, vivo X21,OPPO R15。
如果沒有适配劉海屏會有什麼後果?
後果一:導航欄中title被遮擋
未适配劉海屏1
後果二:顯示内容下移,頭部出現黑條,底部出現遮擋
未适配劉海屏2
2
如何适配劉海屏?
由于Android p正式版今日剛釋出, 目前市面上的Android 劉海屏手機還不能用Android 官方提供的方案來解決,那怎麼辦呢?還好幾個廠商自己給出了适配方案。我們先講理論後上代碼,如果您隻想要代碼就直接往下翻:
華為P20 pro
華為劉海屏适配官方文檔
https://devcenter-test.huawei.com/consumer/cn/devservice/doc/50114
華為給出的文檔最為詳細(業界良心),P20 pro預裝系統對未做劉海屏适配處理的app有一定處理,處理邏輯如下
預處理流程圖
可見,會被華為系統做偏移處理的有2種情況:
1.未設定meta-data值,頁面橫屏狀态
2.未設定meta-data值,頁面豎屏狀态,不顯示狀态欄
這2種情況都會出現後果二。如果你的app中頁面沒有這兩種情況,例如都是豎屏且顯示狀态欄,你就可以淡定地不做處理。
現在我們知道原因了就可以對症下藥了,這裡給出我推薦的解決方案(官方給出的解決方案不止一種,可以根據自己的需要采用) 分為4步:
1.配置meta-data
①對Application生效,意味着該應用的所有頁面,系統都不會做豎屏場景的特殊下移或者是橫屏場景的右移特殊處理:
配置在application下
② 對Activity生效,意味着可以針對單個頁面進行劉海屏适配,設定了該屬性的Activity系統将不會做特殊處理:
配置在Activity下
2.檢測是否存在劉海屏
public static boolean hasNotchInScreen(Context context) { boolean ret = false; try { ClassLoader cl = context.getClassLoader(); Class HwNotchSizeUtil = cl.loadClass("com.huawei.android.util.HwNotchSizeUtil"); Method get = HwNotchSizeUtil.getMethod("hasNotchInScreen"); ret = (boolean) get.invoke(HwNotchSizeUtil); } catch (ClassNotFoundException e) { Log.e("test