Android 获取状态栏标题栏导航栏等的高度

Posted 红日666

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 获取状态栏标题栏导航栏等的高度相关的知识,希望对你有一定的参考价值。

开发中有时需要获取到手机状态栏、标题栏的高度。

状态栏:显示手机状态(信号、电量等)信息的那个栏

标题栏:显示应用标题的那个栏

导航栏:部分手机底部的虚拟导航栏

如下图:

手机Moto Z(2560*1440)获取的信息:

 

代码如下:

 

	@Override
	public void onWindowFocusChanged(boolean hasFocus) 
		super.onWindowFocusChanged(hasFocus);

		 /**
         *  获取屏幕的宽/高(屏幕展示高度):
            注:
            如果手机没有底部虚拟导航栏则:此高度==屏幕完整高度
            如果手机有底部虚拟导航栏则:此高度==屏幕完整高度-导航栏高度
            
            方法一
         */
        DisplayMetrics dm = new DisplayMetrics();
        mActivity.getWindowManager().getDefaultDisplay().getMetrics(dm);
        int screenW = dm.widthPixels;
        int screenH = dm.heightPixels;

        /**
         *方法二
         */   
        WindowManager windowManager =                 
        (WindowManager)mActivity.getSystemService(Context.WINDOW_SERVICE);
        windowManager.getDefaultDisplay().getMetrics(dm);
        int width = dm.widthPixels;
        int height = dm.heightPixels;

        /**
         *方法三
         */ 
        int width2 = mActivity.getResources().getDisplayMetrics().widthPixels;
        int height2 = mActivity.getResources().getDisplayMetrics().heightPixels;

        /**
         *方法四
         */ 
        int width3 = appContext.getResources().getDisplayMetrics().widthPixels;
        int height3 = appContext.getResources().getDisplayMetrics().heightPixels;

        /**
         *方法五
         */ 
        WindowManager windowManager =                 
        (WindowManager)appContext.getSystemService(Context.WINDOW_SERVICE);
        windowManager.getDefaultDisplay().getMetrics(dm);
        int width = dm.widthPixels;
        int height = dm.heightPixels;

        //以上五种方法中:
        //方法一二三是通过Activity获取当前APP的宽高。
        //方法四五是通过ApplicationContext来获取屏幕的宽高。
        //两者区别:
        //当处于分屏模式时,前者只是当前分屏APP的宽高。
        //后者是这个设备屏幕宽高。

        //注:
        //某些情况下(具体原因待研究)带有底部虚拟导航栏的设备--在使用方法三四五获取屏幕展示高度时        
        //不包含状态栏,此时可以可以换用方法一二来获取。



        /**
         * 获取屏幕完整高度(屏幕展示高度+导航栏)[针对具有导航栏的手机]

           方法一
         */
        int realScreenH = 0;
        if (VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN_MR1) 
            getWindowManager().getDefaultDisplay().getRealMetrics(dm);
            realScreenH = dm.heightPixels;
        

        /**
         * 方法二:通过反射获取
         */
        Display display = mActivity.getWindowManager().getDefaultDisplay();
        DisplayMetrics dm = new DisplayMetrics();
        int realScreenH = 0;
        Class c = Class.forName("android.view.Display");
        Method method = c.getMethod("getRealMetrics", DisplayMetrics.class);
        method.invoke(display, dm);
        realScreenH = dm.heightPixels;


        /**
         * 状态栏高度
         */
        Rect frame = new Rect();
        getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
        int statusBarHeight = frame.top;



        /**
         * 标题栏高度
         */
        View v = getWindow().findViewById(Window.ID_ANDROID_CONTENT);
        int contentTop = v.getTop();
        int titleBarHeight = contentTop - statusBarHeight;



        /**
         * 获取虚拟导航栏高度
         */
        int navigationBarH = realScreenH - screenH;


        Logger.d("screenW:" + screenW + "\\n" + "screenH:" + screenH + "\\n" + "realScreenH:" + realScreenH
            + "\\n" + "statusBarHeight:" + statusBarHeight + "\\n"
            + "titleBarHeight:" + titleBarHeight + "\\n" + "navigationBarH:" + navigationBarH);

	

 

 

 

 

 

 

以上是关于Android 获取状态栏标题栏导航栏等的高度的主要内容,如果未能解决你的问题,请参考以下文章

如何获取Android手机底部导航栏的高度

获取Android屏幕尺寸控件尺寸状态栏/通知栏高度导航栏高度

Xcode 使查看全屏,隐藏状态栏,导航栏等

iOS 获取状态栏、导航栏、tabBar高度

状态栏、导航栏、PopupWindow的使用

可靠获取状态栏高度解决KitKat半透明导航问题