如何在Android的导航栏下方绘制(类型TYPE_APPLICATION_OVERLAY
)的覆盖层?
我试图用半透明的视图覆盖整个屏幕,该视图允许用户与覆盖层下方的UI进行交互,但是导航栏保留了其颜色。
状态栏不是问题,因为我使用了以下标志-WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS
我正在尝试使用以下代码 -
来实现上述overlay.setBackgroundResource(R.color.colorOverlayGray)
overlay.fitsSystemWindows = false
val layoutFlag = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY
} else {
WindowManager.LayoutParams.TYPE_PHONE
}
val params = WindowManager.LayoutParams(
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.MATCH_PARENT,
layoutFlag,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or
WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS or
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN or
WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE or
WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS,
PixelFormat.TRANSLUCENT
)
params.gravity = Gravity.START or Gravity.TOP
windowManager.addView(overlay, params)
弄清楚了。问题是我将MATCH_PARENT
用作高度,但是高度需要大于此。
所以现在我正在计算屏幕的高度 -
val displayMetrics = DisplayMetrics()
windowManager.defaultDisplay.getMetrics(displayMetrics)
val height = displayMetrics.heightPixels
并将系统导航栏的高度添加到其中。(请注意,以下代码将在活动中起作用)
var navBarHeight = 0
window.decorView.setOnApplyWindowInsetsListener { view, insets ->
navBarHeight = insets.systemWindowInsetBottom
view.onApplyWindowInsets(insets)
}
现在将LayoutParams
设置为这样 -
val params = WindowManager.LayoutParams(
WindowManager.LayoutParams.MATCH_PARENT,
height + navBarHeight,
WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or
WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS or
WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE or
WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS,
PixelFormat.TRANSLUCENT
)
您可以使用getRealMetrics()
:
val displayMetrics = DisplayMetrics()
windowManager.defaultDisplay.getRealMetrics(displayMetrics)
val overlayHeight = displayMetrics.heightPixels
val overlayWidth = displayMetrics.widthPixels
然后创建窗口参数:
params = WindowManager.LayoutParams(
overlayWidth,
overlayHeight,
WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
OVERLAY_FLAGS,
PixelFormat.TRANSLUCENT
)