final View decorView = window.getDecorView();
decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);

其中延伸显示区域到刘海的代码,也可以通过修改Activity或应用的style实现,例如:

<?xml version="1.0" encoding="utf-8"?>

Android O 适配

因Google官方的适配方案到Android P才推出,因此在Android O(8.0版本)设备上,各家厂商有自己的实现方案。

华为Android O适配

方案一:

  1. 具体方式如下所示:
  1. 对Application生效,意味着该应用的所有页面,系统都不会做竖屏场景的特殊下移或者是横屏场景的右移特殊处理。例如:
  1. 对Activity生效,意味着可以针对单个页面进行刘海屏适配,设置了该属性的Activity系统将不会做特殊处理。例如:

方案二:
对Application生效,意味着该应用的所有页面,系统都不会做竖屏场景的特殊下移或者是横屏场景的右移特殊处理。

1,设置应用窗口在华为刘海屏手机使用刘海区。

/刘海屏全屏显示FLAG/
public static final int FLAG_NOTCH_SUPPORT=0x00010000;
/**

  • 设置应用窗口在华为刘海屏手机使用刘海区
  • @param window 应用页面window对象
    */
    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.清除添加的华为刘海屏Flag,恢复应用不使用刘海区显示。

public static void setNotFullScreenWindowLayoutInDisplayCutout (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(“clearHwFlags”, int.class);
method.invoke(layoutParamsExObj, FLAG_NOTCH_SUPPORT);
} catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException |InstantiationException
| InvocationTargetException e) {
Log.e(“test”, “hw clear notch screen flag api error”);
} catch (Exception e) {
Log.e(“test”, “other Exception”);
}
}

小米Android O适配

  1. 判断是否是刘海屏。

private static boolean isNotch() {
try {
Method getInt = Class.forName(“android.os.SystemProperties”).getMethod(“getInt”, String.class, int.class);
int notch = (int) getInt.invoke(null, “ro.miui.notch”, 0);
return notch == 1;
} catch (Throwable ignor

《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享

e) {
}
return false;
}

  1. 设置显示到刘海区域

@Override
public void setDisplayInNotch(Activity activity) {
int flag = 0x00000100 | 0x00000200 | 0x00000400;
try {
Method method = Window.class.getMethod(“addExtraFlags”,
int.class);
method.invoke(activity.getWindow(), flag);
} catch (Exception ignore) {
}
}

  1. 获取刘海宽高

public static int getNotchHeight(Context context) {
int resourceId = context.getResources().getIdentifier(“notch_height”, “dimen”, “android”);
if (resourceId > 0) {
return context.getResources().getDimensionPixelSize(resourceId);
}
return 0;
}

public static int getNotchWidth(Context context) {
int resourceId = context.getResources().getIdentifier(“notch_width”, “dimen”, “android”);
if (resourceId > 0) {
return context.getResources().getDimensionPixelSize(resourceId);
}
return 0;
}

oppo Android O适配

  1. 判断是否是刘海屏

@Override
public boolean hasNotch(Activity activity) {
boolean ret = false;
try {
ret = activity.getPackageManager().hasSystemFeature(“com.oppo.feature.screen.heteromorphism”);
} catch (Throwable ignore) {
}
return ret;
}

  1. 获取刘海的左上角和右下角的坐标

private static String getScreenValue() {
String value = “”;
Class<?> cls;
try {
cls = Class.forName(“android.os.SystemProperties”);
Method get = cls.getMethod(“get”, String.class);
Object object = cls.newInstance();
value = (String) get.invoke(object, “ro.oppo.screen.heteromorphism”);
} catch (Throwable ignore) {
}
return value;
}

好啦,文章到这里就结束啦,如果你觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足。谢谢。

希望读到这的您能转发分享和关注一下我,以后还会更新技术干货,谢谢您的支持!

转发+点赞+关注,第一时间获取最新知识点

catch (Throwable ignore) {
}
return value;
}

好啦,文章到这里就结束啦,如果你觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足。谢谢。

[外链图片转存中…(img-UP9OVrO8-1638848540578)]

希望读到这的您能转发分享和关注一下我,以后还会更新技术干货,谢谢您的支持!

转发+点赞+关注,第一时间获取最新知识点

