Android—–获取系统状态栏和导航栏的高度
1、首先先了解界面的层级
window -> statusbar 和 DecorView(actionbar、内容)

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
