首页 > 解决方案 > 在导航栏下方绘制叠加层

问题描述

如何TYPE_APPLICATION_OVERLAY在 Android 的导航栏下方绘制叠加层(类型)?

我试图用半透明视图覆盖整个屏幕,允许用户与覆盖层下方的 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)

标签: android

解决方案


弄清楚了。问题是我使用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
)

推荐阅读