亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

詳解Android 華為凹口屏適配小結

2019-10-21 21:25:13
字體:
來源:轉載
供稿:網友

Android8.0以后【凹口屏】得到迅速發展,目前已有了挖孔屏/水滴屏/劉海屏等各式各樣的屏幕,究其根本依舊是【凹口屏】,單華為一個品牌就涵蓋了基本所有類型,而對于屏幕適配也是不可逃避的問題。小菜單獨對華為各型號屏幕進行適配嘗試,部分方法可通用到其他品牌設備,為 Android 標準 SDK 方法。

其實凹口屏已經出現很久了,對于獲取凹口寬高的方式也有很多種,但是以前主流的凹口屏中凹口位置一般是位于屏幕正上方,但隨著發展,也出現了在左上角的挖孔屏樣式。相應的, Android 9.0 即 SDK28 也發布了獲取凹口屏的方法。

Android 9.0 以下適配方案

對華為設備凹口屏適配情況來說,若僅需獲取凹口位置的寬高,如下方法即可,在 Android 各版本中均可( Android 9.0 及以上亦可)。此時獲取屏幕水平方向安全位置時,可根據屏幕寬度-凹口寬度再左右均分即可。

/** * 華為凹口屏判斷方法 Android 各版本均可 * @param context * @return */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(TAG, "hasNotchInScreen ClassNotFoundException");  } catch (NoSuchMethodException e) {    Log.e(TAG, "hasNotchInScreen NoSuchMethodException");  } catch (Exception e) {    Log.e(TAG, "hasNotchInScreen Exception");  } finally {    return ret;  }}/** * 華為凹口屏寬高獲取方式 int[]{width, height} * @param context * @return */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(TAG, "getNotchSize ClassNotFoundException");  } catch (NoSuchMethodException e) {    Log.e(TAG, "getNotchSize NoSuchMethodException");  } catch (Exception e) {    Log.e(TAG, "getNotchSize Exception");  } finally {    notchWidth = ret[0];    notchHeight = ret[1];    return ret;  }}

Android,凹口屏,適配

Android,凹口屏,適配

Android 9.0 及以上適配

對于華為新出的挖孔屏設備基本均為 Android 9.0 及以上, Android 9.0 提供了對凹口屏相關的 SDK ,谷歌認為凹口位置可以不固定位置也不固定個數,但是對于設備一條邊只能有一個;如下方法對于 Android 9.0 及以上設備判斷均可。 SDK 不僅可以判斷是否為凹口屏,同時可以獲取各個凹口大小及所在位置。

步驟如下: 升級 build.gradle 中 compileSdkVersion 或 targetSdkVersion 為 28 ; 在 Application 或 Activity 中設置 meta-data 屬性,小菜測試不設置亦可;

<meta-data android:name="android.notch_support" android:value="true"/>

根據如下方法獲取相應參數;

if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {  getSupportActionBar().hide();  getWindow().getDecorView()    .setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);  //設置頁面全屏顯示  WindowManager.LayoutParams lp = getWindow().getAttributes();  lp.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;  //設置頁面延伸到凹口區顯示  getWindow().setAttributes(lp);  getWindow().getDecorView()    .findViewById(android.R.id.content)    .getRootView()    .setOnApplyWindowInsetsListener(new View.OnApplyWindowInsetsListener() {      @Override      public WindowInsets onApplyWindowInsets(View view, WindowInsets windowInsets) {        DisplayCutout cutout = windowInsets.getDisplayCutout();        if (cutout == null) {          Log.e(TAG, "cutout==null, is not notch screen");//通過cutout是否為null判斷是否凹口手機          isNotchScreen = false;        } else {          List<Rect> rects = cutout.getBoundingRects();          if (rects == null || rects.size() == 0) {            Log.e(TAG, "rects==null || rects.size()==0, is not notch screen");            isNotchScreen = true;          } else {            Log.e(TAG, "rect size:" + rects.size());//注意:凹口的數量可以是多個            isNotchScreen = true;            for (Rect rect : rects) {              notchRight = rect.right;              notchLeft = rect.left;              notchTop = rect.top;              notchBottom = rect.bottom;              notchWidth = notchRight - notchLeft;              notchHeight = notchBottom - notchLeft;              safeLeft = cutout.getSafeInsetLeft();              safeRight = cutout.getSafeInsetRight();              safeTop = cutout.getSafeInsetTop();              safeBottom = cutout.getSafeInsetBottom();            }          }        }        return windowInsets;      }    });}

Android,凹口屏,適配

Android,凹口屏,適配

Android,凹口屏,適配

Android,凹口屏,適配

注意事項: 小菜在設置 Application 或 Activity 的主題為 NoActionBar 樣式,此時要去掉 getSupportActionBar().hide(); 否則會報空指針異常;

<style name="NoBarTheme" parent="Theme.AppCompat.NoActionBar"> <item name="android:windowNoTitle">true</item> <item name="android:windowContentOverlay">@null</item></style>

如下設置全屏使用凹口屏時要注意 View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN ,否則參數很有可能獲取不到;

getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);WindowManager.LayoutParams lp = getWindow().getAttributes();lp.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;getWindow().setAttributes(lp);

設置主題 NoActionBar 或代碼中動態設置 getSupportActionBar().hide(); 展示效果在 Android 9.0 以下有部分差異,如下:

Android,凹口屏,適配

NoActionBar 主題

Android,凹口屏,適配

AppTheme 主題

