状态栏高度_获取状态栏高度 - CSDN
精华内容
参与话题
  • 获取导航栏和状态栏高度

    千次阅读 2019-02-19 20:44:01
    * 获取状态栏高度 * * @param context 上下文 * @return 高度 */ public static int getStatusBarHeight(Context context) { int result = 0; int resId = context.getResources().getIdentifier(&...

    状态栏和导航栏

    /**
     * 获取状态栏高度 
     * 
     * @param context 上下文
     * @return 高度
     */
    public static int getStatusBarHeight(Context context) {
        int result = 0;
        int resId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
        if (resId > 0) {
            result = context.getResources().getDimensionPixelSize(resId);
        }
        return result;
    }
    
    /**
     * 获取导航栏高度
     *
     * @param context 上下文
     * @return 高度
     */
    public static int getNavigationHeight(Context context) {
        int resourceId = 0;
        int rid = context.getResources().getIdentifier("config_showNavigationBar", "bool", "android");
        if (rid != 0) {
            resourceId = context.getResources().getIdentifier("navigation_bar_height", "dimen", "android");
            return context.getResources().getDimensionPixelSize(resourceId);
        } else{
            return 0;
    	}
    }
    
    展开全文
  • 简单说明一下(上图Activity采用默认Style,状态栏和标题栏都会显示):最大的草绿色区域是屏幕界面,红色次大区域我们称之为“应用界面区域”,最小紫色的...下边给出4中状态栏高度获取和2种标题栏获取高度的方法——

            日常开发中我们经常会因为绘图、绘制自定义组件、定位组件或者是计算布局高度需要减去状态栏高度等需要来获取Activity界面中状态栏、标题栏的高度。但很多人马上要拿起来就用还是会遇到各种各样的问题,一时要查很多资料,很是不爽!今天也是猛然发现这个问题费了不少时间,终于有所收获,特地记录下来,希望给遇到同样问题的你一点帮助,也给以后留个笔记。废话少说,开始正题吧——

            一、Activity界面区域划分

            先上一张图统一一下认识,有图好说话:

            屏幕区域划分

            简单说明一下(上图Activity采用默认Style,状态栏和标题栏都会显示):最大的草绿色区域是屏幕界面,红色次大区域我们称之为“应用界面区域”,最小紫色的区域我们称之为“View绘制区域”;屏幕顶端、应用界面区之外的那部分显示手机电池网络运营商信息的为“状态栏”,应用区域顶端、View绘制区外部显示Activity名称的部分我们称为“标题栏”。

            二、状态高度的测量

            状态栏是显示显示手机状态(如电池电量、网络状态、时间、运营商信息等)的区域,一般内容型应用都会显示保留状态栏,但是游戏界面如果还保留状态栏就不合适了,因为游戏界面要响应各种手势,而状态栏也会响应一些手势,有可能引发错误操作,所以一般在游戏界面都会隐藏状态栏,使游戏界面全屏显示,关于设置全屏请查看《Android设置Activity全屏的两种方式及Theme属性解析》,继续看状态栏高度测量:
            状态栏高度的测量我在这里提供4种方法:

            (1)通过系统尺寸资源获取

            状态栏高度定义在Android系统尺寸资源中status_bar_height,但这并不是公开可直接使用的,例如像通常使用系统资源那样android.R.dimen.status_bar_height。但是系统给我们提供了一个Resource类,通过这个类可以获取资源文件,借此可以获取到status_bar_height:
       /**
    		 * 获取状态栏高度——方法1
    		 * */
    		int statusBarHeight1 = -1;
    		//获取status_bar_height资源的ID
    		int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
    		if (resourceId > 0) {
    			//根据资源ID获取响应的尺寸值
    			statusBarHeight1 = getResources().getDimensionPixelSize(resourceId);
    		}
    		Log.e("WangJ", "状态栏-方法1:" + statusBarHeight1);
            看结果:
            状态栏高度-方法1
            (2)通过R类的反射
            大家都知道Android的所有资源都会有惟一标识在R类中作为引用。我们也可以通过反射获取R类的实例域,然后找status_bar_height:
    /**
    		 * 获取状态栏高度——方法2
    		 * */
    		int statusBarHeight2 = -1;
    	    try {
    	        Class<?> clazz = Class.forName("com.android.internal.R$dimen");
    	        Object object = clazz.newInstance();
    	        int height = Integer.parseInt(clazz.getField("status_bar_height")
    	                .get(object).toString());
    	        statusBarHeight2 = getResources().getDimensionPixelSize(height);
    	    } catch (Exception e) {
    	        e.printStackTrace();
    	    }
    		Log.e("WangJ", "状态栏-方法2:" + statusBarHeight2);
            看结果:
            状态栏高度-方法2

            (3)借助应用区域的top属性

            这就用到了开题时的那张屏幕区域划分图片,状态栏位于屏幕最顶端,其位置从(0,0)开始,故而应用区域的顶端位置(高度 = Y坐标 - 0)即为状态栏的高度:
    /**
    		 * 获取状态栏高度——方法3
    		 * 应用区的顶端位置即状态栏的高度
    		 * *注意*该方法不能在初始化的时候用
    		 * */
    		Rect rectangle= new Rect();
    		getWindow().getDecorView().getWindowVisibleDisplayFrame(rectangle);
    		//高度为rectangle.top-0仍为rectangle.top
    		Log.e("WangJ", "状态栏-方法3:" + rectangle.top);
            看结果:
            状态栏高度-方法3
            *注意* 如果单单获取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);
            看结果:
            状态栏高度-方法4
            有人看完会说,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);
            看结果:
            title高度-方法1
            (你要是也想秀智商,可以吧注释括号里的拿出来再做一种方法哦,我就不秀了,再秀你都嫌我恶心了^_^)

            (2)高度-高度

            还是看代码,有注释:
    /**
    		 * 获取标题栏高度-方法2
    		 * 标题栏高度 = 应用区高度 - View绘制区高度
    		 * */
    		int titleHeight2 = outRect1.height() - outRect2.height();
    		Log.e("WangJ", "标题栏高度-方法2:" + titleHeight2);
            看结果:
            title高度-方法2

            四、注意事项

            *注意* 

            (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" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            屏幕各区域获取不变;

            输出StatusBar和titleBar高度信息:

    int titleHeight1 = viewTop - outRect1.top;
    Log.e("WangJ", "验证Statue高度:" + titleHeight1);
    Log.e("WangJ", "验证Title高度:" + outRect1.top);
            看结果:

            
            

            就这么多把,感觉解释得挺清楚了。水平有限,欢迎批评指正! 如果对你有帮助,鼓励一下呗,亲!

    展开全文
  • Android获取状态栏高度

    千次阅读 2018-12-26 13:24:59
    android开发中,可以通过以下代码获取android手机状态栏的... * 获取状态栏高度 * @param context * @return */ public static int getStatusBarHeight(Context context) { Resources resources = context.g...

    android开发中,可以通过以下代码获取android手机状态栏的高度

    /**
         * 获取状态栏高度
         * @param context
         * @return
         */
        public static int getStatusBarHeight(Context context) {
            Resources resources = context.getResources();
            int resourceId = resources.getIdentifier("status_bar_height", "dimen", "android");
            int height = resources.getDimensionPixelSize(resourceId);
            return height;
        }
    
    展开全文
  • Andorid获取状态栏高度的三种方法

    千次阅读 2018-10-16 21:21:34
    状态栏高度定义在Android系统尺寸资源中status_bar_height,但这并不是公开可直接使用的,例如像通常使用系统资源那样android.R.dimen.status_bar_height。但是系统给我们提供了一个Resource类,通过这个类我们可以...

    转载请注明出处

    今天正好做项目需要用到状态栏高度,我用的就是下面的第三种方法,没有成功,换成第一种方法果断解决。

    在应用开发中,有时我们需要用代码计算布局的高度,可能需要减去状态栏(status bar)的高度。状态栏高度定义在Android系统尺寸资源中status_bar_height,但这并不是公开可直接使用的,例如像通常使用系统资源那样android.R.dimen.status_bar_height。但是系统给我们提供了一个Resource类,通过这个类我们可以获取资源文件。下边是在Activity中获取的方法

     public int getStatusBarHeight() {
      int result = 0;
      int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
      if (resourceId > 0) {
          result = getResources().getDimensionPixelSize(resourceId);
      }
      return result;
    }
    

    这里还有另外一种方法,大家都知道Android的所有资源都会有惟一标识在R类中作为引用。我们也可以通过反射获取R类的实例域,代码如下

    /**
    	 * 获得状态栏的高度
    	 * 
    	 * @param context
    	 * @return
    	 */
    	public static int getStatusHeight(Context context) {
    
    		int statusHeight = -1;
    		try {
    			Class clazz = Class.forName("com.android.internal.R$dimen");
    			Object object = clazz.newInstance();
    			int height = Integer.parseInt(clazz.getField("status_bar_height")
    					.get(object).toString());
    			statusHeight = context.getResources().getDimensionPixelSize(height);
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		return statusHeight;
    	}
    

    我们可以看到得到的结果是一样的。当然,获取状态栏的高度方法是不是就只有以上两种呢,当然不是,下边再介绍一种获取状态栏高度的方法,不过不推荐使用,因为这个方法依赖于WMS(窗口管理服务的回调)。

    Rect rectangle= new Rect();
    	Window window= getWindow();
    	window.getDecorView().getWindowVisibleDisplayFrame(rectangle);
    	int statusBarHeight= rectangle.top;
    
    
    展开全文
  • 状态栏高度

    2017-03-24 18:05:34
    日常开发中我们经常会因为绘图、绘制自定义组件、定位组件或者是计算布局高度需要减去状态栏高度等需要来获取Activity界面中状态栏、标题栏的高度。但很多人马上要拿起来就用还是会遇到各种各样的问题,一时要查很多...
  • 获取状态栏高度

    2018-06-27 10:53:00
    private static int getStatusBarHeight(Context context) { int statusBarHeight = 0; Resources res = context.getResources(); int resourceId = res.getIdentifier("status_bar_height"...
  • 状态栏高度:20px,导航栏高度:40px,代码如下: [objc] view plain copy // (statusbar)  CGRect rectOfStatusbar = [[UIApplication sharedApplication] statusBarFrame];  NSLog(@"statusbar ...
  • android获取屏幕的高度和宽度用到WindowManager这个类,两种方法: WindowManager wm = (WindowManager) getContext() .getSystemService(Context.WINDOW_SERVICE);或WindowManager wm = this.getWindowManager();...
  • flutter获取状态栏高度

    万次阅读 2018-09-11 17:58:12
    获取状态栏高度 import 'dart:ui'; MediaQueryData.fromWindow(window).padding.top 系统默认的appBar等高度 位于Dart Packages/flutter/src/material/constans.dart /// The height of the toolbar ...
  • 微信小程序顶部导航栏自定义,根据不同手机自适应距离状态栏高度 一、微信小程序顶部导航栏自定义 "navigationStyle": "custom" app.json "window": { "backgroundTextStyle": "dark", ...
  • App在很多情况下由于各种需求需要自定义标题栏,而在能够构建Android和IOS应用的Flutter中,如果不在Scaffold中使用... 解惑:其实并不用获取状态栏高度,你想AppBar也是状态栏,它也需要知道状态栏高度,它需要...
  • iPhone iPad 各种控件默认高度

    万次阅读 2012-11-22 19:54:47
    状态栏一般高度为20像素,在打手机或者显示消息时会放大到40像素高,注意,两倍高度状态栏在好像只能在纵向的模式下使用。如下图 用户可以隐藏状态栏,也可以将状态栏设置为灰色,黑色或者半透明的黑色。 ...
  • #define kIs_iphone (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) #define kIs_iPhoneX kScreenWidth &gt;=375.0f &amp;&amp; kScreenHeight &.../*状态栏高度*/ #define kS...
  • Android系统状态栏和导航栏高度修改

    万次阅读 2018-01-24 14:58:07
    修改路径:frameworks/base/core/res/res/values/dimens.xml status_bar_height">32dp navigation_bar_height">48dp ...navigation_bar_height_landscape">62dp ...navigation_bar_width">160dp
  • iOS 各种控件默认高度(图示)

    万次阅读 2013-02-04 15:47:43
    状态栏一般高度为20像素,在打手机或者显示消息时会放大到40像素高,注意,两倍高度状态栏在好像只能在纵向的模式下使用。如下图 用户可以隐藏状态栏,也可以将状态栏设置为灰色,黑色或者半透明的黑色...
  • 名词解析: 方法 ... //透明状态栏 getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); //透明导航栏 getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_N
  • app尺寸,去掉状态栏 CGRectr = [UIScreenmainScreen ].applicationFrame; r=0,20,320,460 屏幕尺寸 CGRectrx = [UIScreenmainScreen ].bounds; r=0,0,320,480 状态栏尺寸 CGRect rect; rect = [...
  • iPhone开发当中,有时需要获取状态栏和导航栏高度、宽度信息,方便布局其他控件。本文简单介绍了如何获取这些信息。
  • print( UIApplication.shared.statusBarFrame.width, UIApplication.shared.statusBarFrame.height )
  • 获取状态栏高度//获取status_bar_height资源的ID int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resourceId &gt; 0) { //根据...
1 2 3 4 5 ... 20
收藏数 72,352
精华内容 28,940
关键字:

状态栏高度