步骤: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;//默认高度 } }
android 9.0刘海屏适配
最新推荐文章于 2021-05-25 21:09:29 发布