获得“缺口”的高度,因此内容不会被截断

时间:2018-11-19 00:36:49

标签: android

如何获取最近的android手机的陷波高度,最好以像素为单位?

我有一个实现,其中图像必须全屏显示在顶部。

在最近发布的电话上添加了一个标记后,该图像将被该标记剪切掉。我的想法是获取缺口高度并在其上方动态添加边距以适应不同的缺口尺寸。

任何帮助或其他方式将不胜感激,在此先感谢您!

2 个答案:

答案 0 :(得分:2)

获取切口的高度(以像素为单位)的最简单方法是覆盖视图的onAttachedToWindow()功能。将视图附加到窗口是rootWindowInsets非空的主要要求。请注意,检查SDK版本是安全的,因为自Android Pie以来已开始完全支持cutout。

override fun onAttachedToWindow() {
     super.onAttachedToWindow()
     layoutParams = LayoutParams(MATCH_PARENT, WRAP_CONTENT).apply {
           topMargin = 
               if (SDK_INT >= Build.VERSION_CODES.P) rootWindowInsets?.displayCutout?.safeInsetTop ?: 0 
               else 0 
     }

}

如果您的视图不是CustomView,则应添加OnAttachStateChangeListener

imageView.addOnAttachStateChangeListener(object : View.OnAttachStateChangeListener {
     override fun onViewDetachedFromWindow(v: View?) { }

     override fun onViewAttachedToWindow(v: View?) {
         // call the code from above starting from 'layoutParams = ...' on your View object
     }
})

不要忘记根据自己的需要更改LayoutParams(MATCH_PARENT, WRAP_CONTENT)

答案 1 :(得分:0)

我使用了以下方法(在Kotlin中):

*仅适用于Android P及更高版本。

*我的活动是全屏活动。

*我的假设是,带有缺口的android手机相对较新,要么会随Android P一起推出,要么会迅速更新为Android P。

创建一个OnGlobalLayoutListener

private val onDisplayCutoutReadyListener : ViewTreeObserver.OnGlobalLayoutListener = ViewTreeObserver.OnGlobalLayoutListener{
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {

        var displayCutout = window.decorView.rootWindowInsets.displayCutout
        if (displayCutout.boundingRects.size>0) {
            val notchRect = displayCutout.boundingRects.get(0)
            Log.v(TAG,"notch height in pixels="+notchRect.height())
        }
    }

}

使用.viewTreeObserver.addOnGlobalLayoutListener()将侦听器添加到活动的rootview中

layout_fullscreen.viewTreeObserver.addOnGlobalLayoutListener(onDisplayCutoutReadyListener)

我的布局xml,其中layout_fullscreen是rootview。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout_fullscreen"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<RelativeLayout
    android:layout_width="match_parent"
    android:layout_weight="1"
    android:layout_height="0dp">
    <com.baidu.mapapi.map.MapView
        android:id="@+id/map_location"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</RelativeLayout>