Android刘海屏适配

全屏模式下刘海屏黑边(内容区域下挫)问题,支持国国内 华为,小米,OPPO/VIVIO 非原生9.0系统的刘海屏

  • 刘海屏是Android9.0之后才支持的 详见源码 android.view.DisplayCutout.class
  • 国内主流手机也有刘海屏,官方有相关的刘海屏适配文档,这里提供一个工具类Util 可能更新不及时,仅供参考
  • 最终效果是刘海屏不遮挡内容区域,支持旋转,支持国内主流手机。如下

1. 设置全屏

Window window = getWindow();
window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

2. 设置沉浸式状态栏

// 隐藏虚拟按钮 可选 SYSTEM_UI_FLAG_HIDE_NAVIGATION
int flag = View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
int visibility = window.getDecorView().getSystemUiVisibility();
visibility |= flag;
window.getDecorView().setSystemUiVisibility(visibility);

3. 让内容延伸至刘海屏区域

3.1 判断是否是刘海屏

注意,判断方法需要放到获取需要在view绑定到window之后,否则拿不到。建议在Activity.onAttachedToWindow()中处理

@Override
public void onAttachedToWindow() {super.onAttachedToWindow();// 判断是否有刘海区域if(国内主流手机){// Utils 工具类中有判断是否是刘海屏,并设置全屏的处理办法}else{if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.P) {Window window = getWindow();DisplayCutout displayCutout = window.getDecorView().getRootWindowInsets().getDisplayCutout();if(displayCutout != null){// 有刘海屏Log.e("displayCutout","Rect " + displayCutout.getBoundingRects());Log.e("displayCutout","Rect " + displayCutout.getSafeInsetLeft());Log.e("displayCutout","Rect " + displayCutout.getSafeInsetTop());Log.e("displayCutout","Rect " + displayCutout.getSafeInsetRight());Log.e("displayCutout","Rect " + displayCutout.getSafeInsetBottom());// 3.2 让内容延伸至刘海区域// 3.3 刘海屏遮挡的区域下沉}}}
}

3.2 让内容延伸至刘海屏区域

/**
* public static final int LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT = 0; // 内容下移,非全屏模式不受影响
* public static final int LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES = 1;   // 允许内容延伸进入刘海区域
* public static final int LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER = 2; // 不允许内容进入刘海屏区域
*/
WindowManager.LayoutParams layoutParams = window.getAttributes();
layoutParams.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;

3.3 刘海屏遮挡的区域下挫/下沉

这里有两种方案,根容器设置padding or 修改刘海屏遮挡的空间的位置

  • 根布局设置padding 整体的内容区域下沉,此种情况,需要在根布局设置background
// 整体的内容区域(根容器)下沉,将背景图做为根容器背景
findViewById(R.id.root_layout).setPadding(
displayCutout.getSafeInsetLeft(),
displayCutout.getSafeInsetTop(),
displayCutout.getSafeInsetRight(),
displayCutout.getSafeInsetBottom());
  • 特定的控件设置padding or margin (设置距离顶部的距离)
View view = findViewById(R.id.cut_clickable_ll);
FrameLayout.LayoutParams cutLayoutParams = (FrameLayout.LayoutParams) view.getLayoutParams();
cutLayoutParams.topMargin = displayCutout.getSafeInsetTop();
view.setLayoutParams(cutLayoutParams);

小米vivo/oppo判断刘海屏并适配工具类Utils