對于凹口屏適配還有很多機型要單獨處理,以上僅對華為設備進行參考;如果有不對的地方還希望多多指出。也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久免费高清电视剧观看| 国产精品日韩精品| 久久大大胆人体| 欧美有码在线观看视频| 国产精品美乳一区二区免费| 黄色一区二区在线观看| 亚洲成人久久久久| 91久久久久久久一区二区| 亚洲一区二区三区成人在线视频精品| 另类少妇人与禽zozz0性伦| 欧美最顶级丰满的aⅴ艳星| 国内久久久精品| 欧美成人免费大片| 国产精品亚洲美女av网站| 久久久久久国产精品美女| 正在播放亚洲1区| 久久久精品日本| 久久影视三级福利片| 国产精品入口福利| 91经典在线视频| 啊v视频在线一区二区三区| 亚洲电影免费观看高清完整版在线观看| 一本色道久久综合亚洲精品小说| 日韩国产激情在线| 伊人久久久久久久久久久久久| 亚洲人成电影在线观看天堂色| 亚洲精品久久久久久久久| 国产精品一区二区三区在线播放| 亚洲人精品午夜在线观看| 日韩免费不卡av| 97碰碰碰免费色视频| 精品国产精品自拍| 亚洲国产成人精品久久久国产成人一区| 在线精品视频视频中文字幕| 亚洲欧美日韩中文在线制服| 欧美国产日韩视频| 国产精品久久激情| 日韩中文字幕在线| 亚洲欧美日韩一区在线| 色偷偷综合社区| 午夜精品理论片| 日韩成人中文字幕| 国产精品第一视频| 国产亚洲欧美另类中文| 日韩视频在线免费观看| 亚洲精品二三区| 中文字幕视频一区二区在线有码| 日韩视频在线观看免费| 日韩精品视频免费专区在线播放| 成人免费福利视频| 尤物yw午夜国产精品视频明星| 成人中文字幕在线观看| 精品视频在线观看日韩| 亚洲视频网站在线观看| 色先锋资源久久综合5566| 亚洲日本成人女熟在线观看| 国产视频在线观看一区二区| 亚洲天堂男人的天堂| 日韩av在线一区二区| 韩国19禁主播vip福利视频| 中文字幕少妇一区二区三区| 亚洲第一二三四五区| 少妇激情综合网| 久久婷婷国产麻豆91天堂| 尤物yw午夜国产精品视频| 性金发美女69hd大尺寸| 狠狠色狠狠色综合日日小说| 日韩中文字幕在线免费观看| 亚洲精品日韩在线| 色伦专区97中文字幕| 国产成人精品在线播放| 欧美性生活大片免费观看网址| 欧美成人一二三| 亚洲自拍偷拍福利| 亚洲精品短视频| 国产精品三级美女白浆呻吟| 日本精品免费观看| 亚洲的天堂在线中文字幕| 成人一区二区电影| 欧美激情一区二区三区久久久| 亚洲www视频| 日韩精品久久久久久久玫瑰园| 欧美久久精品一级黑人c片| 欧美成人全部免费| 欧美极品少妇xxxxx| 日韩激情在线视频| 91夜夜未满十八勿入爽爽影院| 国产91精品久久久久久久| 日韩在线精品一区| 日韩激情视频在线播放| 日韩中文在线视频| 亚洲激情视频在线观看| 日韩在线观看你懂的| 亚洲精品国产综合区久久久久久久| 伊人久久精品视频| 亚洲天堂免费在线| 亚洲成色777777在线观看影院| 亚洲国产精品一区二区三区| 亚洲视频第一页| 久久久久久久一| 亚洲成色777777女色窝| 欧美老女人在线视频| 久久久久久久久久av| 亚洲人午夜色婷婷| 色七七影院综合| 国产亚洲欧美另类中文| 久久人人爽人人爽爽久久| 日韩在线欧美在线国产在线| 亚洲精品美女久久| 亚洲午夜av久久乱码| 在线日韩第一页| 国产精品99一区| 亚洲精品久久久久久久久| 最新的欧美黄色| 亚洲激情久久久| 亚洲色图35p| 国产精品福利在线观看| 青青久久av北条麻妃海外网| 国产成人综合精品在线| 国产精品美女主播在线观看纯欲| 欧美一区二区三区免费视| 川上优av一区二区线观看| 亚洲男人av电影| 欧美精品videossex88| 亚洲成人久久一区| 欧美大片网站在线观看| 亚洲一区二区少妇| 久青草国产97香蕉在线视频| 久久久久久免费精品| 上原亚衣av一区二区三区| 日本欧美精品在线| 91成人免费观看网站| 国产精品69久久久久| 国色天香2019中文字幕在线观看| 91成人免费观看网站| 日本一区二区三区四区视频| 亚洲福利在线观看| 国产精品国模在线| 久久999免费视频| 日韩免费看的电影电视剧大全| 成人激情在线播放| 日韩一二三在线视频播| 久久久久久久电影一区| 一个人看的www久久| 日本成人黄色片| 国产国产精品人在线视| 福利一区视频在线观看| 欧美亚洲伦理www| 成人性生交大片免费观看嘿嘿视频| 欧美视频在线免费看| 欧美日韩激情视频8区| 久久久女人电视剧免费播放下载| 亚洲国内高清视频| 久久精品视频在线播放| 日韩电影在线观看中文字幕| 久久在线免费视频| 精品国产一区二区三区四区在线观看| 欧美大片在线免费观看| 国产女人精品视频| 亚洲精美色品网站| 亚洲成人三级在线| 欧美中文字幕在线视频| 亚洲一区二区三区sesese| 国产精品永久免费视频|