美文网首页
获取statusBar(状态栏)高度的几个方法

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

作者: Sxgg | 来源:发表于2016-04-22 16:18 被阅读0次

    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(状态栏)高度的几个方法

          本文链接:https://www.haomeiwen.com/subject/dkdxrttx.html