Нарисуйте наложение под панелью навигации

#android

#Android

Вопрос:

Как можно нарисовать наложение (типа TYPE_APPLICATION_OVERLAY ) под панелью навигации в Android?

Я пытаюсь покрыть весь экран полупрозрачным видом, который позволяет пользователям взаимодействовать с пользовательским интерфейсом под наложением, но панель навигации сохраняет свой цвет.

Строка состояния не была проблемой, поскольку я использовал следующий флаг — 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)
  

Ответ №1:

Понял это. Проблема заключалась в том, что я использовал MATCH_PARENT в качестве высоты, но высота должна быть больше этой.

Итак, теперь я вычисляю высоту экрана как таковую —

 val displayMetrics = DisplayMetrics()
windowManager.defaultDisplay.getMetrics(displayMetrics)
val height = displayMetrics.heightPixels
  

И добавьте к этому высоту системной панели навигации.
(Пожалуйста, обратите внимание, что следующий код будет работать в activity)

 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
)
  

Ответ №2:

Вы можете получить высоту дисплея, включая панель навигации, с помощью 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
    )