美文网首页
Android刘海屏适配

Android刘海屏适配

作者: 张小凡凡 | 来源:发表于2019-05-12 21:08 被阅读0次

Android 刘海屏 适配主要有三种方案

第一,LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT 模式

在该模式下,如果当前应用没有设置页面全屏显示,则显示逻辑,与正常情况一样

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_notch);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
            Window window = getWindow();
            WindowManager.LayoutParams params = window.getAttributes();
            params.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT;
            window.setAttributes(params);
        }
    }
5.png

如果当前应用已设置页面全屏显示,则整个内容区域下移,下移高度为 刘海的高度

@Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

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

        setContentView(R.layout.activity_notch);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
            WindowManager.LayoutParams params = window.getAttributes();
            params.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT;
            window.setAttributes(params);
        }
    }
2.png
第二,LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER模式

在该模式下,内容不会延伸到刘海区

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_notch);
        
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
            Window window = getWindow();
            WindowManager.LayoutParams params = window.getAttributes();
            params.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER;
            window.setAttributes(params);
        }
    }
4.png
第三,LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES模式

在该模式下,允许内容延伸进刘海区

  @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_notch);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
            Window window = getWindow();
            WindowManager.LayoutParams params = window.getAttributes();
            params.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
            window.setAttributes(params);
        }
    }
5.png

图中顶部为默认状态栏的颜色,这时候需要将页面设置沉浸式,从而让用户内容充满屏幕

  @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_notch);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
            Window window = getWindow();
            WindowManager.LayoutParams params = window.getAttributes();
            params.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
            window.setAttributes(params);
        }

        ImmersionUtil.setImmersive(this);
    }
/**
     * 设置Activit沉浸式
     */
    public static void setImmersive(Activity activity) {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT || activity == null) {
            //Android4.4 以前不支持 沉浸式
            return;
        }

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            Window window = activity.getWindow();
            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);

            //设置状态栏颜色透明
            window.setStatusBarColor(Color.TRANSPARENT);

            int visibility = window.getDecorView().getSystemUiVisibility();
            //布局内容全屏展示
            visibility |= View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
            //隐藏虚拟导航栏
            visibility |= View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
            //防止内容区域大小发生变化
            visibility |= View.SYSTEM_UI_FLAG_LAYOUT_STABLE;

            window.getDecorView().setSystemUiVisibility(visibility);

        } else {
            //Android 5.0以前
            Window window = activity.getWindow();
            window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
        }
    }
6.png

在具体页面显示上,需要动态获取刘海屏的高度进行设置,一般情况下,刘海的高度 就是状态栏的高度

 /**
     * 获取状态栏高度
     */
    public static int getStatusBarHeight(Context context) {
        int resId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
        if (resId > 0) {
            return context.getResources().getDimensionPixelSize(resId);
        }
        return 0;
    }

但是在华为手机上,华为官方文档提供了获取刘海高度的方法

    /**
     * 获取华为刘海尺寸:width、height,int[0]值为刘海宽度 int[1]值为刘海高度。
     */
    @SuppressWarnings("unchecked")
    private static int[] getNotchSizeAtHuaWei(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");
        }
        return ret;
    }
7.png

注:Android 刘海屏 适配使用的是 Andorid 9.0后,谷歌官方提供的api,不排除 国内个别厂商 没有遵循 谷歌规范,从而导致 适配失败的情况。
(附上:个别厂商开发文档地址)

相关文章

  • 安卓适配

    ------刘海屏------屏幕适配 | Android 刘海屏适配总结Android刘海屏适配方案Androi...

  • 屏幕适配-刘海屏适配

    Android官方9.0刘海屏适配策略 1.如果非全屏模式(有状态栏),则app不受刘海屏影响,刘海屏的高度就是状...

  • 屏幕适配【刘海屏适配】

    Android官方9.0刘海屏适配策略 如果非全屏(有状态栏),则app不受刘海屏的影响,刘海屏的高就是状态栏的高...

  • 记录工作中的点点滴滴之Dialog全屏显示适配刘海屏

    Android中的Dialog适配刘海屏全屏显示: Dialog mdialog =new Dialog(mAct...

  • Android刘海屏适配

    刘海屏幕的适配,在全面屏设置下,顶部有刘海的区域,有的会导致刘海把标题栏等内容遮盖如下图,这是美团的统一版本在小米...

  • Android刘海屏适配

    背景 刘海屏指的是手机屏幕正上方由于追求极致边框而采用的一种手机解决方案。因形似刘海儿而得名。也有一些其他叫法:挖...

  • Android刘海屏适配

    背景:公司采购小米8SE后,专门用来做刘海屏的适配测试。本文主要针对小米手机做了适配,华为或其他机型没有在真机上测...

  • Android刘海屏适配

    Android 刘海屏 适配主要有三种方案 第一,LAYOUT_IN_DISPLAY_CUTOUT_MODE_DE...

  • Android刘海屏适配

    1. 前言 在我们进行APP开发时,屏幕适配是一件很头疼的事,而Android又相对iOS的较为混杂,各种各样厂商...

  • Android适配之版本适配

    这篇文章用来记录学习和开发时遇到的版本适配问题,持续更新 全面屏、刘海屏的适配:Android 9 支持最新的全面...

网友评论

      本文标题:Android刘海屏适配

      本文链接:https://www.haomeiwen.com/subject/msrhaqtx.html