Android刘海屏适配

Android 检测手机是否是异形屏,刘海屏,水滴屏,挖孔屏 直接上工具类,复制使用即可: public class NotchUtil { private static final String SP_NAME = "MY_NOTCH_SP";//保存异形屏Name private static final String KEY_IS_NOTCH_SCREEN = "KEY_IS_NOTCH_SCREEN";//是否是异形屏KEY /** * 保存当前手机是否是异形屏 * * @param isNotchS 阅读详情

如何适配刘海屏

由于Android p正式版前两天才发布, 当前市面上的Android 刘海屏手机还不能用Android 官方提供的方案来解决,那怎么办呢?还好几个厂商自己给出了适配方案(文末会接受使用Android P来适配刘海屏)。

华为P20

华为早在iPhone X发布后不久就推出了“刘海屏”P20,华为刘海屏适配官方文档: 
https://devcenter-test.huawei.com/consumer/cn/devservice/doc/50114

华为给出的文档最为详细适配文档,P20 pro预装系统对未做刘海屏适配处理的app有一定处理,处理的逻辑如下图。

 

                                          这里写图片描述

右上图可知,华为系统做偏移处理的有以下2种情况: 
1.未设置meta-data值,页面横屏状态 
2.未设置meta-data值,页面竖屏状态,不显示状态栏

适配刘海屏主要有以下几个步骤: 
1.配置meta-data 
华为新增的Meta-data属性android.notch_support在应用的AndroidManifest.xml中增加meta-data属性,此属性不仅可以针对Application生效,也可以对Activity配置生效,具体方式如下所示:

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

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

这里写图片描述

② 对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", "hasNotchInScreen ClassNotFoundException");
   } catch (NoSuchMethodException e) {
       Log.e("test", "hasNotchInScreen NoSuchMethodException");
   } catch (Exception e) {
       Log.e("test", "hasNotchInScreen Exception");
   } finally {
       return ret;
   }
}

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;
   }
}

4. UI适配 
通过增加上面适配方案提到的配置(meta-data或者是Flag),应用在华为刘海屏手机上就能够默认使用刘海区显示了,但是为了避免出现UI被刘海区遮挡的问题,还是需要应用自己做一些额外的UI适配工作: 
(1)判断是否刘海屏,通过华为刘海屏SDK的API判断,具体参考3.2.1章节 
(2)如果是刘海屏手机需要应用自己调整布局避开刘海区,布局原则:保证重要的文字、图片和视频信息、可点击的控件和图标还有应用弹窗等等布局建议显示在状态栏区域以下(安全区域);不重要,遮挡不会出现问题的布局可以延伸到状态栏区域(危险区域)显示,按照这种布局原则修改,可以一次修改就能适配所有的刘海屏手机:

            这里写图片描述

获取系统状态栏高度接口:

public static int getStatusBarHeight(Context context) {
    int result = 0;
    int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
    if (resourceId > 0) {
        result = context.getResources().getDimensionPixelSize(resourceId);
    }
    return result;
}

关于更详细的适配资料,可以访问华为刘海屏适配技术文档。

vivo & OPPO

vivo 和 OPPO官网仅仅给出了适配指导,没有给出具体方案,简单总结为: 
如有是具有刘海屏的手机,竖屏显示状态栏,横屏不要在危险区显示重要信息或者设置点击事件。官方的文档地址如下:
oppo官方文档: 
https://open.oppomobile.com/service/message/detail?id=61876 
vivo官方文档: 
https://dev.vivo.com.cn/doc/document/info?id=103

首先,判断是不是刘海屏手机。 
OPPO判断方法:

public static boolean hasNotchInOppo(Context context){
   return context.getPackageManager().hasSystemFeature("com.oppo.feature.screen.heteromorphism");
}

vivo的判断方法:

public static final int NOTCH_IN_SCREEN_VOIO=0x00000020;//是否有凹槽
public static final int ROUNDED_IN_SCREEN_VOIO=0x00000008;//是否有圆角
public static boolean hasNotchInScreenAtVoio(Context context){
   boolean ret = false;
   try {
       ClassLoader cl = context.getClassLoader();
       Class FtFeature = cl.loadClass("com.util.FtFeature");
       Method get = FtFeature.getMethod("isFeatureSupport",int.class);
       ret = (boolean) get.invoke(FtFeature,NOTCH_IN_SCREEN_VOIO);

   } catch (ClassNotFoundException e)
   { Log.e("test", "hasNotchInScreen ClassNotFoundException"); }
   catch (NoSuchMethodException e)
   { Log.e("test", "hasNotchInScreen NoSuchMethodException"); }
   catch (Exception e)
   { Log.e("test", "hasNotchInScreen Exception"); }
   finally
   { return ret; }
}

然后在进行适配,官方这方面的资料很少也不是很详细

google官方

google从Android P开始为刘海屏提供支持,目前提供了一个类和三种模式: 
一个类指的是可以用DisplayCutout这个类找出刘海(cutout)的位置和形状,调用getDisplayCutout()这个方法可以获取刘海(cutout)的位置和区域。例如:

DisplayCutout cutout = mContext.getDisplayCutout();

Google官方提供了三种模式,分别是:

  • LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT:仅仅当系统提供的bar完全包含了刘海区时才允许window扩展到刘海区,否则window不会和刘海区重叠
  • LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES:允许window扩展到刘海区(原文说的是短边的刘海区, 目前有刘海的手机都在短边,所以就不纠结了)
  • LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER:不允许window扩展到刘海区。

例如,下面是可以设置是否允许window扩展到刘海区的代码。

WindowManager.LayoutParams lp =getWindow().getAttributes();  
lp.layoutInDisplayCutoutMode
=WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER;  
getWindow().setAttributes(lp);

一个有状态栏的页面, 我们可以这样适配:

DisplayCutout cutout = getDisplayCutout();
if(cutout != null){
 WindowManager.LayoutParams lp =getWindow().getAttributes();  
 lp.layoutInDisplayCutoutMode=WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER;  
 getWindow().setAttributes(lp);
}

当然如果你身边还没有刘海屏手机,可以使用Android P提供的模拟器,更新SDK到Android P preview版本。

                                这里写图片描述

然后,可以通过开发者选项里的 “Simulate a display with a cutout”,开启刘海屏的支持,并且刘海屏有多个版本,需要注意它们的区别。

                                  这里写图片描述

原文来源:https://blog.youkuaiyun.com/xiangzhihong8/article/details/80317682