Android刘海屏、水滴屏全面屏适配详解,android开发权威指南相关推荐

  1. Android刘海屏、水滴屏全面屏适配详解

    现在,市面上的屏幕尺寸和全面屏方案五花八门.这里我使用了小米的图来说明: 上述两种屏幕都可以统称为刘海屏,不过对于右侧较小的刘海,业界一般称为水滴屏或美人尖.为便于说明,后文提到的「刘海屏」「刘海区」 ...

  2. Android刘海屏、水滴屏全面屏适配详解,androidui基础教程

    适配方式 适配方式有两种: 将targetSdkVersion版本设置到API 24及以上: 这个操作将会为<application> 标签隐式添加一个属性,android:resizea ...

  3. Android刘海屏、水滴屏全面屏适配详解,997页字节跳动Android面试真题解析火爆全网

    适配方式 适配方式有两种: 将targetSdkVersion版本设置到API 24及以上: 这个操作将会为<application> 标签隐式添加一个属性,android:resizea ...

  4. Android刘海屏、水滴屏全面屏适配详解,android开发实战湖南师范大学出版社

    android:resizeableActivity=["true" | "false"] 如果该属性设置为 true,Activity 将能以分屏和自由形状模 ...

  5. Android刘海屏、水滴屏全面屏适配详解,android开发应用实战详解

    适配方式 适配方式有两种: 将targetSdkVersion版本设置到API 24及以上: 这个操作将会为<application> 标签隐式添加一个属性,android:resizea ...

  6. Android刘海屏、水滴屏全面屏适配详解大厂直通车!

    为什么想跳槽? 简单说一下当时的状况,我在这家公司做了两年多,这两年多完成了一个大项目,作为开发的核心主力,开发压力很大,特别是项目上线前的几个月是非常辛苦,几乎每晚都要加班到12点以后,周末最多只有 ...

  7. 【Android】【手机适配】Android自定义导航栏和全面屏适配方案

    名词说明 状态栏:StatusBar,手机上方显示电量.时间的横条 导航栏:NavigationBar,手机下方显示虚拟按键的横条 标题栏:ActionBar,应用顶部显示标题的横条 全面屏:界面内容 ...

  8. Android 闪屏启动页全面屏适配

    随着全面屏手机普及,目前市面上的手机屏幕尺寸大致分为三种: 非全面屏(16:9),全面屏(18:9),全面屏(>18:9) App启动初始化程序会出现短暂的白屏问题,为解决白屏可设置启动页面样式 ...

  9. android车载支持格式,安卓全面屏适配攻略(适配超长车载主机)

    前言 2017年9月,拜腾的横空出世,打破了车载主机界一直以来的沉寂,各大媒体也是不吝词藻的对它的超长中控屏进行了大肆的报道.这个时候作为同为车机供应者的诸位友商心里却不那么的平静,恨不得在发布会现场 ...

最新文章

  1. 在CentOS 6.9 x86_64的nginx 1.12.2上开启标准模块ngx_http_map_module实录
  2. python爬虫如何配置动态爬虫代理
  3. Hello CNBLOGS
  4. 通过virtualbox最小化安装centos 6.3后无法上网解决办法
  5. codeup 二叉树(dfs超时版)
  6. iOS开源项目周报0316
  7. Oracle学习:事务的基本概念
  8. android 视频监控相关(打包下载)
  9. Spring MVC中的视图解析ViewResolver
  10. 计算机网络实验3:网络设备基本配置
  11. LeetCode(169)——求众数(JavaScript)
  12. powerpc如何移植Linux系统,PowerPC平台 u-boot 移栽
  13. Linux重定向和管道的基础学习
  14. miniUI ExcelExport导出JAVA实现
  15. 计算机应用基础评价内容,计算机应用基础教学中过程性评价的研究
  16. 基于React的富文本编辑器——Braft Editor使用
  17. 轻松搞定分组报表中的各种排序
  18. 网易嵌入式面试 2015年8月19日晚网易电话面试
  19. 28.从键盘输入10个正负相间的整数,输出个位数是奇数、十位数是偶数的所有数。
  20. 线程局部变量 ThreadLocal

热门文章

  1. spring 容器启动执行重置定时任务
  2. Ubuntu18如何下载微信和qq
  3. android user-agent iso-8859-1,微信大众,平台消息接口开辟(31)微信浏览器HTTP_USER_AGENT断定...
  4. 企业品牌私域化运营,私域流量只是起步
  5. 全面了解超声波传感器
  6. 啊哈添柴挑战Java1221. 输出三角形
  7. psm进销存管理系统、供应商管理、进货管理、销售管理、仓库管理、采购记录、库存盘点、调拨单、出库单、借入单、进货报表、采购记录、销售往来账、采购往来账、图表分析、人事管理、销售报表、财务报表、rp原型
  8. selenium 接管已经打开的本地浏览器窗口
  9. 一本通1360:奇怪的电梯(lift)
  10. 从 Server Timing Header 看服务器是如何处理请求的