Android中怎么適配劉海屏,針對這個問題,這篇文章詳細介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
鎮(zhèn)海網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)建站,鎮(zhèn)海網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為鎮(zhèn)海上千家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)公司要多少錢,請找那個售后服務(wù)好的鎮(zhèn)海做網(wǎng)站的公司定做!1、系統(tǒng)下移造成的底部 UI 截斷
小說頁碼被截斷
2、劉海擋住標題欄和搜索框
劉海擋住標題欄和搜索框
3、PopupWindow 顯示異常
PopupWindow 顯示異常
三、通用的適配方案
理論上來講,通過 Android P 版本提供的劉海屏相關(guān)接口,判斷手機是否為劉海屏手機,以及進行一些相應(yīng)的處理是最合適的方式,但現(xiàn)在使用在國內(nèi)使用 Android P 的接口是不現(xiàn)實的,所以只能通過各大廠商提供的技術(shù)文檔來進行適配,但適配的流程基本是一致的。
劉海屏的適配流程
劉海屏的適配流程
其中需要著重處理的是:
1、應(yīng)用是否已經(jīng)適配劉海屏
2、頁面是否顯示狀態(tài)欄
3.1 應(yīng)用是否已經(jīng)適配劉海屏
現(xiàn)在國內(nèi)的主流機型(華為、vivo、OPPO、小米)在劉海屏的顯示上分為兩個陣營:
當(dāng)不顯示狀態(tài)欄時,直接將界面進行顯示,「狀態(tài)欄原先的位置也用于顯示界面」,例如:OPPO
當(dāng)不顯示狀態(tài)欄時,直接「將狀態(tài)欄原先的位置進行黑化,界面整體下移」,例如:華為、vivo
所以,我們在進行劉海屏適配的時候,首先需要通過一些手段,統(tǒng)一各大廠商的顯示方案,讓所有的劉海屏手機都利用狀態(tài)欄的界面,「告知系統(tǒng)」我們已經(jīng)適配了劉海屏,確保系統(tǒng)不會下移我們的應(yīng)用,保留原生體驗。
這里主要有兩種方式:
1、設(shè)置屏幕高寬比例
因為劉海屏手機的「寬高比」比之前的手機大,如果不適配的話,Android 默認為大的寬高比為 1.86,
小于劉海屏手機的寬高比,因此我們需要申明更高的寬高比來告訴系統(tǒng),我們應(yīng)用已經(jīng)適配了劉海屏。
只要在 AndroidManifest.xml 中加入如下配置:
<meta-data android:name="android.max_aspect" android:value="2.1"/>
也可以在 Application 添加屬性:
android:maxAspectRatio="ratio_float"
ps:這個屬性需要 API 26 才支持
2、設(shè)置應(yīng)用支持 resize
我們還可以通過設(shè)置應(yīng)用支持 resizeable,來告訴系統(tǒng)我們適配了劉海屏,而且這也是 Google 官方推薦的方式。不過需要注意的是,使用這個屬性之后,應(yīng)用也會跟著支持分屏模式。只需要在 AndroidManifest.xml 中添加:
android:resizeableActivity="true"
3.2 頁面是否顯示狀態(tài)欄
對于劉海屏適配,我們將界面分為兩種:
對于有狀態(tài)欄的界面,不會受到劉海屏的影響
全屏顯示的界面(無狀態(tài)欄),需要根據(jù)界面的顯示進行一些控件的下移
因此,我們進行劉海屏適配,其實針對的就是沒有狀態(tài)欄的界面,而有狀態(tài)欄的界面顯示是正常的。對于沒有狀態(tài)欄的界面,主要是將對被劉海遮擋到的控件,設(shè)置對應(yīng)劉海高度的 MarginTop,從而避免控件被遮擋。而對于底部可能被截斷的界面,可以考慮將底部做成 ScrollView 的形式。
四、各廠商的適配方案
現(xiàn)在 Android P 的接口還沒法用,但各手機廠商都制定了自己的 API,對此我們需要對各大機型進行特殊的適配,這里主要介紹 vivo、OPPO、華為 這三種主流手機的適配方案。
華為
華為作為國內(nèi)的手機廠商大頭,自己仿照 Android P 提供的 API,實現(xiàn)了一套幾乎差不多的 API,所以我們?nèi)绻胍嬖V系統(tǒng)我們的應(yīng)用適配了劉海屏,最好直接使用華為的 API,這樣才是最保險的。
以下代碼來自:華為劉海屏適配官方技術(shù)指導(dǎo)
1、應(yīng)用頁面設(shè)置使用劉海區(qū)顯示
① 方案一:在 AndroidManifest.xml 中增加 meta-data 屬性,此屬性不僅可以針對 Application 生效,也可以對 Activity 配置生效:
<meta-data android:name="android.notch_support" android:value="true"/>
增加這個屬性之后,系統(tǒng)就會對應(yīng)用進行下移處理,從而保證原生體驗。
② 方案二:通過添加窗口 FLAG 的方式設(shè)置界面使用劉海區(qū):
public static void setFullScreenWindowLayoutInDisplayCutout(Window window) { if (window == null) { return; } WindowManager.LayoutParams layoutParams = window.getAttributes(); try { Class layoutParamsExCls = Class.forName("com.huawei.android.view.LayoutParamsEx"); Constructor con=layoutParamsExCls.getConstructor(LayoutParams.class); Object layoutParamsExObj=con.newInstance(layoutParams); Method method=layoutParamsExCls.getMethod("addHwFlags", int.class); method.invoke(layoutParamsExObj, FLAG_NOTCH_SUPPORT); } catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException |InstantiationException | InvocationTargetException e) { Log.e("test", "hw add notch screen flag api error"); } catch (Exception e) { Log.e("test", "other Exception"); } }
2、判斷該華為手機是否劉海屏
public static boolean hasNotchInHuawei(Context context) { boolean hasNotch = false; try { ClassLoader cl = context.getClassLoader(); Class HwNotchSizeUtil = cl.loadClass("com.huawei.android.util.HwNotchSizeUtil"); Method hasNotchInScreen = HwNotchSizeUtil.getMethod("hasNotchInScreen"); if(hasNotchInScreen != null) { hasNotch = (boolean) hasNotchInScreen.invoke(HwNotchSizeUtil); } } catch (Exception e) { e.printStackTrace(); } return hasNotch; }
3、獲取劉海的高度
public static int[] getNotchSize(Context context) { int[] ret = new int[]{0, 0}; try { ClassLoader cl = context.getClassLoader(); Class HwNotchSizeUtil = cl.loadClass("com.huawei.android.util.HwNotchSizeUtil"); Method get = HwNotchSizeUtil.getMethod("getNotchSize"); ret = (int[]) get.invoke(HwNotchSizeUtil); } catch (ClassNotFoundException e) { Log.e("test", "getNotchSize ClassNotFoundException"); } catch (NoSuchMethodException e) { Log.e("test", "getNotchSize NoSuchMethodException"); } catch (Exception e) { Log.e("test", "getNotchSize Exception"); } finally { return ret; }
OPPO
OPPO 是主流廠商中的一股清流,學(xué) iPhoneX 是最像的,OPPO 手機對于不顯示狀態(tài)欄的界面,采取的是「狀態(tài)欄原先的位置也用于顯示界面」的方案,所以我們只要進行相關(guān)控件的位置移動就可以了。
以下代碼來自:OPPO 凹形屏適配說明
1、判斷該 OPPO 手機是否為劉海屏手機
public static boolean hasNotchInOppo(Context context) { return context.getPackageManager().hasSystemFeature("com.oppo.feature.screen.heteromorphism"); }
2、獲取劉海屏的高度
對于 OPPO 劉海屏手機的劉海高度,OPPO 官方的文檔沒有提供相關(guān)的 API,但官方文檔表示 OPPO 手機的劉海高度和狀態(tài)欄的高度是一致的,而且我也對此進行了驗證,確實如此。所以我們可以直接獲取狀態(tài)欄的高度,作為 OPPO 手機的劉海高度。
public static int getStatusBarHeight(Context context) { int statusBarHeight = 0; int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) { statusBarHeight = context.getResources().getDimensionPixelSize(resourceId); } return statusBarHeight ; }
vivo
vivo 提供的技術(shù)文檔對于開發(fā)者來說是最不友好的,只提供了一個 API 來進行劉海屏的判斷,并沒有提供劉海高度的獲取方式,我們只能通過獲取狀態(tài)欄高度來當(dāng)做劉海的高度,但在某些機型可能會有些偏差。
官方文檔: vivo 手機適配指南
判斷該 vivo 手機是否為劉海屏手機
public static boolean hasNotchInVivo(Context context) { boolean hasNotch = false; try { ClassLoader cl = context.getClassLoader(); Class ftFeature = cl.loadClass("android.util.FtFeature"); Method[] methods = ftFeature.getDeclaredMethods(); if (methods != null) { for (int i = 0; i < methods.length; i++) { Method method = methods[i]; if(method != null) { if (method.getName().equalsIgnoreCase("isFeatureSupport")) { hasNotch = (boolean) method.invoke(ftFeature, 0x00000020); break; } } } } } catch (Exception e) { e.printStackTrace(); hasNotch = false; } return hasNotch; }
關(guān)于Android中怎么適配劉海屏問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識。
網(wǎng)站名稱:Android中怎么適配劉海屏-創(chuàng)新互聯(lián)
網(wǎng)站URL:http://muchs.cn/article36/dseopg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、網(wǎng)站維護、網(wǎng)站策劃、外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)站營銷
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容