#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
)