2.1.2 Android刘海屏适配

本文详细介绍了Android9.0及以后版本中刘海屏的适配策略,包括如何判断设备是否为刘海屏,如何让界面延伸进入刘海区域,以及如何设置控件避免被刘海遮挡。同时,提供了华为、小米、OPPO、VIVO等厂商的适配方案链接,并推荐了一款GitHub上的刘海屏适配工具。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

屏幕适配-Android9.0官方刘海屏适配策略

  • 如果非全屏模式(有状态栏),则app不受刘海屏的影响,刘海屏的高就是状态栏的高
  • 如果全屏模式,app位适配刘海屏,系统会对界面做特殊处理,竖屏向下移动,横屏向右移动

Google在Android9.0推出了刘海屏适配的方案,Android9.0以后,采用此方案即可。

全屏模式下,如何让界面延伸进刘海

判断手机是否是刘海屏

	private boolean hasDisplayCutout(Window window) {
		   DisplayCutout displayCutout;
		   View rootView = window.getDecorView();
		   WindowInsets insets = rootView.getRootWindowInsets();
		   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P && insets != null){
		       displayCutout = insets.getDisplayCutout();
		       if (displayCutout != null){
		           if (displayCutout.getBoundingRects() != null && displayCutout.getBoundingRects().size() > 0 && displayCutout.getSafeInsetTop() > 0){
		               return true;
		           }
		       }
		   }
		   return false; //模拟器,这里设置成true
	}

让内容区域延伸进刘海

WindowManager.LayoutParams params = window.getAttributes();
/**
 *  * @see #LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT 全屏模式,内容下移,非全屏不受影响
 *  * @see #LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES 允许内容去延伸进刘海区
 *  * @see #LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER 不允许内容延伸进刘海区
 */
params.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
window.setAttributes(params);

设置成沉浸式

int flags = View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
int visibility = window.getDecorView().getSystemUiVisibility();
visibility |= flags; //追加沉浸式设置
window.getDecorView().setSystemUiVisibility(visibility);  

设置控件是否避开刘海区域,避免Button等控件被刘海屏遮盖
在这里插入图片描述

//通常情况下,刘海的高就是状态栏的高
public int heightForDisplayCutout(){
    int resID = getResources().getIdentifier("status_bar_height", "dimen", "android");
    if (resID > 0){
        return getResources().getDimensionPixelSize(resID);
    }
    return 96;
}  

可以设置Button等空间的Margin

Button button = findViewById(R.id.button);
RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) button.getLayoutParams();
layoutParams.topMargin = heightForDisplayCutout();
button.setLayoutParams(layoutParams);  

也可以设置界面的Padding

RelativeLayout layout = findViewById(R.id.container);
    layout.setPadding(layout.getPaddingLeft(), heightForDisplayCutout(), layout.getPaddingRight(), layout.getPaddingBottom());   

屏幕适配 - 刘海屏适配 - 其他手机厂商(华为,小米,oppo,vivo)适配

对于Android9.0之前,国内厂商有各色各样的适配方案,详见各厂商官方文档。
华为:https://developer.huawei.com/consumer/cn/devservice/doc/50114
小米:https://dev.mi.com/console/doc/detail?pId=1293
Oppo:https://open.oppomobile.com/service/message/detail?id=61876
Vivo:https://dev.vivo.com.cn/documentCenter/doc/103

GitHub上已封装好的刘海屏适配方案

https://github.com/zhangzhun132/NotchTools

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

氦客

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值