获取statusBar(状态栏)高度的几个方法

Rect frame = new Rect();
getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
int statusBarHeight = frame.top;
首先是这个api,但是这个方法有个局限性,在onCreate()以及到onResume()的生命周期里面执行的话,获取的高度为0,因为这个decorView的绘制需要时间,所以我们需要延时使用该方法来获取高度;

new Runnable(){
    @Override
    public void run(){
        Rect frame = new Rect();
        getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
        int statusBarHeight = frame.top;
    }
}

然后可以用handler.postDelayed(run,200)去执行,就能获得statusBar的高度了,这个200毫秒其实应该是大大超过了decorView的绘制时间了,因为View的绘制时间超过了16.7ms就会出现卡顿的现象,人眼来识别的话,每秒需要达到60帧,画面才会流畅。但是,经过测试,100毫秒左右是没问题的。这个怎么会要这么久的时间去绘制,不是很懂
我们应该使用一个在任何时候都能正常获取到statusBar高度的方法,这样应用才不会出一些奇奇怪怪的问题。

Resources resources = getResources();
int resourceId = resources.getIdentifier("status_bar_height", "dimen","android");
int height = resources.getDimensionPixelSize(resourceId);

这个api在任何时候都能正常获取到高度,其实是调用native方法。还有一种是用java的反射来获取高度的:

 Class c = null;
    Object obj = null;
    Field field = null;
    int x = 0, statusBarHeight = 0;
    try {
        c = Class.forName("com.android.internal.R$dimen");
        obj = c.newInstance();
        field = c.getField("status_bar_height");
        x = Integer.parseInt(field.get(obj).toString());
        statusBarHeight = context.getResources().getDimensionPixelSize(x);
    } catch (Exception e1) {
        e1.printStackTrace();
    } 
    return statusBarHeight;

这个方法没有试过,看上去和第二个方法很像,获取的包名,类名和字段名都一模一样。
2016年4月22日

你可能感兴趣的:(获取statusBar(状态栏)高度的几个方法)