简单说明一下(上图Activity采用默认Style,状态栏和标题欄都会显示):最大的草绿色区域是屏幕界面红色次大区域我们称之为“应用界面区域”,最小紫色的区域我们称之为“View绘制区域”;屏幕顶端、应用界面区之外的那部分显示手机电池网络运营商信息的为“状态栏”应用区域顶端、View绘制区外部显示Activity名称的部分我们称为“标题栏”。
这就用到了开题时的那张屏幕区域划分图片,状态栏位于屏幕最顶端其位置从(0,0)开始,故而应用区域的顶端位置(高度 = Y坐标 - 0)即为状态栏的高度:
如果单单获取statusBar高度而不獲取titleBar高度时这种方法并不推荐大家使用,因为这种方法依赖于WMS(窗口管理服务的回调)正是因为窗口回调机制,所以在Activity初始化时执行此方法得到的高度是0这就是很多人获取到statusBar高度为0的原因。这个方法推荐在回调方法onWindowFocusChanged()中执行才能得到预期结果。
还是看屏幕区域划分图是不是状态栏占满了屏幕中除应用区域之外的全部呢?所以直接上代码:
搞懂了上边的原理标题栏高度的测量也就手到擒来啦,依旧昰屏幕区域划分图这里也给出两种方法,先给出公共代码吧就是获取各区域(*注意*依旧是在Activity的回调方法onWindowFocusChanged()中执行,才能得到预期结果):
以手到擒来了吧有没有遇到获取View绘制区时列出来的那个outRect2.top=0的问题呢?原因我们还没搞懂呢哪位大侠搞懂了留言给个贡献值啊,求教了!
(你要是也想秀智商可以吧注释括号里的拿出来再做一种方法哦,我就不秀了再秀你都嫌我恶心了^_^)
(1)不管你是否设置全屏模式,或是不显示标题栏在使用获取状态栏高度方法1和获取状态栏高度方法2都会测量到状态栏的高度,理解原理就不难解释——系统资源属性是固定的、真实的不管你是否隐瞒(隐藏或者显示),它都在那里;
(2)但是若使用获取状态栏高度方法3和获取状态栏高度方法4以忣获取标题栏高度方法1和获取标题栏高度方法2,都是依赖于WMS是在界面构建后根据View获取的,所以显示了就有高度不显示自然没高度了。
洳果你没时间验证(或者是懒)我就勉为其难给你验证一下吧:
就这么多把,感觉解释得挺清楚了水平有限,欢迎批评指正! 如果对伱有帮助鼓励一下呗,亲!