美文网首页
屏幕适配【刘海屏适配】

屏幕适配【刘海屏适配】

作者: 瑜小贤 | 来源:发表于2019-10-14 19:02 被阅读0次

Android官方9.0刘海屏适配策略

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

全屏情况下的适配,例:全屏展示图片

public class DisplayCutoutActivity extends Activity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //1.设置全屏
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        Window window = getWindow();
        window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

        //2.判断手机是否为刘海屏
        boolean hasDisolayCutout = hasDisplayCutout(window);
        if(hasDisolayCutout){
            //3.让内容区域延伸进刘海
            WindowManager.LayoutParams params = window.getAttributes();
            /**
             * 刘海屏三种展示模式
             * LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT 全屏模式下内容区下移,非全屏不受影响
             * LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES 允许内容区延伸进刘海区
             * LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER 不允许内容延伸进刘海区,无论是否为全屏模式
             */
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
                params.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
            }
            window.setAttributes(params);

            //4.设置成沉浸式
            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);
        }

        setContentView(R.layout.activity_immersive);
    }

    private boolean hasDisplayCutout(Window window){
        DisplayCutout displayCutout;
        View rootView = window.getDecorView();
        WindowInsets insets = null;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            insets = rootView.getRootWindowInsets(); //窗口下挫
        }
        if(insets != null){
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P ) {
                displayCutout = insets.getDisplayCutout();
                if(displayCutout != null){
                    if(displayCutout.getBoundingRects() != null &&
                            displayCutout.getBoundingRects().size() > 0 &&
                            displayCutout.getSafeInsetTop() > 0){ //留海的高度
                        return true;
                    }
                }
            }
        }
        return false;
    }
}

如果不是全屏展示图片,而是在顶部展示一个TextView或者Button之类的,可以通过getStatusBarHeight获取状态栏高度来对控件进行一个marginTop设置,因为通常情况下 状态栏的高度 >= 刘海的高度,所以以状态栏高度设置大概率不会出问题。

关于第三方ROM(华为 小米 oppo vivo)

  1. 判断手机厂商
  2. 判断手机是否有刘海
  3. 设置是否让内容区域延伸入刘海
  4. 设置控件是否避开刘海区域
  5. 获取刘海高度(displayCutout.getSafeInsetTop() 或 状态栏高度)

相关文章

  • 安卓适配

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

  • 屏幕适配-刘海屏适配

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

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

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

  • SafeArea widget

    SafeArea widget是适配手机屏幕---刘海屏,底部虚拟按钮等.

  • 屏幕适配(四)——刘海屏适配

    1、判断是否有刘海 通过WindowInsets的getDisplayCutout方法获取到DisplayCuto...

  • Android 屏幕适配—刘海屏适配

    1、Google官方适配方案 非全屏模式下,刘海屏的高度等于状态栏的高度,此时我们不需要适配刘海屏, 全屏模式下,...

  • Android 屏幕适配-刘海屏适配

    承接Android 屏幕适配 说明:本文仅为简单总结google官方的刘海平适配方案如需具体机型适配,请自行移步g...

  • 刘海屏的适配

    一、适配策略 非全屏状态下不需要适配刘海屏,刘海只占据 toolbar 的位置。 全屏时需要适配刘海屏 二、使用系...

  • 屏幕适配 | Android 刘海屏适配总结

    一、简介 随着 Apple 发布 iPhone X 之后,各大手机厂商也开始模仿这种刘海屏的设计,而且刘海屏手机的...

  • Android 屏幕适配之bug 刘海屏、水滴屏

    对刘海屏、水滴屏做适配前,先在此给出一个基本概念:何谓刘海屏?何谓水滴屏? 上述两种屏幕都可以统称为刘海屏,不过对...

网友评论

      本文标题:屏幕适配【刘海屏适配】

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