android - 在导航栏下方绘制叠加层
问题描述
如何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)
解决方案
弄清楚了。问题是我使用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
)
推荐阅读
- c# - Blazor 组件的模板页面
- cmake - 在 CMake 中一次编译和链接库
- python - 如何手动更改条件
- odata - odata 仅从扩展的子记录集中获取第一条记录?
- javascript - JavaScript:如何在继续执行之前等待相机访问?
- javascript - 为什么 React 中的 JavaScript 方法是未定义的?
- xamarin.forms - ipa 和 apk 包中缺少文件
- liquibase - liquibase:我可以通过引用先前的变更集 id 来回滚删除表吗?
- jarsigner - Jar 签名者:无法打开 jar 文件
- c++ - 埃拉托色尼筛。不确定如何准确实施