-
获取状态栏高度——方法3
-
应用区的顶端位置即状态栏的高度
-
注意该方法不能在初始化的时候用
-
*/
Rect rectangle= new Rect();
getWindow().getDecorView().getWindowVisibleDisplayFrame(rectangle);
//高度为rectangle.top-0仍为rectangle.top
Log.e(“WangJ”, “状态栏-方法3:” + rectangle.top);
看结果:
*注意* 如果单单获取statusBar高度而不获取titleBar高度时,这种方法并不推荐大家使用,因为这种方法依赖于WMS(窗口管理服务的回调)。正是因为窗口回调机制,所以在Activity初始化时执行此方法得到的高度是0,这就是很多人获取到statusBar高度为0的原因。这个方法推荐在回调方法onWindowFocusChanged()中执行,才能得到预期结果。
[](() (4)借助屏幕和应用区域高度
还是看屏幕区域划分图,是不是状态栏占满了屏幕中除应用区域之外的全部呢?所以直接上代码:
/**
-
获取状态栏高度——方法4
-
状态栏高度 = 屏幕高度 - 应用区高度
-
注意该方法不能在初始化的时候用
-
*/
//屏幕
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
//应用区域
Rect outRect1 = new Rect();
getWindow().getDecorView().getWindowVisibleDisplayFrame(outRect1);
int statusBar = dm.heightPixels - outRect1.height(); //状态栏高度=屏幕高度-应用区域高度
Log.e(“WangJ”, “状态栏-方法4:” + statusBar);
看结果:
有人看完会说,What Are You弄啥嘞,小学数学题!秀智商?——呵呵,是的!其实3、4这两种方法其实本质是一样,所以如果单单获取statusBar高度而不获取titleBar高度时也不推荐大家使用,理由同上方法3。
[](() 三、标题栏高度的测量
搞懂了上边的原理,标题栏高度的测量也就手到擒来啦,依旧是屏幕区域划分图。这里也给出两种方法,先给出公共代码吧,就是获取各区域(*注意*依旧是在Activity的回调方法onWindowFocusChanged()中执行,才能得到预期结果):
//屏幕
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
Log.e(“WangJ”, “屏幕高:” + dm.heightPixels);
//应用区域
Rect outRect1 = new Rect();
getWindow().getDecorView().getWindowVisibleDisplayFrame(outRect1);
Log.e(“WangJ”, “应用区顶部” + outRect1.top);
Log.e(“WangJ”, “应用区高” + outRect1.height());
//View绘制区域
Rect outRect2 = new Rect();
getWindow().findViewById(Window.ID_ANDROID_CONTENT).getDrawingRect(outRect2);
Log.e(“WangJ”, “View绘制区域顶部-错误方法:” + outRect2.top); //不能像上边一样由outRect2.top获取,这种方式获得的top是0,可能是bug吧
int viewTop = getWindow().findViewById(Window.ID_ANDROID_CONTENT).getTop(); //要用这种方法
Log.e(“WangJ”, “View绘制区域顶部-正确方法:” + viewTop);
Log.e(“WangJ”, “View绘制区域高度:” + outRect2.height());
先看一下信息:
以手到擒来了吧,有没有遇到获取View绘制区时列出来的那个outRect2.top=0的问题呢?原因我们还没搞懂呢,哪位大侠搞懂了留言给个贡献值啊,求教了!
[](() (1)top-top
直接看代码,文笔不好(其实是懒得写字):
/**
-
获取标题栏高度-方法1
-
标题栏高度 = View绘制区顶端位置 - 应用区顶端位置(也可以是状态栏高度,获取状态栏高度方法3中说过了)
-
*/
int titleHeight1 = viewTop - outRect1.top;
Log.e(“WangJ”, “标题栏高度-方法1:” + titleHeight1);
看结果:

(你要是也想秀智商,可以吧注释括号里的拿出来再做一种方法哦,我就不秀了,再秀你都嫌我恶心了_)
[](() (2)高度-高度
还是看代码,有注释:
/**
-
获取标题栏高度-方法2
-
标题栏高度 = 应用区高度 - View绘制区高度
-
*/
int titleHeight2 = outRect1.height() - outRect2.height();
Log.e(“WangJ”, “标题栏高度-方法2:” + titleHeight2);
看结果:
[](() 四、注意事项
*注意*
(1)不管你是否设置全屏模式,或是不显示标题栏,在使用获取状态栏高度方法1和获取状态栏高度方法2都会测量到状态栏的高度,理解原理就不难解释——系统资源属性是固定的、真实的,不管你是否隐瞒(隐藏或者显示),它都在那里;
(2)但是若使用****获取状态栏高度方法3和获取状态栏高度方法4,以及获取标题栏高度方法1和获取标题栏高度方法2,都是依赖于WMS,是在界面构建后根据View获取的,所以显示了就有高度,不显示自然没高度了。
如果你没时间验证(或者是懒),我就勉为其难给你验证一下吧:
先设置Activity全屏:
<activity
android:name=“.MainActivity”
android:label=“@string/app_name”
android:theme=“@android:style/Theme.Light.NoTitleBar.Fullscreen”
android:screenOrientation=“portrait” >