Android—–获取系统状态栏和导航栏的高度

1、首先先了解界面的层级

window -> statusbar 和 DecorView(actionbar、内容)

2cc5ff32dce0494fab8f58a43aee738b.png

2、当我们在activity中重写onTouchEvent事件时,触摸事件是由Window来监听,并且负责传递,所以坐标是相对于window来说的

 

3、当我们将一个view的x、y坐标赋了event.x和event.y,希望让view跟着我们触摸点移动时,但会发现我们虽然将触摸点赋给了view,view和我们的触摸点会有一段距离,这段距离就是(状态栏/导航栏/状态栏+导航栏)

——————前提是有状态栏或者导航栏——————

4.我们该如何得出状态栏和导航栏的高度呢?

——获取DecorView高度:

DecorView是window的根视图

//获取decorView的矩形区域
val rect = Rect()
window.decorView.getWindowVisibleDisplayFrame(rect)

——获取内容的高度:

//获取内容的高度
val contentHeight = window.findViewById(Window.ID_ANDROID_CONTENT)

——状态栏高度:

//状态栏的高度
val statusBarHeight = rect.top

——导航栏高度:

//获取导航栏的高度
val actionBarHeight = contentHeight.top

5、必须注意一个问题:不能在onCreate()、onStart()、onResume()方法中获取

原因:在onCreate()、onStart()、onResume()中,Activity的视图层级还没有完全建立,DecorView还没有渲染出来,所以会导致无法获取高度

但是我们就是想在onCreate()、onStart()、onResume()中先给我们计算出高度呢?

我们可以先想一想,是不是等绘制完毕,我们就可以获取对应的高度了?所以我们可以在onCreate()、onStart()、onResume()方法中添加一个绘制完毕的监听器:addOnPreDrawListener

——addOnPreDrawListener监听器在视图开始绘制和绘制完毕会被调用

        —–返回true表示继续绘制

        —–返回false表示停止绘制

        —–该方法会被多次调用,所以不要在此监听器内做一些耗时的操作,因为会对绘制性能产生一定的影响

  window.decorView.viewTreeObserver.addOnPreDrawListener {
           //获取对应高度
            true
        }

 

 

 

 

 

本文来自网络,不代表协通编程立场,如若转载,请注明出处:https://www.net2asp.com/44e35207a2.html