获取屏幕宽高尺寸的三种代码形式

在Android上,目前我知道的获取屏幕尺寸的方法有三种不同的代码形式

方法1.在Activity中最常见的调用方式

WindowManager windowManager = getWindowManager();

Display display = windowManager.getDefaultDisplay();

int screenWidth = display.getWidth();

int screenHeight = display.getHeight();

由于在API Level 13以后上述的getWidth和getHeight包括getOrientation都变成了@Deprecated,所以屏幕宽高用getSize替换,也就有了方法2

Point outSize = new Point();

display.getSize(outSize);

screenWidth = outSize.x;

screenHeight = outSize.y;

显然要做API Level的区分感觉会不太舒服,那么就有了第三种通用形式

DisplayMetrics dm = new DisplayMetrics();

getWindowManager().getDefaultDisplay().getMetrics(dm);

screenWidth =dm.widthPixels;

screenHeight =dm.heightPixels;

其实上述三种代码形式,调用的都是WindowManager的default Display object里面的宽高尺寸,有些地方说上述这三种形式在屏幕未显示时是拿不到具体值的,会拿到全是0的情况,我在Activity的onCreate函 数中进行对其调用发现是能取到具体数值的,而且即使不在Activity中,通过Application的onCreate函数中的如下代码:

((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getMetrics(dm);

也能顺利拿到具体的屏幕宽高值。

获取状态栏的尺寸

由于decorView是window中的最顶层view,可以从window中获取到decorView,然后decorView有个getWindowVisibleDisplayFrame方法可以获取到程序显示的区域,包括标题栏,但不包括状态栏。

于是就有了算出状态栏高度的第一种代码形式

Rect frame = new Rect();

getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);

int statusBarHeight = frame.top;

上述代码有时候获取到的高度是0,网上说法是在4.0.3版本以后的都会返回0,我没有亲测,但是在我的真机上确实拿到是0,网上流出一种在源码程序中获取状态栏高度的代码:

statusBarHeight = getResources().getDimensionPixelSize(com.android.internal.R.dimen.status_bar_height);

那么在非源码中应该怎么获取呢?网上流行的一种解决方案,就是对上述需要源码的实现方式通过反射来实现状态栏高度的获取,具体代码如下:

import java.lang.reflect.Field;

//获取手机状态栏高度

public static int getStatusBarHeight(Context context){

Class<?> c = null;

Object obj = null;

Field field = null;

int x = 0, statusBarHeight = 38;//通常这个值会是38

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;

}

经过测试发现这个函数在状态栏隐藏的时候获得的值和状态栏显示时的值是一样的,不会变化,而且在做横竖屏测试时,也是一样不会改变,即状态栏的高度在手机上应该是固定的。

上面方法是参考了网上有个获取状态栏高度的帖子而来的

http://www.cnblogs.com/renkangke/archive/2013/05/27/3101375.html

获取标题栏高度

上面讲了获取状态栏,顺带就引出如何获取标题栏高度的问题,目前我所知道的获取标题栏高度的方法是不能在onCreate函数中直接使用,必须在UI显示出来后调用,具体大概是layout之后进行调用吧,具体代码如下:

int contentTop = getWindow().findViewById(Window.ID_ANDROID_CONTENT).getTop();

//statusBarHeight是上面所求的状态栏的高度

int titleBarHeight = contentTop – statusBarHeight;

上述方法的原理就是 getWindow().findViewById(Window.ID_ANDROID_CONTENT)这个方法获取到的view是程序不包括标题栏 的部分。由于不能直接在onCreate函数中调用,所以有些调用方法是在onCreate中起一个线程,然后延时调用。

我也不知道有什么方法可以更加靠谱的获取标题栏高度,如果有哪位技术牛人知道还望告知,另外这种方法与ContentView中的其它控件的尺寸获取一样,在onCreate中是无法直接获取的,直接获取都会是0。

另外在代码中我们使用的是具体的像素值,具体像素值是与设备相关的,我们一般不在代码中直接使用具体使用像素值,而是在资源文件中定义好设备无关的dp数值,然后通过类似如下方法获取具体的像素值
int padding = getResources().getDimensionPixelSize(R.dimen.broadcast_select_padding);
有时候也有一种具体数值的方法来获取像素值,比如上述的R.dimen.broadcast_select_padding假如是16dp,则可以通过下述方法获取像素值
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
int padding = 16 * dm.scaledDensity
但是这种方法我并不建议使用,因为Android的设备品类太多,在有些手机上这种乘法获得的值与getResources().getDimensionPixelSize获得的值并不相等,而后者肯定比前者准确。

android中几种常见的尺寸的更多相关文章

  1. [整理]android中几种常见的尺寸

    获取屏幕宽高尺寸的三种代码形式 在Android上,目前我知道的获取屏幕尺寸的方法有三种不同的代码形式 方法1.在Activity中最常见的调用方式 WindowManager windowManag ...

  2. 自然语言处理的CNN模型中几种常见的池化方法

    自然语言处理的CNN模型中几种常见的池化方法 本文是在[1]的基础上进行的二次归纳. 0x00 池化(pooling)的作用   首先,回顾一下NLP中基本的CNN模型的卷积和池化的大致原理[2].f ...

  3. JS中几种常见的数组算法(前端面试必看)

    JS中几种常见的数组算法 1.将稀疏数组变成不稀疏数组 /** * 稀疏数组 变为 不稀疏数组 * @params array arr 稀疏数组 * @return array 不稀疏的数组 */ f ...

  4. Spring RestTemplate中几种常见的请求方式

    https://github.com/lenve/SimpleSpringCloud/tree/master/RestTemplate在Spring Cloud中服务的发现与消费一文中,当我们从服务消 ...

  5. Spring RestTemplate中几种常见的请求方式GET请求 POST请求 PUT请求 DELETE请求

    Spring RestTemplate中几种常见的请求方式 原文地址: https://blog.csdn.net/u012702547/article/details/77917939   版权声明 ...

  6. Android中三种超实用的滑屏方式汇总(转载)

    Android中三种超实用的滑屏方式汇总   现如今主流的Android应用中,都少不了左右滑动滚屏这项功能,(貌似现在好多人使用智能机都习惯性的有事没事的左右滑屏,也不知道在干什么...嘿嘿),由于 ...

  7. Android中四种补间动画的使用示例(附代码下载)

    场景 Android中四种补间动画. 透明度渐变动画 旋转动画 缩放动画 平移动画 注: 博客: https://blog.csdn.net/badao_liumang_qizhi关注公众号 霸道的程 ...

  8. Android学习记录(2)—Android中数据库的常见操作

    android中数据库操作是非常常见了,我们会经常用到,操作的方法也有很多种形式,这里我就把最常见的两种形式记录下来了,以备以后用到方便查看.我就不写注释和解释了,因为android数据库的操作和其它 ...

  9. Android的三种主流资源尺寸

    Android三种主流资源屏幕尺寸:QVGA.HVGA.WVGA VGA的分辨率是640x480像素 QVGA(Quarter VGA)就是320x240,即VGA分辨率的1/4 HVGA(Half ...

随机推荐

  1. Firemonkey的旁门左道[五]

    这次讲讲绘制的几种模式吧,不过还是比较浅显,刚接触不久,还实在没这个实力道出个所以来. FMX下,我们可以切换GDI,D2D,GPU这三种模式, 只要通过全局变量就可以轻松搞定. 如何设置 Globa ...

  2. axf、elf文件转换成bin、hex脚本工具

    在嵌入式开发过程中常常遇到将axf或elf文件转换成bin的情况,大家都知道通过gnu toolchain中的objcopy和keil中的fromelf能做到.可是为了这么一个小事而记住复杂的选项以及 ...

  3. innode 节点

    [root@localhost soft]# ls -i tt1 tt2 xx.c [root@localhost soft]# stat tt1 File: `tt1' Size: 4096 Blo ...

  4. JSON 遍历转为Model Bean

    @RequestMapping(value = "/batchAddPageIndexBrand") @ResponseBody public HashMap<String, ...

  5. Python之路,Day18 - 开发一个WEB聊天来撩妹吧

    Python之路,Day18 - 开发一个WEB聊天来撩妹吧   本节内容: 项目实战:开发一个WEB聊天室 功能需求: 用户可以与好友一对一聊天 可以搜索.添加某人为好友 用户可以搜索和添加群 每个 ...

  6. 织梦DedeCMS广告管理模块增加图片上传功能插件

    网站广告后台管理非常方便,但是织梦后台的广告管理模块,发布广告时图片没有上传选项,只能用URL地址,很不方便,那么下面就教大家一个方法实现广告图片后台直接上传,非常方便. 先给大家看下修改后的广告图片 ...

  7. jdbc_odbc SQLserver 驱动安装及测试

    有2次被问到同一个问题,尽管博客园是.net的园子,我还是分享下吧.PS:我现在做的.net,以前学过点java.献丑了. ------------------ 原始邮件 -------------- ...

  8. Design Pattern —— Singleton

    Design Pattern —— Singleton   强力推荐枚举和类级内部类方式实现单例模式 单例模式是开发中非常常用的一种模式,简单的说,我们希望一个类永远都只有一个对象. 主要有两个用途: ...

  9. 使用ol,添加图书销售排行榜

    如果想在网页中展示有前后顺序的信息列表,怎么办呢?如,当当网上的书籍热卖排行榜,如下图所示. 这类信息展示就可以使用<ol>标签来制作有序列表来展示. 语法: <ol> < ...

  10. cas sso单点登录系列7_ 单点登录cas常见问题系列汇总

    转:http://blog.csdn.net/matthewei6/article/details/50709252 单点登录cas常见问题(一) - 子系统是否还要做session处理?单点登录ca ...