拿状态栏高度
来源:互联网 发布:干扰摄像头软件下载 编辑:程序博客网 时间:2024/04/29 22:48
日常开发中我们经常会因为绘图、绘制自定义组件、定位组件或者是计算布局高度需要减去状态栏高度等需要来获取Activity界面中状态栏、标题栏的高度。但很多人马上要拿起来就用还是会遇到各种各样的问题,一时要查很多资料,很是不爽!今天也是猛然发现这个问题费了不少时间,终于有所收获,特地记录下来,希望给遇到同样问题的你一点帮助,也给以后留个笔记。废话少说,开始正题吧——
一、Activity界面区域划分
先上一张图统一一下认识,有图好说话:
简单说明一下(上图Activity采用默认Style,状态栏和标题栏都会显示):最大的草绿色区域是屏幕界面,红色次大区域我们称之为“应用界面区域”,最小紫色的区域我们称之为“View绘制区域”;屏幕顶端、应用界面区之外的那部分显示手机电池网络运营商信息的为“状态栏”,应用区域顶端、View绘制区外部显示Activity名称的部分我们称为“标题栏”。
二、状态高度的测量
(1)通过系统尺寸资源获取
/** * 获取状态栏高度——方法1 * */int statusBarHeight1 = -1;//获取status_bar_height资源的IDint resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");if (resourceId > 0) {//根据资源ID获取响应的尺寸值statusBarHeight1 = getResources().getDimensionPixelSize(resourceId);}Log.e("WangJ", "状态栏-方法1:" + statusBarHeight1);
/** * 获取状态栏高度——方法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);看结果:
(3)借助应用区域的top属性
/** * 获取状态栏高度——方法3 * 应用区的顶端位置即状态栏的高度 * *注意*该方法不能在初始化的时候用 * */Rect rectangle= new Rect();getWindow().getDecorView().getWindowVisibleDisplayFrame(rectangle);//高度为rectangle.top-0仍为rectangle.topLog.e("WangJ", "状态栏-方法3:" + rectangle.top);看结果:
(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);看结果:
有人看完会说,What Are You弄啥嘞,小学数学题!秀智商?——呵呵,是的!其实3、4这两种方法其实本质是一样,所以如果单单获取statusBar高度而不获取titleBar高度时也不推荐大家使用,理由同上方法3。
三、标题栏高度的测量
//屏幕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());先看一下信息:
(1)top-top
/** * 获取标题栏高度-方法1 * 标题栏高度 = View绘制区顶端位置 - 应用区顶端位置(也可以是状态栏高度,获取状态栏高度方法3中说过了) * */int titleHeight1 = viewTop - outRect1.top;Log.e("WangJ", "标题栏高度-方法1:" + titleHeight1);看结果:
(2)高度-高度
/** * 获取标题栏高度-方法2 * 标题栏高度 = 应用区高度 - View绘制区高度 * */int titleHeight2 = outRect1.height() - outRect2.height();Log.e("WangJ", "标题栏高度-方法2:" + titleHeight2);看结果:
四、注意事项
*注意*
(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:获取状态栏高度
- android 修改状态栏高度
- Android 获取状态栏高度
- Android获取状态栏高度
- 获取状态栏高度
- 获取系统状态栏高度
- 获取状态栏高度
- android获取状态栏高度
- 获取状态栏高度
- android获取状态栏高度
- Android获取状态栏高度
- Android获取状态栏高度
- Android 获取状态栏高度
- 获取状态栏高度
- 正则表达式
- 数据库权限说明
- iOS开发 md5 简单加密
- 国际化支持概念与理解
- C#微信公众号全攻略(6)--整体流程
- 拿状态栏高度
- JS 计算两个日期之间的相差天数
- 由微信指数联想到大数据的两种应用方式
- Linux 内核时钟之触发local timer
- Intellij IDEA 快捷键整理
- 学习opencv——手写数字识别(1)
- 递推递归练习E
- Spring Boot Admin 的使用
- spring boot LoginInterceptor(登录拦截器)无法注入bean