Android刘海屏适配方案 1 什么是刘海屏 屏幕的正上方居中位置(下图黑色区域)会被挖掉一个孔,屏幕被挖掉的区域无法正常显示内容,这种类型的屏幕就是刘海屏,也有其他叫法:挖孔屏、凹凸屏等等,这里统一按刘海屏命名。   现在市场上的情况来说,“刘海屏”主要分成两类,一类是标准的 Android P Api,另外一类就是厂商在 Android P 以下的系统,做的特殊适配。 2 刘海屏适配方案 2.1 需要适配刘海屏的页面 (... 阅读详情

相关推荐

Android刘海屏、水滴屏全面屏最佳适配方案

使用起来很简单:// 支持显示到刘海区域// 获取刘海屏信息@Override});获取刘海区域信息后就可以根据自己应用的需要,来避开重要的控件。详情可参考我项目中的代码。我将适配方案整理后,封装成了一个库并上传至github,可参考使用先自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

2401_83817916的博客 1474

Android 适配方案总结

前言 目前市面上的刘海屏和水滴屏手机越来越多了,颜值方面是因人而异,有的人觉得很好看,也有人觉得丑爆了,我个人觉得是还可以。但是作为移动开发者来说,这并不是一件好事,越来越多异形屏手机的出现意味着我们需要投入大量精力在适配上(就不提之后会出的折叠屏手机了)。本文总结了当下主流手机的刘海屏适配方案,鉴于目前Android碎片化的情况,想要覆盖所有的机型是不可能的,但是能适配一些是一些,总比什么都不做要好。 所谓刘海屏,指的是手机屏幕正上方由于追求极致边框而采用的一种手机解决方案。因形似刘海儿而得名——来.

Zyt 2342

Android 刘海屏适配全攻略

Android 刘海屏适配全攻略 0.版权声明 本文由玉刚说写作平台提供写作赞助,版权归玉刚说微信公众号所有 原作者:四月葡萄 版权声明:未经玉刚说许可,不得以任何形式转载 1.前言 先吐槽一下,刘海屏真丑。然而作为苦逼的开发者,还是要去适配刘海屏的。好了,吐槽完毕,进入正题。 这里主要是介绍一下Android P中刘海屏的适配以及Android P之前的适配。为什么要分开呢...

四月葡萄的博客 1万+

Android 刘海屏适配方案---NotchTools,适配国内四大厂商(华为、小米、oppo、vivo)刘海屏手机,根据自己业务需求,提供多种接入方式适配刘海屏

NotchTools 项目地址:zhangzhun132/NotchTools 简介: ????????Android 刘海屏适配方案---NotchTools,适配国内四大厂商(华为、小米、oppo、vivo)刘海屏手机,根据自己业务需求,提供多种接入方式适配刘海屏。 更多:作者提 Bug官网 标签: 刘海屏指的是手机屏幕上方由于追求极致边框而采用的方案,表现为在顶部...

未来很长,但我会努力的走下去。 1829

Android 8.0刘海屏适配

由于刘海屏设备上市时运行的是 Android O 设备,而 Android O 没有标准接口来适配刘海屏设备,因此各大厂商针对Android O刘海屏适配方案也各有差异,具体如下: 华为刘海屏手机安卓O版本适配指导 小米刘海屏 Android O 适配 OPPO凹形屏适配说明 VIVO全面屏应用适配指南 后来 Android P 中新增了刘海屏适配的API,因此开发者需要针对 An...

你只是看起很努力 7210

Android、iPhone手机刘海屏适配判断

Android刘海屏适配判断 import android.app.Activity; import android.os.Build; import android.text.TextUtils; import android.view.DisplayCutout; import java.lang.reflect.Method; /** * * @brief: Notch Tools ...

7-SEVENS 1112

安卓适配刘海屏手机

在安卓开发中,我们除了需要适配不同手机的手机分辨率外,还需要适配手机上的虚拟状态栏和导航栏的高度,这其中又不乏有一些手机的手机屏幕格外的与众不同,比如今天我们需要了解的“刘海屏”。什么是“刘海屏”?屏幕的正上方居中位置(下图黑色区域)会被挖掉一个孔,屏幕被挖掉的区域无法正常显示内容,这种类型的屏幕就是刘海屏,也有其他叫法:挖孔屏、凹凸屏等等,这里统一按刘海屏命名。 目前网上也有很多适配安卓手机“刘...

阿甘正传 838

详解Android刘海屏适配

Apple一直在引领设计的潮流,自从 iPhone X 发布之后,”刘海屏” 就一直存在争议,本以为是一个美丽的错误(Bug),却早就了一时间“刘海屏”的模仿潮。目前,国内已经推出的刘海屏”手机有 OPPO R15 和 华为 P20,并且Google也在IO大会上提高了相应的适配方案。 什么是刘海屏 屏幕的正上方居中位置(下图黑色区域)会被挖掉一个孔,屏幕被挖掉的区域无法正常显示内容,这种...

xiangzhihong8的专栏 4万+

android刘海屏之终极适配

前言:作为安卓开发,也得承认苹果设计一直在引领潮流,所以自从 iPhone X 发布之后,”刘海屏” 就一直被热议,作为我自己必须先吐槽一下,真没觉得刘海屏好看。但是作为苦逼的开发者,还是要必须去适配刘海屏的,自然而然的在吐槽完毕以后还是有了这篇文章的诞生。 那么什么是刘海屏呢? 在手机屏幕的正上方居中位置(下图黑色区域)会被挖掉一个孔,屏幕被挖掉的区域无法正常显示内容,这种类型的屏幕就是刘海...

蒙的博客 1万+

Vivado工程备份实战:两种方法快速迁移Block Design(附路径避坑指南)

本文详细介绍了Vivado工程中Block Design(BD)备份与迁移的两种核心方法:文件夹直接复制法与TCL脚本生成法。针对FPGA工程师在项目迁移或团队协作时常见的IP丢失、路径报错等问题,提供了从原理到实战的操作指南与路径避坑策略,确保设计可复现与高效协作。

pz890123的博客 1310

利用Skipper跨层追踪技术高效定位LVS Short问题

本文详细介绍了如何利用Skipper跨层追踪技术高效定位LVS Short问题。通过解析Skipper的跨层trace net原理和实战操作步骤,帮助芯片设计工程师快速识别版图中的短路问题,显著提升验证效率。文章还提供了处理大规模设计的高级技巧和常见问题排查方法。

weixin_29239661的博客 509

Unity快速适配IOS/安卓刘海屏(又简单又快 适配了O版本和P版本)

刘海屏适配,其实就是知道刘海高度(横屏游戏),来对ui进行偏移 所以刘海屏适配的关键是获取刘海高度 获取刘海高度有两种方案 1.大数据,收集各种型号对应的刘海数据,听说腾讯有些项目这么搞 2.代码获取,热门机型获取刘海数据,小众机型不是android p可能无法适配 这次我介绍的是代码获取刘海数据 NotchFit是一款Android端的刘海屏适配库,适配了O版本和P版本...

SnoopyNa2Co3的博客 1万+

STM32 IAP跳转后APP卡死?别慌,手把手教你修复HAL_RCC_OscConfig时钟配置冲突

本文深入分析了STM32 IAP跳转后APP在HAL_RCC_OscConfig函数中卡死的问题,揭示了PLL时钟配置冲突的根本原因。通过详细的代码示例和分步解决方案,指导开发者正确处理STM32F1/F4系列的时钟系统二次初始化问题,确保IAP+APP架构的稳定运行。

weixin_28685287的博客 365

Android 刘海屏适配总结

code小生,一个专注Android领域的技术平台作者:developerHaoz地址:https://www.jianshu.com/p/8d723f223aae声明:...

code小生 3458

电商产品组合策略:引流品与利润品的实战方法论

在电商运营中,产品组合策略是提升流量转化与利润增长的核心技术。其基本原理是通过数据化选品构建产品矩阵,利用引流品吸引用户流量,再通过利润品实现商业变现。这种策略不仅能优化广告投放的ROAS(广告投入产出比),还能显著提升客单价。技术实现上需要结合Google Analytics等工具进行归因分析,并运用动态库存管理模型控制风险。该方案特别适用于Amazon、Shopify等电商平台,能有效解决跨境电商业内流量获取与利润创造的平衡难题。通过实战案例可见,合理的产品组合可使客单价提升30-50%,是电商运营必备

weixin_42522009的博客 350

卡方检验的隐藏逻辑:为什么正态分布的平方和如此重要?

本文深入探讨了卡方检验的核心逻辑,揭示了正态分布平方和在统计检验中的重要性。通过分析卡方分布与伽马分布的关系,以及实际应用案例,帮助读者理解卡方检验的原理、局限及高级应用场景,为数据分析提供有力工具。

3a9bq4r8t2y的博客 208

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

在 Android 7.0(API 级别 24)或更高版本的应用,android:resizeableActivity属性默认为true(对应适配方式1)。这个属性是控制多窗口显示的,决定当前的应用或者Activity是否支持多窗口。可以在清单的或节点中设置该属性,启用或禁用多窗口显示,配置如下:如果该属性设置为 true,Activity 将能以分屏和自由形状模式启动。如果此属性设置为 false,Activity 将不支持多窗口模式。

2401_89190715的博客 2569

pt100和max31865测室温跳变比较大,会从23.04跳到23.47,23.75反复跳变超过了0.5的误差范围,在VDD和GND之间加上0.1和10的滤波电容也不行,如何解决?

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 2087

安卓刘海屏适配

1.允许全屏界面内容显示到刘海区域配置: <!--允许绘制到oppo、vivo刘海屏机型的刘海区域--> <meta-data android:name="android.max_aspect" android:value="2.2"/> <!--允许绘制到华为刘海屏机型的刘海区域--> <meta-data andro...

点滴之路的博客 1272

基于YOLOv5s的RK3588多线程部署16FPS暴涨到120FPS 轻量化深度学习部署实战教程(包括性能优化与加速)37

本文介绍了如何在RK3588平台上利用线程池优化YOLOv5模型的推理性能。RK3588内置3个NPU核心,支持多核并行处理。作者设计了一个线程池架构:1个线程负责数据读取,10个线程处理NPU运算,1个线程输出结果。该架构包含任务队列、线程管理和工作线程三个核心组件,通过合理设置线程数、任务队列大小等参数确保性能稳定。文章提供了详细的C++实现代码,包括线程池初始化、任务提交、结果获取等功能模块,并讨论了多线程同步和内存管理的关键技术要点。该方案可显著提升深度学习模型在嵌入式设备上的部署效率。

FJN110的博客 9230

微信小程序 - 强力解决播放视频卡顿问题,小程序使用video组件播放视频或第三方视频插件,会出现卡顿或者无法播放的各种奇怪问题(微信小程序苹果ios/安卓播放视频很卡不流畅、视频太长或文件大等情况)

微信小程序视频组件播放卡顿,微信小程序video组件出现无法播放或卡顿,微信小程序video组件播放时会出现卡顿,微信小程序使用video组件播放视频的时候,会出现卡顿或者无法播放的问题,微信小程序安卓视频播放卡顿问题,微信小程序苹果ios手机播放视频不流畅很卡,加cdn还是卡,uniapp播放视频会有明显的卡顿问题,video视频时卡顿不流畅问题,为什么video组件播放视频卡顿?苹果微信小程序通过video组件播放视频时卡顿,怎么解决?微信小程序video组件出现无法播放或卡顿,设置custom-cac

🏆 前端领域优质创作者 1万+

Android刘海屏适配全方案

目前市面上的刘海屏和水滴屏手机越来越多了,颜值方面是因人而异,有的人觉得很好看,也有人觉得丑爆了,我个人觉得是还可以。但是作为移动开发者来说,这并不是一件好事,越来越多异形屏手机的出现意味着我们需要投入大量精力在适配上(就不提之后会出的折叠屏手机了)。本文总结了当下主流手机的刘海屏适配方案,鉴于目前Android碎片化的情况,想要覆盖所有的机型是不可能的,但是能适配一些是一些,总比什么都不做要好。所谓刘海屏,指的是手机屏幕正上方由于追求极致边框而采用的一种手机解决方案。

悠然的博客 2877

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

android刘海屏高度适配,Android刘海屏的适配

这里主要是介绍一下Android P中刘海屏的适配以及Android P之前的适配。为什么要分开呢?因为Android P之前官方还没提供API来进行适配,都是由各家厂商来提供适配方案的。1、Android P的适配1.1、 DisplayCutout类我们可以通过这个类来确定非功能区域的位置和形状,这些区域不应该展示内容。 要确定这些凹口屏幕区域是否存在及其位置,请使用 getDisplayCu...

weixin_33393017的博客 879

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Android刘海屏全面屏底部导航栏的适配

关于Android状态栏和虚拟导航栏的适配,文章:https://blog.csdn.net/leogentleman/article/details/54566319讲的很不错。 状态栏的适配: 在activity里设置了 View decorView = getWindow().getDecorView(); int uiOptions = View.SYSTEM_UI_FLAG_HIDE_N...

qq_39619464的博客 3532
上一篇: 多线程下载文件(支持暂停、取消、断点续传)----添加监听
下一篇: 233.百分比布局(PercentFrameLayout和PercentRelativeLayout)
augfun
博客等级 码龄10年 311粉丝 662原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值