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);

	}
发布了95 篇原创文章 · 获赞 195 · 访问量 26万+

猜你喜欢

转载自blog.csdn.net/u012440207/article/details/48000525