2.1.2 Android刘海屏适配
发布日期:2021-05-10 09:34:12 浏览次数:21 分类:精选文章

本文共 2289 字,大约阅读时间需要 7 分钟。

屏幕适配-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之前,国内厂商有各色各样的适配方案,详见各厂商官方文档。

华为:
小米:
Oppo:
Vivo:

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

上一篇:Android Retrofit2.0 上传单张图片和多张图片
下一篇:3.1.4_cardView原理解析

发表评论

最新留言

很好
[***.229.124.182]2025年04月04日 17时28分27秒