Android刘海屏适配相关推荐

  1. Android 系统(70)---Android刘海屏适配方案

    Android刘海屏适配方案 什么是刘海屏 随着iPhone X发布,国内一些厂商也推出了刘海屏手机,即将发布的Android p也提供了对刘海屏的支持.so,我们的app也要提前做好适配. 屏幕的正 ...

  2. Android 刘海屏 适配

    Android 刘海屏 适配主要有三种方案 第一,LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT 模式 在该模式下,如果当前应用没有设置页面全屏显示,则显示逻辑,与正常情况 ...

  3. Android刘海屏适配精炼详解

    一.前期基础知识储备 话不多说,这么多刘海屏手机今年集中爆发,所以尽管刘海屏不好看,但是还是要适配. 2017年苹果X开启了刘海屏时代,2018年集中爆发,纷纷采取刘海屏这一策略来实现全面屏的概念(看 ...

  4. android刘海屏手机专业术语叫什么,Android刘海屏适配精炼详解

    一.前期基础知识储备 image 话不多说,这么多刘海屏手机今年集中爆发,所以尽管刘海屏不好看,但是还是要适配. 2017年苹果X开启了刘海屏时代,2018年集中爆发,纷纷采取刘海屏这一策略来实现全面 ...

  5. Android 刘海屏适配

    转载:原文链接 一.简介 随着 Apple 发布 iPhone X 之后,各大手机厂商也开始模仿这种刘海屏的设计,而且刘海屏手机的用户也是越来越大,前段时间将项目进行了所有主流厂商的刘海屏手机的适配, ...

  6. Android刘海屏适配全方案(华为、小米、Vivo、Oppo)

    前言 目前市面上的刘海屏和水滴屏手机越来越多了,颜值方面是因人而异,有的人觉得很好看,也有人觉得丑爆了,我个人觉得是还可以.但是作为移动开发者来说,这并不是一件好事,越来越多异形屏手机的出现意味着我们 ...

  7. 详解Android刘海屏适配

    Apple一直在引领设计的潮流,自从 iPhone X 发布之后,"刘海屏" 就一直存在争议,本以为是一个美丽的错误(Bug),却早就了一时间"刘海屏"的模仿潮 ...

  8. Android 刘海屏适配全攻略

    这里主要是介绍一下Android P中刘海屏的适配以及Android P之前的适配.为什么要分开呢?因为Android P之前官方还没提供API来进行适配,都是由各家厂商来提供适配方案的. 2.And ...

  9. android 刘海屏适配方法

    背景 自从iphone x发布后,各大厂商也发布了类似的刘海屏手机("顶部屏幕凹槽设计"),开发者应该如何适配呢? 原理 为什么会有刘海屏? 因为大家有自拍的需求,需要摄像头前置, ...

最新文章

  1. windows下使用lighttpd+php(fastcgi)+mysql
  2. redis 未授权访问利用 两种方式
  3. json支持utf-8_发票查重百科支持系统对接
  4. 敏捷宣言和企业Scrum作者Mike Beedle去世
  5. 2021年高考成绩查询湖北状元,2021年湖北高考状元多少分,今年湖北高考状元资料名单...
  6. bigdecimal如何做除法_公务员行测朴素逻辑解题技巧—代入排除法
  7. GitLab 服务器的迁移以及注意点
  8. 创建物化视图commit_oracle慎用基于on commit刷新物化视图的方式(一)
  9. 使你的MFC程序具有win7的透明立体风格
  10. 基于WPF+XMPP的IM程序开发日志 之二 WPF线程模型
  11. EntityFramework之DetectChanges's Secrets(三)(我为EF正名)
  12. 【node.js】报错Cannot mix different versions of joi schemas解决方法
  13. Accidental override: The following declarations have the same JVM signature (getWindow()Landroid/vie
  14. Fatal error: Call to undefined function ParCv() in E:\AppServ\www\include\dedesql.class.php on line
  15. 百度-还可以这样玩!
  16. [数读]从开户数看这一波牛市
  17. 深度剖析C语言结构体
  18. 动环监控系统的服务器部署在,动环监控系统【斯必得智慧机房】
  19. 【机器学习】聚类算法 kmeans
  20. 如何查看电脑最大支持多少GB内存

热门文章

  1. 运用java爬虫和python做词云图
  2. ACWing 908.最大不相交区间数量
  3. Java字节码,字节码指令
  4. 给你的数据加上杠杆:文本增强技术的研究进展及应用实践
  5. 快速实践大规模轻量级图片分类模型:飞桨识图 PP-ShiTu
  6. mysql 小球_c语言编程实例——小球跳动
  7. 图像Lanczos3滤波C实现——优化
  8. 关于webWorker的理解和简单例子
  9. jQuery是什么?和它的优缺点
  10. 第1090期AI100_机器学习日报(2017-09-12)