android 9.0刘海屏适配

步骤:1判断手机厂商, 2 判断手机是否有刘海 3.设置是否让内容区域延伸进刘海 4.设置控件是否避开刘海区域 5.获取刘海的高度

package com.example.screenadaptation;

import android.annotation.TargetApi;
import android.os.Build;
import android.support.annotation.RequiresApi;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.DisplayCutout;
import android.view.View;
import android.view.Window;
import android.view.WindowInsets;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.RelativeLayout;

public class MainActivity extends AppCompatActivity {


    @RequiresApi(api = Build.VERSION_CODES.M)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        //1.设置全屏   。如果设置了全屏,如果是刘海屏的就要做刘海屏的适配。 如果不是全屏就不用做刘海屏的适配。
        Window window = getWindow();
        window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);

        //1判断手机厂商, 2 判断手机是否有刘海 3.设置是否让内容区域延伸进刘海  4.设置控件是否避开刘海区域 5.获取刘海的高度
        //判断手机是否刘海屏
        boolean hasDisplayCutout = hasDisplayCutout(window);
        if (hasDisplayCutout) {
            //2.让内容区域延伸进刘海
            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 systemUiVisibility = window.getDecorView().getSystemUiVisibility();
            systemUiVisibility |= flags;
            window.getDecorView().setSystemUiVisibility(systemUiVisibility);
        }

        setContentView(R.layout.activity_main);
        //被刘海遮挡住的控件下移。
        Button button = findViewById(R.id.button);
        RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) button.getLayoutParams();
        params.topMargin = heightForDisplayCutout();//把button 下移
        button.setLayoutParams(params);

    }

    //判断手机是否刘海屏
    @TargetApi(Build.VERSION_CODES.P)
    @RequiresApi(api = Build.VERSION_CODES.M)
    private boolean hasDisplayCutout(Window window) {
        DisplayCutout displayCutout; //处理刘海屏的类
        View rootView = window.getDecorView();
        WindowInsets insets = rootView.getRootWindowInsets();
        if (insets != null) {
            displayCutout = insets.getDisplayCutout();
            if (displayCutout != null) {
                //displayCutout.getBoundingRects() 获取有几个刘海。 如果个数大于0 证明有刘海。 如果刘海的高度大于0
                if (displayCutout.getBoundingRects() != null
                        && displayCutout.getBoundingRects().size() > 0
                        && displayCutout.getSafeInsetTop() > 0) { //刘海的高度一般和状态栏的高度一样
                    return true;
                }
            }
        }
        return true;
    }

    //获取刘海屏高度 。  用于被刘海遮住的控件下移操作。
    private int heightForDisplayCutout() {
        int resId = getResources().getIdentifier("status_bar_height", "dimen", "android");
        if (resId > 0) {
            return getResources().getDimensionPixelSize(resId);
        }
        return 96;//默认高度
    }

}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值